rabbitmq AMQP::consume()

5

AMQP函数consume()是一个带回调的阻塞函数,是否可以为consume()函数设置超时时间,以便在特定时间后不再阻塞,并完成代码执行?

1个回答

6
是的,以下是方法:

是这样的:

$amqp = new AMQPConnection($your_connection_params);
$amqp->setTimeout($seconds);

当您在队列上调用consume()时,如果在超时时间内没有消息到达,则会从consume()中抛出一个AMQPException异常,其中包含消息“Resource temporarily unavailable”。如果您曾经退出consume()或遇到超时,请确保在队列对象上调用cancel()以正确重置消费者。为了做到这一点,您需要生成一个全局唯一的消费者标签,并将其作为未记录的第三个参数传递给consume:

$tag = uniqid() . microtime(true);
$queue->consume($callback, $flags, $tag);
$queue->cancel($tag);

那样做,您就可以随后再次调用consume(),而不会出现令人头晕的奇怪问题。

1
我使用的是pecl amqp模块,版本为1.0.9。最近尝试升级到最新版本,但我的代码完全崩溃了。但是,我上面描述的方法在amqp-1.0.9和rabbitmq 3.1.3上正常工作。 - gurumike
2
今天遇到了这种情况,你的答案引导我朝着正确的方向前进。setTimeout方法已被弃用,应使用setReadTimeout方法。此外,请确保捕获consume在超时时抛出的AMQPConnectionException异常。AMQP版本1.4。 - JohnP

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接