RabbitFoot在3分钟内未收到消息时拒绝邮件

时间:2016-03-29 09:40:42

标签: perl rabbitmq

我正在使用Net::RabbitFoot库从RabbitMQ队列中读取消息。处理邮件需要一些时间,我希望在处理成功之后ack消息。我的代码如下:

my $rf = Net::RabbitFoot->new()->load_xml_spec()->connect(%opts);
my $ch = $rf->open_channel();

my $msg = $ch->get(queue => 'my_queue', no_ack => 0);
frobnicate($msg); # this takes more than 3 minutes
$ch->ack(); # this has no effect, $msg is already back in queue.

大约3分钟后,(尚未)取消的消息将返回队列,ack调用无效。

连接时我没有设置timeouttune选项。

有没有办法改变行为,以便我的消息永远不会返回队列,除非我明确reject它?

1 个答案:

答案 0 :(得分:0)

三分钟很长一段时间,你似乎没有任何暗示ack的条件(所以你可能根据你正在使用的协议的文档切换最后两个语句: https://www.rabbitmq.com/resources/specs/amqp0-9-1.pdf(同样为0.8.0):

The client layers can themselves implement explicit acknowledgements in
different ways, e.g. as soon as a message is received,
or when the application indicates that it has processed it.
These differences do not affect AMQP or interoperability.
...
Flow control
... message acknowledgements ... usually means using transactions.

)或者你可以在对它进行三分钟的处理之前对一个阶段中的消息的可操作性进行预处理,如果你的可操作性测试成功,则可以使用它。

另一端不应该发生3分钟超时,建议tcp建立2小时