Я использую RabbitMq
для обработки сообщений, полученных на шине.Мне было интересно, есть ли лучший способ обработать полученное сообщение (возможно, с использованием шаблона async/await
)
Вот фрагмент моего кода
connection = connectionFactory.CreateConnection();
channel = connection.CreateModel();
channel.QueueDeclare(queue: Constants.RabbitListeningQueue,durable: false,exclusive: false,autoDelete: false,arguments: null);
channel.QueueDeclare(queue: Constants.RabbitMqRequestInsertedQueue,durable: false,exclusive: false,autoDelete: false,arguments: null);
var consumer = new EventingBasicConsumer(channel);
consumer.Received += (model, ea) =>
{
log.Debug($"[x] Received message :{ea}");
var body = ea.Body;
var message = Encoding.UTF8.GetString(body);
var dynamicObject = JObject.Parse(message);
queueMessageHandler.HandleMessage(dynamicObject);
};
Реализация queueMessageHandler
выглядит так:следует
public class QueueMessageHandler : IQueueMessageHandler
{
private readonly IImportNucleoManager importNucleoManager;
public QueueMessageHandler(IImportNucleoManager importNucleoManager)
{
this.importNucleoManager = importNucleoManager;
}
public void HandleMessage(dynamic message)
{
switch ((string)message.Type)
{
case "T1":
{
importNucleoManager.Process(message);
break;
}
case "T3":
importNucleoManager.ProceedToInsertStep(message);
break;
}
}
}
Мне было интересно (поскольку обработка событий T1 / T3 занимает много времени) должны ли они быть Task
, и поэтому даже HandleMessage
должно быть HandleMessageAsync
?В этом случае я также должен пройти async void
, что, как я знаю, не лучшая практика