@@ -27,8 +27,8 @@ namespace HealthMonitor.Service.Resolver | |||||
private readonly TDengineService _serviceTDengine; | private readonly TDengineService _serviceTDengine; | ||||
private readonly BloodPressReferenceValueCacheManager _bpRefValCacheManager; | private readonly BloodPressReferenceValueCacheManager _bpRefValCacheManager; | ||||
private AsyncLocal<string> _messageId = new AsyncLocal<string>(); | |||||
private AsyncLocal<HisGpsBloodPress> _msgData = new AsyncLocal<HisGpsBloodPress>(); | |||||
private AsyncLocal<string> _messageId = new(); | |||||
private AsyncLocal<HisGpsBloodPress> _msgData = new(); | |||||
public BloodpressResolver( | public BloodpressResolver( | ||||
TDengineService serviceDengine, | TDengineService serviceDengine, | ||||
@@ -58,8 +58,7 @@ namespace HealthMonitor.Service.Resolver | |||||
Method= topicHmBloodPress!.Method, | Method= topicHmBloodPress!.Method, | ||||
IsDisplay=topicHmBloodPress!.IsDisplay ? 1 : 0 | IsDisplay=topicHmBloodPress!.IsDisplay ? 1 : 0 | ||||
}; | }; | ||||
Console.WriteLine($"SetResolveInfo" + _messageId.Value); | |||||
// Console.WriteLine($"SetResolveInfo" + _messageId.Value); | |||||
} | } | ||||
public override string ToString() | public override string ToString() | ||||
@@ -70,7 +69,6 @@ namespace HealthMonitor.Service.Resolver | |||||
public async Task ExecuteMessageAsync() | public async Task ExecuteMessageAsync() | ||||
{ | { | ||||
var messageId = _messageId.Value; | var messageId = _messageId.Value; | ||||
Console.WriteLine($"ExecuteMessageAsync" + messageId); | |||||
var bp = _msgData.Value!; | var bp = _msgData.Value!; | ||||
#region 获取个人信息 | #region 获取个人信息 | ||||
@@ -88,6 +86,7 @@ namespace HealthMonitor.Service.Resolver | |||||
if (age < 1 || age > 120) | if (age < 1 || age > 120) | ||||
{ | { | ||||
Console.WriteLine("验证年龄是否在范围 (2 - 120)"); | Console.WriteLine("验证年龄是否在范围 (2 - 120)"); | ||||
return; | |||||
} | } | ||||
#endregion | #endregion | ||||
@@ -1,80 +0,0 @@ | |||||
using HealthMonitor.Service.Resolver; | |||||
using HealthMonitor.Service.Resolver.Interface; | |||||
using Microsoft.Extensions.Logging; | |||||
using System; | |||||
using System.Collections; | |||||
using System.Collections.Concurrent; | |||||
using System.Collections.Generic; | |||||
using System.Linq; | |||||
using System.Text; | |||||
using System.Threading.Tasks; | |||||
namespace HealthMonitor.Service.Sub | |||||
{ | |||||
public class MsgManager | |||||
{ | |||||
private readonly MsgQueueManager _msgQueueManager; | |||||
private readonly BloodpressResolver _resolver; | |||||
private readonly ILogger<MsgManager> _logger; | |||||
private PackageMsgModel _msg = default!; | |||||
public MsgManager(ILogger<MsgManager> logger, BloodpressResolver resolver, MsgQueueManager msgQueueManager) | |||||
{ | |||||
_logger = logger; | |||||
_resolver = resolver; | |||||
_msgQueueManager = msgQueueManager; | |||||
} | |||||
public void EnqueueMsg(PackageMsgModel msg) | |||||
{ | |||||
_msg = msg; | |||||
Console.WriteLine($"GetMsgResolver-{_msg.MessageId}"); | |||||
} | |||||
public IResolver? GetMsgResolver() | |||||
{ | |||||
//if (_msg == null) | |||||
//{ | |||||
// return null; | |||||
//} | |||||
//Console.WriteLine($"GetMsgResolver-{_msg.MessageId}"); | |||||
//_msgQueueManager.TryDequeue(out object obj); | |||||
_msgQueueManager.TryDequeue(out var msg); | |||||
if (msg == null) | |||||
{ | |||||
return null; | |||||
} | |||||
Console.WriteLine($"GetMsgResolver-{msg.MessageId}"); | |||||
_resolver.SetResolveInfo(msg); | |||||
return _resolver; | |||||
} | |||||
//public IReso | |||||
//public IResolver? GetMsgResolver() | |||||
//{ | |||||
// if (_msg == null) | |||||
// { | |||||
// return null; | |||||
// } | |||||
// Console.WriteLine($"GetMsgResolver-{_msg.MessageId}"); | |||||
// _resolver.SetResolveInfo(_msg); | |||||
// _msg = default!; | |||||
// return _resolver; | |||||
//} | |||||
//public IResolver? GetMsgResolver(PackageMsgModel msg) | |||||
//{ | |||||
// if (_msg == null) | |||||
// { | |||||
// return null; | |||||
// } | |||||
// Console.WriteLine($"GetMsgResolver-{_msg.MessageId}"); | |||||
// _resolver.SetResolveInfo(msg); | |||||
// _msg = default!; | |||||
// return _resolver; | |||||
//} | |||||
} | |||||
} |
@@ -1,4 +1,5 @@ | |||||
using HealthMonitor.Service.Resolver; | using HealthMonitor.Service.Resolver; | ||||
using HealthMonitor.Service.Resolver.Interface; | |||||
using Microsoft.Extensions.Logging; | using Microsoft.Extensions.Logging; | ||||
using System; | using System; | ||||
using System.Collections.Concurrent; | using System.Collections.Concurrent; | ||||
@@ -12,9 +13,23 @@ namespace HealthMonitor.Service.Sub | |||||
public class MsgQueueManager: ConcurrentQueue<PackageMsgModel> | public class MsgQueueManager: ConcurrentQueue<PackageMsgModel> | ||||
{ | { | ||||
private readonly ILogger<MsgQueueManager> _logger; | private readonly ILogger<MsgQueueManager> _logger; | ||||
public MsgQueueManager(ILogger<MsgQueueManager> logger) | |||||
private readonly BloodpressResolver _resolver; | |||||
public MsgQueueManager(ILogger<MsgQueueManager> logger, BloodpressResolver resolver) | |||||
{ | { | ||||
_logger = logger; | _logger = logger; | ||||
_resolver = resolver; | |||||
} | |||||
public IResolver? GetMsgResolver() | |||||
{ | |||||
TryDequeue(out var msg); | |||||
if (msg == null) | |||||
{ | |||||
return null; | |||||
} | |||||
_resolver.SetResolveInfo(msg); | |||||
return _resolver; | |||||
} | } | ||||
} | } | ||||
} | } |
@@ -24,12 +24,12 @@ namespace HealthMonitor.Service.Sub | |||||
private readonly ILogger<TDengineDataSubcribe> _logger; | private readonly ILogger<TDengineDataSubcribe> _logger; | ||||
private IConsumer _consumer = default!; | private IConsumer _consumer = default!; | ||||
private IntPtr _conn = default!; | private IntPtr _conn = default!; | ||||
private readonly MsgManager _msgManager; | |||||
private readonly MsgQueueManager _msgQueueManager; | private readonly MsgQueueManager _msgQueueManager; | ||||
private readonly TDengineService _serviceTDengine; | private readonly TDengineService _serviceTDengine; | ||||
private readonly PersonCacheManager _personCacheMgr; | private readonly PersonCacheManager _personCacheMgr; | ||||
private readonly BloodPressReferenceValueCacheManager _bpRefValCacheManager; | private readonly BloodPressReferenceValueCacheManager _bpRefValCacheManager; | ||||
private readonly IResolverFactory _resolverFactory; | private readonly IResolverFactory _resolverFactory; | ||||
private CancellationTokenSource _tokenSource = null; | |||||
private int cnt = 0; | private int cnt = 0; | ||||
@@ -39,7 +39,7 @@ namespace HealthMonitor.Service.Sub | |||||
PersonCacheManager personCacheMgr, | PersonCacheManager personCacheMgr, | ||||
BloodPressReferenceValueCacheManager bpRefValCacheManager, | BloodPressReferenceValueCacheManager bpRefValCacheManager, | ||||
IResolverFactory resolverFactory, | IResolverFactory resolverFactory, | ||||
MsgManager msgManager, | |||||
MsgQueueManager msgQueueManager, | MsgQueueManager msgQueueManager, | ||||
ILogger<TDengineDataSubcribe> logger | ILogger<TDengineDataSubcribe> logger | ||||
) | ) | ||||
@@ -49,7 +49,6 @@ namespace HealthMonitor.Service.Sub | |||||
_bpRefValCacheManager = bpRefValCacheManager; | _bpRefValCacheManager = bpRefValCacheManager; | ||||
_logger = logger; | _logger = logger; | ||||
_resolverFactory = resolverFactory; | _resolverFactory = resolverFactory; | ||||
_msgManager = msgManager; | |||||
_msgQueueManager = msgQueueManager; | _msgQueueManager = msgQueueManager; | ||||
_conn = GetConnection(); | _conn = GetConnection(); | ||||
} | } | ||||
@@ -67,6 +66,11 @@ namespace HealthMonitor.Service.Sub | |||||
//ProcessMsg(consumer); | //ProcessMsg(consumer); | ||||
//防止造成多线程运行 | |||||
_tokenSource?.Cancel(); | |||||
_tokenSource = CancellationTokenSource.CreateLinkedTokenSource(stoppingToken); | |||||
DoTDengineConnect(); | DoTDengineConnect(); | ||||
} | } | ||||
@@ -100,6 +104,7 @@ namespace HealthMonitor.Service.Sub | |||||
TDConnectIp = "47.116.142.20", | TDConnectIp = "47.116.142.20", | ||||
}; | }; | ||||
string topic = "topic_hm_bp_stats"; | string topic = "topic_hm_bp_stats"; | ||||
//nameof(TopicHmBloodPress) | |||||
//create topic | //create topic | ||||
IntPtr res = TDengine.Query(Connection, $"create topic if not exists {topic} as select * from health_monitor.hm_bloodpress"); | IntPtr res = TDengine.Query(Connection, $"create topic if not exists {topic} as select * from health_monitor.hm_bloodpress"); | ||||
@@ -115,7 +120,7 @@ namespace HealthMonitor.Service.Sub | |||||
// subscribe | // subscribe | ||||
consumer.Subscribe(topic); | consumer.Subscribe(topic); | ||||
while (true) | |||||
while (!_tokenSource.IsCancellationRequested) | |||||
{ | { | ||||
var consumeRes = consumer.Consume(300); | var consumeRes = consumer.Consume(300); | ||||
foreach (KeyValuePair<TopicPartition, TaosResult> kv in consumeRes.Message) | foreach (KeyValuePair<TopicPartition, TaosResult> kv in consumeRes.Message) | ||||
@@ -125,45 +130,6 @@ namespace HealthMonitor.Service.Sub | |||||
{ | { | ||||
if (((i + 1) % kv.Value.Metas.Count == 0)) | if (((i + 1) % kv.Value.Metas.Count == 0)) | ||||
{ | { | ||||
//string bloodpress_id = SafeType.SafeString(kv.Value.Datas[i - 8]); | |||||
//string message_id = SafeType.SafeString(kv.Value.Datas[i - 7]); | |||||
//string serialno = SafeType.SafeString(kv.Value.Datas[i - 6]); | |||||
//int systolic_value = SafeType.SafeInt(kv.Value.Datas[i - 5]); | |||||
//int diastolic_value = SafeType.SafeInt(kv.Value.Datas[i - 4]); | |||||
//DateTime create_time = DateTimeUtil.GetDateTimeFromUnixTimeMilliseconds(SafeType.SafeInt64(kv.Value.Datas[i - 3]) / 1000000); | |||||
//DateTime last_update = DateTimeUtil.GetDateTimeFromUnixTimeMilliseconds(SafeType.SafeInt64(kv.Value.Datas[i - 2]) / 1000000); | |||||
//int method = SafeType.SafeInt(kv.Value.Datas[i - 1]); | |||||
//bool is_display = SafeType.SafeBool(kv.Value.Datas[i]); | |||||
//IDictionary<string, object> row = new Dictionary<string, object>(); | |||||
//foreach (var meta in kv.Value.Metas) | |||||
//{ | |||||
// int index = i-(kv.Value.Metas.Count-kv.Value.Metas.IndexOf(meta)-1); | |||||
// //var value = kv.Value.Datas[index]; | |||||
// row.Add(meta.name, kv.Value.Datas[index]); | |||||
//} | |||||
//var body2 = JsonConvert.SerializeObject(row); | |||||
//kv.Value.Metas.ForEach(meta => | |||||
//{ | |||||
// Console.Write("{0} {1}({2}) \t|", meta.name, meta.TypeName(), meta.size); | |||||
//}); | |||||
//HisGpsBloodPress bp = new() | |||||
//{ | |||||
// BloodPressId = bloodpress_id, | |||||
// MessageId = message_id, | |||||
// Serialno = serialno, | |||||
// SystolicValue = systolic_value, | |||||
// DiastolicValue = diastolic_value, | |||||
// CreateTime = create_time, | |||||
// LastUpdate = last_update, | |||||
// Method = method, | |||||
// IsDisplay = is_display ? 1 : 0, | |||||
//}; | |||||
try | try | ||||
{ | { | ||||
@@ -193,9 +159,12 @@ namespace HealthMonitor.Service.Sub | |||||
} | } | ||||
consumer.Commit(consumeRes); | consumer.Commit(consumeRes); | ||||
Console.WriteLine("consumer.Commit"); | |||||
Console.WriteLine("监听中...."); | |||||
} | } | ||||
// close consumer after use.Otherwise will lead memory leak. | |||||
_consumer.Close(); | |||||
TDengine.Close(_conn); | |||||
} | } | ||||
@@ -203,10 +172,10 @@ namespace HealthMonitor.Service.Sub | |||||
public void ParsePackage(ReceiveMessageModel model) | public void ParsePackage(ReceiveMessageModel model) | ||||
{ | { | ||||
var msg = _resolverFactory.ParseAndWrap(model); | var msg = _resolverFactory.ParseAndWrap(model); | ||||
Console.WriteLine("msg"); | |||||
cnt++; | |||||
Console.WriteLine(cnt); | |||||
Console.WriteLine(msg!.MessageId); | |||||
//Console.WriteLine("msg"); | |||||
//cnt++; | |||||
//Console.WriteLine(cnt); | |||||
//Console.WriteLine(msg!.MessageId); | |||||
if (msg == null) return; | if (msg == null) return; | ||||
// ConcurrentQueue<ReceiveMessageModel> messageQueue = new ConcurrentQueue<ReceiveMessageModel>(); | // ConcurrentQueue<ReceiveMessageModel> messageQueue = new ConcurrentQueue<ReceiveMessageModel>(); | ||||
//_msgManager.EnqueueMsg(msg!); | //_msgManager.EnqueueMsg(msg!); | ||||
@@ -8,26 +8,24 @@ namespace HealthMonitor.WebApi | |||||
public class PackageProcess : IDisposable | public class PackageProcess : IDisposable | ||||
{ | { | ||||
private readonly ILogger<PackageProcess> _logger; | private readonly ILogger<PackageProcess> _logger; | ||||
private readonly MsgQueueManager _msgQueueManager; | |||||
private readonly MsgManager _msgManager; | |||||
public PackageProcess(ILogger<PackageProcess> logger, MsgManager msgManager) | |||||
public PackageProcess(ILogger<PackageProcess> logger, MsgQueueManager msgQueueManager) | |||||
{ | { | ||||
_logger = logger; | _logger = logger; | ||||
_msgManager = msgManager; | |||||
_msgQueueManager = msgQueueManager; | |||||
} | } | ||||
public async Task<bool> ResolveAsync() | public async Task<bool> ResolveAsync() | ||||
{ | { | ||||
// ConcurrentQueue<Message> messageQueue = new ConcurrentQueue<Message>(); | |||||
var resolver = _msgManager.GetMsgResolver(); | |||||
var resolver = _msgQueueManager.GetMsgResolver(); | |||||
try | try | ||||
{ | { | ||||
if (resolver != null) | if (resolver != null) | ||||
{ | { | ||||
// resolver.SetResolveInfo(); | |||||
await resolver.ExecuteMessageAsync().ConfigureAwait(false); | await resolver.ExecuteMessageAsync().ConfigureAwait(false); | ||||
} | } | ||||
@@ -173,7 +173,6 @@ namespace HealthMonitor.WebApi | |||||
builder.Services | builder.Services | ||||
.AddSingleton<TDengineDataSubcribe>() | .AddSingleton<TDengineDataSubcribe>() | ||||
.AddSingleton<MsgManager>() | |||||
.AddHostedService<Worker>(); | .AddHostedService<Worker>(); | ||||
#endregion | #endregion | ||||