6

PHP から RabbitMQのDelayed Message Queueを使用しようとしていますが、メッセージが消えてしまいます。

次のコードで交換を宣言しています。

$this->channel->exchange_declare(
    'delay',
    'x-delayed-message',
    false,  /* passive, create if exchange doesn't exist */
    true,   /* durable, persist through server reboots */
    false,  /* autodelete */
    false,  /* internal */
    false,  /* nowait */
    ['x-delayed-type' => ['S', 'direct']]);

私はこのコードでキューをバインドしています:

$this->channel->queue_declare(
    $queueName,
    false,  /* Passive */
    true,   /* Durable */
    false,  /* Exclusive */
    false   /* Auto Delete */
);
$this->channel->queue_bind($queueName, "delay", $queueName);

そして、私はこのコードでメッセージを公開しています:

$msg = new AMQPMessage(json_encode($msgData), [
    'delivery_mode' => 2,
    'x-delay' => 5000]);
$this->channel->basic_publish($msg, 'delay', $queueName);

しかし、メッセージは遅れません。それはまだすぐに配信されます。私は何が欠けていますか?

4

3 に答える 3

5

ここから、

メッセージの作成は

require_once __DIR__ . '/vendor/autoload.php';
use PhpAmqpLib\Message\AMQPMessage;
use PhpAmqpLib\Wire\AMQPTable;

$msg = new AMQPMessage($data,
            array(
                'delivery_mode' => 2, # make message persistent
                'application_headers' => new AMQPTable([
                    'x-delay' => 5000
                ])
            )
        );
于 2016-10-12T00:39:42.600 に答える
1

交換から問題のキューに公開するには、ルーティング キーが必要です。

組み込みの直接交換への発行が機能する理由は、この交換がルーティング キーを宛先キュー名として使用する特殊なケースであるためです。

作成するすべての交換とキューについて、ルーティング キーを使用して、交換とキューの間のバインディングを作成する必要があります。次に、宛先キュー名の代わりにそのルーティング キーを使用してメッセージを発行します。

バインディングを作成するための PHP コードはわかりませんが、一般的には次のようになります。

channel.bind(exhange_name, queue_name, routing_key)

次に、メッセージの公開で:

$this->channel->basic_publish($msg, 'delay', $routing_key);

于 2015-08-31T19:04:14.400 に答える