【问题标题】:RabbitMq Handle Received message in async wayRabbitMq 以异步方式处理接收到的消息
【发布时间】:2018-06-13 12:02:44
【问题描述】:

我正在使用RabbitMq 来处理我在公共汽车上收到的消息。我想知道是否有更好的方法来处理我收到的消息(可能使用async/await 模式)

这是我的代码的 sn-p

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,据我所知,这不是最佳做法

【问题讨论】:

    标签: c# async-await rabbitmq task


    【解决方案1】:
    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();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多