c# - RabbitMq 以异步方式处理接收到的消息

标签 c# async-await rabbitmq task

我正在使用 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();
}

关于c# - RabbitMq 以异步方式处理接收到的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50836811/

相关文章:

node.js - 使用 async wait 执行多个数据库查询

javascript - 将异步函数作为回调传递会导致错误堆栈跟踪丢失

c# - 将消息插入到 RabbitMQ 中的特定队列

java - Rabbitmq 连接在本地主机上突然关闭

c# - 无法将类型 System.Collections.Generic.List<Derived DataClass> 隐式转换为 System.Collections.Generic.List<BaseD dataClass>

c# - LINQ to SQL 到 LINQ to Objects - 通过 AsEnumerable 或通过 ToList 切换

c# - 自动复制多张图片并显示磁贴通知?

c# - 以编程方式访问谷歌浏览器历史记录

Javascript Promise 对象无法与 Promise.all 异步工作

ruby-on-rails - Ruby on Rails log4r 和rabbitMQ 自定义输出器