|
@@ -1,33 +1,35 @@
|
|
|
using EVCB_OCPP.DBAPI.Services.DbService;
|
|
|
using EVCB_OCPP.Domain.Models.MainDb;
|
|
|
-using ServiceStack;
|
|
|
-using ServiceStack.Redis;
|
|
|
+using Newtonsoft.Json;
|
|
|
+using NRedisStack.RedisStackCommands;
|
|
|
+using Quartz.Impl.AdoJobStore.Common;
|
|
|
+using StackExchange.Redis;
|
|
|
+using System.Collections.Generic;
|
|
|
+using static System.Runtime.InteropServices.JavaScript.JSType;
|
|
|
|
|
|
namespace EVCB_OCPP.DBAPI.Services.ServerMessageServices;
|
|
|
|
|
|
public class RedisServerMessageService : IServerMessageService
|
|
|
{
|
|
|
+ private const string ServerMessageCntKey = "ServerMessageCntKey";
|
|
|
+ private const string ServerMessageObjectPrefix = "ServerMessageObjectPrefix_";
|
|
|
+ private string ServerMessageObjectPattern => "ServerMessageObjectPrefix_*";
|
|
|
+
|
|
|
private readonly IMainDbService mainDbService;
|
|
|
- private readonly IRedisClientsManager redisClientsManager;
|
|
|
+ private readonly IDatabase redisDatabase;
|
|
|
+ private readonly IServer redisServer;
|
|
|
|
|
|
public RedisServerMessageService(
|
|
|
IMainDbService mainDbService,
|
|
|
- IRedisClientsManager redisClientsManager
|
|
|
- )
|
|
|
+ IDatabase redisDatabase,
|
|
|
+ IServer redisServer)
|
|
|
{
|
|
|
this.mainDbService = mainDbService;
|
|
|
- this.redisClientsManager = redisClientsManager;
|
|
|
+ this.redisDatabase = redisDatabase;
|
|
|
+ this.redisServer = redisServer;
|
|
|
}
|
|
|
|
|
|
- public async Task<string> AddServerMessage(
|
|
|
- string ChargeBoxId,
|
|
|
- string OutAction,
|
|
|
- string OutRequest,
|
|
|
- string CreatedBy,
|
|
|
- DateTime? CreatedOn = null,
|
|
|
- string SerialNo = "",
|
|
|
- string InMessage = "",
|
|
|
- CancellationToken token = default)
|
|
|
+ public async ValueTask<string> AddServerMessage(string ChargeBoxId, string OutAction, string OutRequest, string CreatedBy, DateTime? CreatedOn = null, string SerialNo = "", string InMessage = "", CancellationToken token = default)
|
|
|
{
|
|
|
if (string.IsNullOrEmpty(SerialNo))
|
|
|
{
|
|
@@ -53,37 +55,77 @@ public class RedisServerMessageService : IServerMessageService
|
|
|
return SerialNo;
|
|
|
}
|
|
|
|
|
|
- public async Task<List<ServerMessage>> GetNeedSendToClientServerMessages()
|
|
|
+ public async ValueTask<List<ServerMessage>> GetNeedSendToClientServerMessages()
|
|
|
{
|
|
|
var allServerMessage = await GetServerMessages();
|
|
|
DateTime startDt = DateTime.UtcNow.AddSeconds(-30);
|
|
|
|
|
|
var seperatedServerMessage = allServerMessage.GroupBy(x => x.CreatedOn < startDt).ToDictionary(x => x.Key, x => x?.ToList());
|
|
|
- var deprecatedServerMessage = seperatedServerMessage.GetValueOrDefault(true, null);
|
|
|
+ var deprecatedServerMessages = seperatedServerMessage.GetValueOrDefault(true, null);
|
|
|
|
|
|
- if (deprecatedServerMessage is not null)
|
|
|
+ if (deprecatedServerMessages is not null)
|
|
|
{
|
|
|
- var deprecatedServerMessageIds = deprecatedServerMessage.Select(x => x.Id);
|
|
|
- await RemoveFromRedis(deprecatedServerMessageIds);
|
|
|
+ var deprecatedServerMessageIds = deprecatedServerMessages.Select(x => x.Id);
|
|
|
+ await RemoveFromRedis(deprecatedServerMessages);
|
|
|
|
|
|
- foreach (var servermessage in deprecatedServerMessage)
|
|
|
+ foreach (var servermessage in deprecatedServerMessages)
|
|
|
{
|
|
|
_ = AddServerMessageToDbAsync(servermessage);
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- return seperatedServerMessage.GetValueOrDefault(false, new List<ServerMessage>())!;
|
|
|
+ var toReturn = seperatedServerMessage.GetValueOrDefault(false, new List<ServerMessage>())!;
|
|
|
+
|
|
|
+ if (allServerMessage.Count > 0)
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ if (toReturn.Count > 0)
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+ return toReturn;
|
|
|
}
|
|
|
|
|
|
- public async Task<bool> SetServerMessageResponseReceived(int id, string InMessage = "", DateTime ReceivedOn = default)
|
|
|
+ public async ValueTask<List<ServerMessage>> GetServerMessages()
|
|
|
+ {
|
|
|
+ //var msgs = await redisDatabase.SortedSetRangeByScoreAsync(ServerMessageSetsKey);
|
|
|
+ var keys = redisServer.Keys(pattern: ServerMessageObjectPattern);
|
|
|
+ var msgs = redisDatabase.StringGet(keys.ToArray());
|
|
|
+ List<ServerMessage> toReturn = new List<ServerMessage>();
|
|
|
+ foreach (var msg in msgs)
|
|
|
+ {
|
|
|
+ try
|
|
|
+ {
|
|
|
+ var result = JsonConvert.DeserializeObject<ServerMessage>(msg);
|
|
|
+ toReturn.Add(result);
|
|
|
+ }
|
|
|
+ catch(Exception e)
|
|
|
+ {
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return toReturn;
|
|
|
+ }
|
|
|
+
|
|
|
+ public ValueTask SaveCompletedMessageToDb()
|
|
|
+ {
|
|
|
+ return ValueTask.CompletedTask;
|
|
|
+ }
|
|
|
+
|
|
|
+ public async ValueTask<bool> SetServerMessageResponseReceived(int id, string InMessage = "", DateTime ReceivedOn = default)
|
|
|
{
|
|
|
DateTime _ReceivedOn = ReceivedOn == default ? DateTime.UtcNow : ReceivedOn;
|
|
|
|
|
|
- IRedisClientAsync redisClient = await redisClientsManager.GetClientAsync();
|
|
|
- var redisServerMessage = redisClient.As<ServerMessage>();
|
|
|
- var msg = await redisServerMessage.GetByIdAsync(id);
|
|
|
- await redisServerMessage.DeleteByIdAsync(id);
|
|
|
- await redisClient.DisposeAsync();
|
|
|
+ var key = GetKeyById(id);
|
|
|
+ var redisValue = redisDatabase.StringGet(key);
|
|
|
+ redisDatabase.KeyDelete(key);
|
|
|
+ //var redisServerMessages = provider.RedisCollection<ServerMessage>();
|
|
|
+ //var msgs = await redisDatabase.SortedSetRangeByScoreAsync(ServerMessageSetsKey, id, id);
|
|
|
+ //var removedCnt = await redisDatabase.SortedSetRemoveAsync(ServerMessageSetsKey, msgs);
|
|
|
+
|
|
|
+ var msg = JsonConvert.DeserializeObject<ServerMessage>(redisValue);
|
|
|
|
|
|
msg.Id = 0;
|
|
|
msg.InMessage = InMessage;
|
|
@@ -93,35 +135,60 @@ public class RedisServerMessageService : IServerMessageService
|
|
|
return !string.IsNullOrEmpty(addServerMessageResult);
|
|
|
}
|
|
|
|
|
|
- public async Task<bool> SetServerMessageServerHandling(int id, DateTime UpdatedOn = default)
|
|
|
+ public async ValueTask<bool> SetServerMessageServerHandling(int id, DateTime UpdatedOn = default)
|
|
|
{
|
|
|
DateTime _UpdatedOn = UpdatedOn == default ? DateTime.UtcNow : UpdatedOn;
|
|
|
|
|
|
- IRedisClientAsync redisClient = await redisClientsManager.GetClientAsync();
|
|
|
- var redisServerMessage = redisClient.As<ServerMessage>();
|
|
|
- var msg = await redisServerMessage.GetByIdAsync(id);
|
|
|
+ var key = GetKeyById(id);
|
|
|
+ //var msgs = await redisDatabase.SortedSetRangeByScoreAsync(ServerMessageSetsKey, id, id);
|
|
|
+ //var removedCnt = await redisDatabase.SortedSetRemoveAsync(ServerMessageSetsKey, msgs);
|
|
|
+ //var redisMsg = msgs.FirstOrDefault();
|
|
|
+ var redisMsg = redisDatabase.StringGet(key);
|
|
|
+ var msg = JsonConvert.DeserializeObject<ServerMessage>(redisMsg);
|
|
|
|
|
|
msg.UpdatedOn = _UpdatedOn;
|
|
|
|
|
|
- await redisServerMessage.StoreAsync(msg);
|
|
|
- await redisClient.DisposeAsync();
|
|
|
+ redisDatabase.StringSet(key, JsonConvert.SerializeObject(msg));
|
|
|
+
|
|
|
+ //await redisDatabase.SortedSetAddAsync(ServerMessageSetsKey, JsonConvert.SerializeObject(msg), id);
|
|
|
+
|
|
|
return true;
|
|
|
}
|
|
|
|
|
|
- public async Task<List<ServerMessage>> GetServerMessages()
|
|
|
+ private async ValueTask StoreIntoRedis(ServerMessage data)
|
|
|
+ {
|
|
|
+ data.Id = await GetNextIndex();
|
|
|
+ var key = GetKeyById(data.Id);
|
|
|
+
|
|
|
+ redisDatabase.StringSet(key, JsonConvert.SerializeObject(data));
|
|
|
+
|
|
|
+ //var result = await redisDatabase.SortedSetAddAsync(ServerMessageSetsKey, JsonConvert.SerializeObject(data), data.Id);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ private async Task<int> GetNextIndex()
|
|
|
{
|
|
|
- IRedisClientAsync redisClient = await redisClientsManager.GetClientAsync();
|
|
|
- var allMessages = await redisClient.As<ServerMessage>().GetAllAsync();
|
|
|
- await redisClient.DisposeAsync();
|
|
|
- return allMessages?.ToList();
|
|
|
+ var index = await redisDatabase.StringIncrementAsync(ServerMessageCntKey);
|
|
|
+ return (int)index;
|
|
|
}
|
|
|
|
|
|
- public Task SaveCompletedMessageToDb()
|
|
|
+ private async Task RemoveFromRedis(IEnumerable<ServerMessage> datas)
|
|
|
{
|
|
|
- return Task.CompletedTask;
|
|
|
+ //RedisValue[] ids = Array.ConvertAll(datas.Select(x => x.Id).ToArray() , x => (RedisValue)x);
|
|
|
+ var ids = datas.Select(x => GetKeyById(x.Id));
|
|
|
+
|
|
|
+
|
|
|
+ foreach (var id in ids)
|
|
|
+ {
|
|
|
+ //var deletedCnts = await redisDatabase.SortedSetRemoveRangeByScoreAsync(ServerMessageSetsKey, id, id);
|
|
|
+
|
|
|
+ //redisDatabase.StringGetDelete(id);
|
|
|
+ redisDatabase.KeyDelete(id);
|
|
|
+ }
|
|
|
+ return;
|
|
|
}
|
|
|
|
|
|
- private async Task<int> AddServerMessageToDbAsync(ServerMessage message)
|
|
|
+ private async ValueTask<int> AddServerMessageToDbAsync(ServerMessage message)
|
|
|
{
|
|
|
var memMessageId = message.Id;
|
|
|
var addServerMessageResult = await mainDbService.AddServerMessage(message);
|
|
@@ -132,25 +199,8 @@ public class RedisServerMessageService : IServerMessageService
|
|
|
return -1;
|
|
|
}
|
|
|
|
|
|
- private async Task StoreIntoRedis(ServerMessage data)
|
|
|
- {
|
|
|
- await using IRedisClientAsync redisClient = await redisClientsManager.GetClientAsync();
|
|
|
- var redisServerMessage = redisClient.As<ServerMessage>();
|
|
|
- data.Id = (int)await redisServerMessage.GetNextSequenceAsync();
|
|
|
- await redisServerMessage.StoreAsync(data);
|
|
|
- }
|
|
|
-
|
|
|
- private async Task RemoveFromRedis(int id)
|
|
|
- {
|
|
|
- await using IRedisClientAsync redisClient = await redisClientsManager.GetClientAsync();
|
|
|
- var redisServerMessage = redisClient.As<ServerMessage>();
|
|
|
- await redisServerMessage.DeleteByIdAsync(id);
|
|
|
- }
|
|
|
-
|
|
|
- private async Task RemoveFromRedis(IEnumerable<int> ids)
|
|
|
+ private string GetKeyById(int id)
|
|
|
{
|
|
|
- await using IRedisClientAsync redisClient = await redisClientsManager.GetClientAsync();
|
|
|
- var redisServerMessage = redisClient.As<ServerMessage>();
|
|
|
- await redisServerMessage.DeleteByIdsAsync(ids);
|
|
|
+ return ServerMessageObjectPattern.Replace("*", id.ToString());
|
|
|
}
|
|
|
}
|