Files
simapi-net/Synapse/EventServer.cs
T

50 lines
2.1 KiB
C#
Raw Permalink Normal View History

2023-10-20 12:33:18 +08:00
using System;
using System.Linq;
using System.Text;
using System.Text.Json;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using RabbitMQ.Client.Events;
2023-10-23 17:39:27 +08:00
using SimApi.Helpers;
2023-10-20 12:33:18 +08:00
namespace SimApi;
public partial class Synapse
{
private void RunEventServer()
{
EventServerChannel = CreateChannel(Options.EventProcessorNum, "EventServer");
var queue = $"{Options.SysName}_{Options.AppName}_event";
EventServerChannel.QueueDeclare(queue, true, false, true, null);
foreach (var ev in EventRegistry.Where(ev => !ev.Key.Contains('*') && !ev.Key.Contains('#')))
{
EventServerChannel.QueueBind(queue, Options.SysName, $"event.{ev.Key}", null);
}
var consumer = new EventingBasicConsumer(EventServerChannel);
consumer.Received += (ch, ea) =>
{
var reqBody = Encoding.UTF8.GetString(ea.Body.ToArray());
Logger.LogDebug("Event Receive: {BasicPropertiesReplyTo}.{BasicPropertiesType}\n{S}",
ea.BasicProperties.ReplyTo, ea.BasicProperties.Type, reqBody);
var key = ea.RoutingKey.Replace("event.", string.Empty);
var method = EventRegistry.FirstOrDefault(x => x.Key == key);
2023-10-20 14:13:53 +08:00
var callClass = Sp.CreateScope().ServiceProvider.GetRequiredService(method.Class);
var mt = callClass.GetType().GetMethod(method.Method);
var pt = mt.GetParameters()[0].ParameterType;
try
2023-10-20 12:33:18 +08:00
{
2023-10-20 14:13:53 +08:00
mt.Invoke(callClass, pt == typeof(string)
? new object[] { reqBody }
2023-10-23 17:39:27 +08:00
: new[] { JsonSerializer.Deserialize(reqBody, pt, SimApiUtil.JsonOption) });
2023-10-20 14:13:53 +08:00
EventServerChannel.BasicAck(ea.DeliveryTag, false);
}
catch (Exception e)
{
2023-10-20 15:29:32 +08:00
Logger.LogError("Event Processor Error: {Err}", e.InnerException);
2023-10-20 14:13:53 +08:00
EventServerChannel.BasicNack(ea.DeliveryTag, false, false);
2023-10-20 12:33:18 +08:00
}
};
2023-10-20 14:13:53 +08:00
EventServerChannel.BasicConsume(queue, false, "", false, false, null, consumer);
2023-10-20 12:33:18 +08:00
}
}