1

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」という特別なステータスがありますが、指定方法がわかりません。

ブローカー側で再配信を有効にするにはどうすればよいですか?

4

1 に答える 1