|
- using GpsCardGatewayPosition.Model.Config;
- using Microsoft.Extensions.Logging;
- using Microsoft.Extensions.Options;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using TelpoDataService.Util.Clients;
- using TelpoDataService.Util.Entities.GpsCard;
- using TelpoDataService.Util.Models;
- using TelpoDataService.Util.QueryObjects;
- using TelpoDataService.Util;
- using GpsCardGatewayPosition.Model.Cache;
-
- namespace GpsCardGatewayPosition.Service.Cache
- {
- public class PersonCacheManager
- {
- private const int DEFAULT_DURATION_SECONDS = 1200;
-
- private const string CACHE_KEY_PERSON = "Person_";
-
- private const string CACHE_HASH_KEY_GPSDEVICEPERSON = "#GPSDEVICE_PERSON_HASH";
-
- private readonly ServiceConfig _configService;
- private readonly GpsCardAccessorClient<GpsPerson> _personApiClient;
- private readonly ILogger<PersonCacheManager> _logger;
- private readonly IOptions<RedisConfig> _optConfigRedis;
-
- public PersonCacheManager(IOptions<ServiceConfig> optConfigService, GpsCardAccessorClient<GpsPerson> personApiClient,
- ILogger<PersonCacheManager> logger, IOptions<RedisConfig> optConfigRedis)
- {
- _configService = optConfigService.Value;
- _optConfigRedis = optConfigRedis;
- _personApiClient = personApiClient;
- _logger = logger;
- }
-
- public async Task<GpsPerson> GetPersonBySerialNoAsync(string messageId, string sn)
- {
- string key = CACHE_KEY_PERSON + sn;
- var person = await RedisHelper.GetAsync<GpsPerson>(key).ConfigureAwait(false);
- if (person == null)
- {
- try
- {
- string url = _configService.TelpoDataUrl;
- var param = new GeneralParam
- {
- Filters = new List<QueryFilterCondition>
- {
- new QueryFilterCondition
- {
- Key=nameof(GpsPerson.Serialno),
- Value=sn,
- ValueType=QueryValueTypeEnum.String,
- Operator=QueryOperatorEnum.Equal
- }
- }
- };
-
- person = await _personApiClient.GetFirstAsync(param, new RequestHeader { RequestId = messageId }).ConfigureAwait(false);
- if (person != null)
- {
- RedisHelper.SetAsync(key, person, DEFAULT_DURATION_SECONDS);
- }
- }
- catch (Exception ex)
- {
- _logger.LogError($"获取查询使用者并更新缓存发生异常:{ex.Message}, {ex.StackTrace}");
- }
- }
- return person;
- }
-
-
-
-
-
-
-
- public async Task<GpsDevicePerson> GetDeviceGpsPersonCacheBySerialNoAsync(string messageId, string sn)
- {
- if (string.IsNullOrWhiteSpace(sn)) return null;
-
-
-
-
-
- try
- {
-
-
-
-
-
-
- var person = await RedisHelperDb7.HGetAsync<GpsDevicePerson>(CACHE_HASH_KEY_GPSDEVICEPERSON, sn);
- return person;
-
- }
- catch (Exception ex)
- {
- _logger.LogWarning($"Redis发生异常,将直接读取MySQL数据库,构造新实例:{ex.Message}, {ex.StackTrace}");
- var param = new GeneralParam
- {
- Filters = new List<QueryFilterCondition>
- {
- new QueryFilterCondition
- {
- Key=nameof(GpsPerson.Serialno),
- Value=sn,
- ValueType=QueryValueTypeEnum.String,
- Operator=QueryOperatorEnum.Equal
- }
- }
- };
- var person = await _personApiClient.GetFirstAsync(param, new RequestHeader { RequestId = messageId }).ConfigureAwait(false);
-
- return new GpsDevicePerson
- {
- Time = DateTime.Now,
- Person = new Person
- {
- DeviceId = person.DeviceId,
- PersonId = person.PersonId,
- Remarks = person.Remarks,
- SerialNo = person.Serialno
- }
- };
- }
-
-
- }
- }
- }
|