获得发布者对单个消息的确认

时间:2018-07-02 09:10:36

标签: c# .net-core rabbitmq

我有一个生产者,只要通过API调用接收到一条消息,它就会排队,并且我只想在确认代理已收到消息后才返回。

我发现如何通过发布商确认-

<script>
    var token = $('meta[name=csrf-token]').attr('content');
    $.ajax('wizard/create', function() {
        method: 'POST',
        data:    {'data' : 'test'},
        headers: { 'X-CSRF-TOKEN': token },
        success: function(data) {
            console.log(data);
        }
     });
</script>

我的问题是我不想等待所有确认,而只是等待与此特定消息相关的确认。我不想将其限制为单个线程/工人,也不想等待所有事情确认。

用于js的Rabbit库与一个适合我使用的回调一起工作-但C#版本似乎不支持它。

2 个答案:

答案 0 :(得分:0)

  

我的问题是我不想等待所有确认,而只是等待与此特定邮件相关的确认。

您发布的代码将等待一个确认,该确认与刚刚发布的消息相关。

  

我不想将其限制为单个线程/工人

您可以在线程之间共享该连接,但是您必须创建每个线程的Mammal实例。然后,使用该实例发布一条消息,然后按照完成操作调用IModel


注意: RabbitMQ团队监视classical inheritance example,并且有时仅在StackOverflow上回答问题。

答案 1 :(得分:0)

您需要的是Publisher Confirms和交易。

将您要确认的消息分隔为单个(或子集)事务。

交易:

ch.txSelect(); <-- start transaction
ch.basicPublish("", QUEUE_NAME,
                            MessageProperties.PERSISTENT_BASIC,
                            "nop".getBytes());
ch.txCommit();<--commit transaction

您可以通过以下方式使用流式轻量级发布者确认:

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
    }

我希望对您有帮助