【问题标题】:How to send acknowledgment (Consumer) in RabbitMQ externally?如何在 RabbitMQ 中向外部发送确认(消费者)?
【发布时间】:2021-06-12 14:04:06
【问题描述】:

我有一个应用程序,它向 RMQ 代理发送消息,如下所示:

 var connectionFactory = new ConnectionFactory()
            {
               HostName = "localhost"
            };

            using (var connection = connectionFactory.CreateConnection())
            {
                using (var channel = connection.CreateModel())
                {
                    channel.QueueDeclare("demo",
                        durable:true,
                        exclusive:false,
                        autoDelete:false,
                        arguments:null);

                    Console.WriteLine("Click enters to send random case Id");
                    do
                    {
                        Console.ReadLine();
                        var message = new {CaseId = new Random().Next()};
                        var body = Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(message));

                        channel.BasicPublish("", "demo", null, body);
                        Console.WriteLine("Successfully send message.");
                    } while (true);

                }
            }

消息发送成功。

还有另一个应用程序称为消费者应用程序。

代码如下:

private void InitiateRabbitMq()
        {
            var connectionFactory = new ConnectionFactory()
            {
                HostName = "localhost"
            };

            var connection = connectionFactory.CreateConnection();
            var channel = connection.CreateModel();

            MessageHandler messageReceiver = new MessageHandler(channel);
            channel.BasicConsume("demo", false, messageReceiver);

        }

消息处理程序是:

public class MessageHandler : DefaultBasicConsumer
    {
        private readonly IModel _channel;
        public MessageHandler(IModel channel)
        {
            _channel = channel;
        }

        public override async void HandleBasicDeliver(string consumerTag, ulong deliveryTag, bool redelivered, string exchange, string routingKey,
            IBasicProperties properties, ReadOnlyMemory<byte> body)
        {
            var message = JsonConvert.DeserializeObject(Encoding.UTF8.GetString(body.ToArray()));

            _processor.process(message);
        }


    }

这是另一个类的过程方法部分:

client.BeginTransfer(transfer,
                                       HandleUploadProgressChanged,
                                       HandleUploadComplete,
                                       HandleUploadInterrupted,
                                       HandleUploadCancelled,
                                       3600,
                                       UploadFilesFinishedCallback);

一旦开始传输完成。它调用了 UploadFilesFinishedCallback 。我想用这种方法承认。我该怎么做?

【问题讨论】:

    标签: c# rabbitmq delegates


    【解决方案1】:

    这是您确认消息的方式:

    channel.BasicAck(deliveryTag, false);
    

    所以这意味着你的函数“UploadFilesFinishedCallback”必须有deliveryTag

    ==> 这意味着您的“流程”函数也必须具有 deliveryTag(目前仅获取消息内容)

    解决方案: 向函数“process”和函数“UploadFilesFinishedCallback”添加新参数“deliveryTag”

    你可以像这样在回调中使用它:

    client.BeginTransfer(transfer,
                   HandleUploadProgressChanged,
                   HandleUploadComplete,
                   HandleUploadInterrupted,
                   HandleUploadCancelled,
                   3600,
                   () => { UploadFilesFinishedCallback(deliveryTag) });
    

    (取决于回调函数的签名)

    【讨论】:

      猜你喜欢
      • 2018-04-16
      • 2018-04-12
      • 1970-01-01
      • 1970-01-01
      • 2013-08-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-18
      • 1970-01-01
      相关资源
      最近更新 更多