C# 获取单个消息的发布者确认

C# 获取单个消息的发布者确认,c#,.net-core,rabbitmq,C#,.net Core,Rabbitmq,我有一个producer,每当通过API调用接收到消息时,它都会排队,我只想在确认代理接收到消息后返回 我通过publisher-confirms了解了如何做到这一点- using (var connection = factory.CreateConnection()) { using(var channel = connection.CreateModel()) {

我有一个producer,每当通过API调用接收到消息时,它都会排队,我只想在确认代理接收到消息后返回

我通过publisher-confirms了解了如何做到这一点-

    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
    }