官术网_书友最值得收藏!

  • RabbitMQ Cookbook
  • Sigismondo Boschi Gabriele Santomaggio
  • 420字
  • 2021-07-19 18:52:48

Working with message routing using topic exchanges

Direct and topic exchanges are conceptually very similar to each other. The main difference is that direct exchanges use exact matching only to select the destination of the messages, while topic exchanges allow using pattern matching with specific wildcards.

For example, the BBC is using topic routing with RabbitMQ to route new stories to all of the appropriate RSS feeds on their websites.

You can find the example for a topic exchange at:

Chapter01/Recipe08/Java_8/src/rmqexample/topic

Getting ready

To use this recipe we need to set up the Java development environment as indicated in the Introduction section.

How to do it…

Let's start with the producer:

  1. Declare a topic exchange:
    channel.exchangeDeclare(exchangeName, "topic", false, false, null);
  2. Send some messages to the exchange, using arbitrary routingKey values:
    channel.basicPublish(exchangeName, routingKey, null, jsonBook.getBytes());

Then, the consumers:

  1. Declare the same exchange, identical to what was done in step 1.
  2. Create a temporary queue:
    String myQueue = channel.queueDeclare().getQueue();
  3. Bind the queue to the exchange using the binding key, which in this case can contain wildcards:
    channel.queueBind(myQueue,exchangeName,bindingKey);
  4. After having created a suitable consumer object, start consuming messages as already seen in the Consuming messages recipe.

How it works…

As in the previous recipe, messages sent to a topic exchange are tagged with a string (step 2), but it is important for a topic exchange to be composed more of dot-separated words; these are supposed to be the topics of the message. For example, in our code we have used:

technology.rabbitmq.ebook
sport.golf.paper
sport.tennis.ebook

To consume these messages the consumer has to bind myQueue to the exchange (step 5) using the appropriate key.

Tip

Using the messaging jargon, the consumer has to subscribe to the topics it's interested in.

Using the topic exchange, the subscription/binding key specified in step 5 can be a sequence of dot-separated words and/or wildcards. AMQP wildcards are just:

  • #: This matches zero or more words
  • *: This matches exactly one word

So, for example:

  • #.ebook and *.*.ebook both match the first and the third sent messages
  • sport.# and sport.*.* both match the second and the third sent messages
  • # alone matches any message sent

In the last case the topic exchange behaves exactly like a fanout exchange, except for the performance, which is inevitably higher when using the former.

There's more…

Again, if some messages cannot be delivered to any one queue, they are silently dropped.

The producer can detect and behave consequently when this happens, as shown in detail in the Handling unroutable messages recipe.

主站蜘蛛池模板: 图们市| 正镶白旗| 汉阴县| 黄浦区| 谷城县| 彭州市| 上饶市| 富裕县| 哈巴河县| 巴楚县| 尼勒克县| 宿松县| 上饶市| 泗洪县| 手游| 贡嘎县| 东兰县| 吴堡县| 横峰县| 双城市| 维西| 石河子市| 卢氏县| 肥西县| 东阿县| 商丘市| 盐亭县| 璧山县| 乌苏市| 永德县| 剑河县| 永泰县| 南宁市| 台东县| 晴隆县| 新沂市| 铜梁县| 清水河县| 高淳县| 伊金霍洛旗| 五河县|