[英]How to organize broker message redelivery in ActiveMQ for PHP Stomp client
我正在尝试使用ActiveMQ 5.8.0和PHP Stomp扩展实现代理重新交付。 但这不能按预期工作。
回滚消息的PHP订阅者
define('QUEUE_NAME', '/queue/Task.Test');
$stomp = new Stomp();
$stomp->subscribe(QUEUE_NAME, array(
'activemq.prefetchSize' => 10,
));
while (true) {
$tid = uniqid('tid');
$stomp->begin($tid);
try {
$frame = $stomp->readFrame();
if ($frame) {
print_r($frame->headers);
$stomp->ack($frame->headers['message-id'], array('transaction' => $tid));
echo "Get message {$frame->headers['message-id']}, rollback it", PHP_EOL;
$stomp->abort($tid);
} else {
$stomp->commit($tid);
}
} catch (StompException $e) {
$stomp->abort($tid);
}
}
ActiveMQ配置(已启用调度程序):
<plugins>
<redeliveryPlugin fallbackToDeadLetter="true" sendToDlqIfMaxRetriesExceeded="true">
<redeliveryPolicyMap>
<redeliveryPolicyMap>
<redeliveryPolicyEntries>
<!-- a destination specific policy -->
<redeliveryPolicy queue=">" maximumRedeliveries="2" redeliveryDelay="10000" />
</redeliveryPolicyEntries>
<!-- the fallback policy for all other destinations -->
<defaultEntry>
<redeliveryPolicy maximumRedeliveries="2" initialRedeliveryDelay="5000" redeliveryDelay="10000" />
</defaultEntry>
</redeliveryPolicyMap>
</redeliveryPolicyMap>
</redeliveryPlugin>
</plugins>
使用该配置,订户可以接收所有消息并回滚它们,因此它们返回到队列,但是我希望在延迟之后重新传递它们。 ACK具有特殊状态:“毒气ack”,但我不知道如何指定它。
如何在经纪人方面启用重新交付?
实际上,重新交付需要在STOMP协议版本> = 1.1中定义的NACK命令。 PHP Stomp客户端仅支持1.0版,因此无法为该扩展启用重新交付。 但是,使用nack()
方法和标头处理扩展Stomp类很容易。 希望这些信息对某人有帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.