using MasstransferCommon.Utils; using MasstransferCommunicate.Process.Client; using MasstransferCommunicate.Process.Model; using Serilog; namespace MasstransferCommunicate.Process.Service; /// /// 进程间通讯器 /// public class ProcessCommunicator { private static readonly Dictionary>> Subscribers = new(); private static ProcessHelper? _helper; /// /// 连接到服务端 /// public static async Task Connect() { _helper = await ProcessHelper.CreateClient("Masstransfer"); _helper.MessageReceived += HandleMessageReceived; } /// /// 订阅某个主题 /// /// /// public static Task Subscribe(string topic, Action @delegate) { if (!Subscribers.ContainsKey(topic)) { Subscribers.Add(topic, []); } Subscribers[topic].Add(@delegate); return Task.FromResult(true); } /// /// 发送消息 /// /// /// public static async Task Send(string topic, T message) { await _helper?.SendMessageAsync(JsonUtil.ToJson(new Message(topic, message)))!; return true; } /// /// 处理接收到的消息 /// /// private static void HandleMessageReceived(string? message) { if (message == null) return; Console.WriteLine($"收到来自服务端的消息: {message}"); var dictionary = JsonUtil.ToDictionary(message); if (dictionary == null) return; var topic = dictionary["Topic"] as string; var data = dictionary["Data"]; if (!Subscribers.TryGetValue(topic, out var subscribers)) return; foreach (var subscriber in subscribers) { try { // 通知订阅者 subscriber(JsonUtil.ToJson(data)); } catch (Exception exception) { Log.Error(exception, "订阅主题 {Topic} 时发生错误", topic); } } } }