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 には「poison ack」という特別なステータスがありますが、指定方法がわかりません。
ブローカー側で再配信を有効にするにはどうすればよいですか?