AMQP Topi c Сведения о маршрутизации обмена - PullRequest
0 голосов
/ 27 мая 2020

Я недавно поигрался с RabbitMQ и Java API, особенно с обменами topi c (см. Урок 5 RabbitMQ ( 1 )).

Теперь я не действительно понимаю, как именно биржа сопоставляет очереди по ключу. В документации AMQP 0.9.1 ( 2 ) сказано:

Тип обмена topi c работает следующим образом:

  1. A очередь сообщений привязывается к обмену с помощью шаблона маршрутизации P.
  2. Издатель отправляет обмену сообщение с ключом маршрутизации R.
  3. Сообщение передается в очередь сообщений, если R соответствует P .

Ключ маршрутизации, используемый для обмена topi c, ДОЛЖЕН состоять из нуля или более слов, разделенных точками. Каждое слово может содержать буквы AZ и az и цифры 0-9. Шаблон маршрутизации следует тем же правилам, что и ключ маршрутизации, с добавлением, что * соответствует одному слову, а # соответствует нулю или нескольким словам. Таким образом, шаблон маршрутизации * .stock. # Соответствует ключам маршрутизации usd.stock и eur.stock.db, но не stock.nasdaq.

Исходя из этого, я предполагаю, что ключ маршрутизации requests. не соответствует шаблону маршрутизации requests.*, потому что * соответствует слову (тогда как для # он явно говорит ноль или более слов).

В руководстве RabbitMQ 1 также говорится, что

  • (звездочка) может заменять ровно одно слово.

Но когда я попробовал это, потребитель получил сообщения с ключом маршрутизации requests..

Вот мой потребитель:

private void Subscribe() throws IOException {
    queueName = channel.queueDeclare().getQueue();
    channel.queueBind(queueName, Constants.TOPIC_EXCHANGE, Constants.ROUTING_KEY_ALL_REGIONS);

    channel.basicConsume(queueName, true, this::HandleMessage, s -> {});
}

private void HandleMessage(String tag, Delivery delivery) {
    System.out.println(String.format("received message with routing key '%s'", delivery.getEnvelope().getRoutingKey()));
}

Вот результат Обработчика:

received message with routing key 'requests.'
received message with routing key 'requests. '
received message with routing key 'requests.#'
received message with routing key 'requests.test'

Где я могу найти конкретную документацию / семантику, что подразумевается под словом et c.?

Спасибо, с уважением,

Michael

...