C# 获取单个消息的发布者确认
我有一个producer,每当通过API调用接收到消息时,它都会排队,我只想在确认代理接收到消息后返回 我通过publisher-confirms了解了如何做到这一点-C# 获取单个消息的发布者确认,c#,.net-core,rabbitmq,C#,.net Core,Rabbitmq,我有一个producer,每当通过API调用接收到消息时,它都会排队,我只想在确认代理接收到消息后返回 我通过publisher-confirms了解了如何做到这一点- using (var connection = factory.CreateConnection()) { using(var channel = connection.CreateModel()) {
using (var connection = factory.CreateConnection())
{
using(var channel = connection.CreateModel())
{
channel.ExchangeDeclare(exchangeName, "topic", true, false, null);
//This enables producer confirm
channel.ConfirmSelect();
var properties = channel.CreateBasicProperties();
properties.Persistent = true;
var body = Encoding.UTF8.GetBytes(message);
channel.BasicPublish(exchangeName, topic, properties, body);
channel.WaitForConfirms();
Console.WriteLine("I sent a message !", message);
}
}
我的问题是,我不想等待所有的确认,只想等待与此特定消息相关的确认。我不想将此限制为单个线程/工作线程,也不想等待所有事情的确认
用于js的rabbit库使用回调函数,这非常适合我使用——但C版本似乎不支持它
我的问题是,我不想等待所有的确认,只想等待与此特定消息相关的确认
您应该订阅basicaks
回调,并使用该回调将确认与您发布的消息关联起来
我不想将此限制为单个线程/工作线程
您可以在线程之间共享该连接,但必须创建每个线程IModel
实例
注意:RabbitMQ团队监视并有时只回答有关StackOverflow的问题。您需要的是数据和事务 将要确认的消息分隔为单个(或子集)事务 交易:
ch.txSelect(); <-- start transaction
ch.basicPublish("", QUEUE_NAME,
MessageProperties.PERSISTENT_BASIC,
"nop".getBytes());
ch.txCommit();<--commit transaction
我希望这会有所帮助在单独的事务中隔离您想要的消息并尝试WaitForConfirms如何?
ch.setConfirmListener(new ConfirmListener() {
public void handleAck(long seqNo, boolean multiple) {
if (multiple) {
unconfirmedSet.headSet(seqNo+1).clear();
} else {
unconfirmedSet.remove(seqNo);
}
}
public void handleNack(long seqNo, boolean multiple) {
// handle the lost messages somehow
}