如何解决如何在RabbitMQ外部发送确认消费者?
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 。我想在这个方法中承认。我该怎么做?
解决方法
这是您确认消息的方式:
channel.BasicAck(deliveryTag,false);
所以这意味着你的函数“UploadFilesFinishedCallback”必须有deliveryTag
==> 这意味着您的“流程”功能也必须具有 deliveryTag(目前仅获取消息内容)
解决办法: 向函数“process”和函数“UploadFilesFinishedCallback”添加新参数“deliveryTag”
你可以像这样在回调中使用它:
client.BeginTransfer(transfer,HandleUploadProgressChanged,HandleUploadComplete,HandleUploadInterrupted,HandleUploadCancelled,3600,() => { UploadFilesFinishedCallback(deliveryTag) });
(取决于回调函数的签名)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。