Я использую 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
, что, насколько я знаю, не является лучшей практикой.