繁体   English   中英

RabbitMq以异步方式处理收到的消息

[英]RabbitMq Handle Received message in async way

我正在使用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 ,据我所知,这不是最佳实践

static async Task Main(string[] args)
{
    var connectionFactory = new ConnectionFactory(DispatchConsumersAsync = true);
    var connection = connectionFactory.CreateConnection();
    var channel = connection.CreateModel();

    var consumer = new AsyncEventingBasicConsumer(channel);
    consumer.Received += Consumer_Received;
}

static async Task Consumer_Received(object sender, BasicDeliverEventArgs @event)
{
    await DoSomethingAsync();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM