5. 主题模式 Topics
根据主题接收消息
routing_key – 它必须是由英文点.分隔的单词列表
- *可以替代一个单词。
- #可以替换零个或多个单词。
- 图示
个人理解
-
与路由模式基本相同,不同的点只是路由模式需要Queue订阅的路由键与消息的路由键完全匹配,Exchange才会将消息发送给Queue。
-
而主题模式(Exchange类型为topic),消费者在将Exchange与Queue绑定时设置的路由键可以有通配。
-
生产者
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 1package com.futao.springmvcdemo.mq.rabbit.topic;
2
3import com.futao.springmvcdemo.mq.rabbit.ExchangeTypeEnum;
4import com.futao.springmvcdemo.mq.rabbit.RabbitMqConnectionTools;
5import com.rabbitmq.client.BuiltinExchangeType;
6import com.rabbitmq.client.Channel;
7import com.rabbitmq.client.Connection;
8import lombok.Cleanup;
9import lombok.SneakyThrows;
10import lombok.extern.slf4j.Slf4j;
11
12/**
13 * Topic模式-生产者
14 *
15 * @author futao
16 * Created on 2019-04-22.
17 */
18@Slf4j
19public class Producer {
20 @SneakyThrows
21 public static void main(String[] args) {
22 @Cleanup
23 Connection connection = RabbitMqConnectionTools.getConnection();
24 @Cleanup
25 Channel channel = connection.createChannel();
26 //定义交换器类型
27 channel.exchangeDeclare(ExchangeTypeEnum.TOPIC.getExchangeName(), BuiltinExchangeType.TOPIC);
28 String msg = "Hello RabbitMq!";
29 for (int i = 0; i < 10; i++) {
30 channel.basicPublish(ExchangeTypeEnum.TOPIC.getExchangeName(), "log.info", null, (msg + i + "log.info").getBytes());
31 log.info("Send msg:[{}] ,routingKey:[{}] success", (msg + i + "log.info"), "log.info");
32 }
33 for (int i = 0; i < 10; i++) {
34 channel.basicPublish(ExchangeTypeEnum.TOPIC.getExchangeName(), "log.error", null, (msg + i + "log.error").getBytes());
35 log.info("Send msg:[{}] ,routingKey:[{}] success", (msg + i + "log.error"), "log.error");
36 }
37 for (int i = 0; i < 10; i++) {
38 channel.basicPublish(ExchangeTypeEnum.TOPIC.getExchangeName(), "log.error.rabbitmq", null, (msg + i + "log.error.rabbitmq").getBytes());
39 log.info("Send msg:[{}] ,routingKey:[{}] success", (msg + i + "log.error.rabbitmq"), "log.error.rabbitmq");
40 }
41 }
42}
43
-
消费者1 – 订阅log.error and log.info
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50 1package com.futao.springmvcdemo.mq.rabbit.topic;
2
3import com.futao.springmvcdemo.mq.rabbit.ExchangeTypeEnum;
4import com.futao.springmvcdemo.mq.rabbit.RabbitMqConnectionTools;
5import com.futao.springmvcdemo.mq.rabbit.RabbitMqQueueEnum;
6import com.rabbitmq.client.BuiltinExchangeType;
7import com.rabbitmq.client.Channel;
8import com.rabbitmq.client.DeliverCallback;
9import lombok.SneakyThrows;
10import lombok.extern.slf4j.Slf4j;
11
12/**
13 * Topic模式-消费者1
14 *
15 * @author futao
16 * Created on 2019-04-22.
17 */
18@Slf4j
19public class ConsumerOne {
20 @SneakyThrows
21 public static void main(String[] args) {
22 Channel channel = RabbitMqConnectionTools.getChannel();
23 //开启持久化队列
24 boolean durable = true;
25 channel.queueDeclare(RabbitMqQueueEnum.EXCHANGE_QUEUE_TOPIC_ONE.getQueueName(), durable, false, false, null);
26 //定义交换器类型
27 channel.exchangeDeclare(ExchangeTypeEnum.DIRECT.getExchangeName(), BuiltinExchangeType.TOPIC);
28 //将消息队列与Exchange交换器与路由键绑定(同时订阅路由key为"log.info"和"log.error"的消息)
29 channel.queueBind(RabbitMqQueueEnum.EXCHANGE_QUEUE_TOPIC_ONE.getQueueName(), ExchangeTypeEnum.TOPIC.getExchangeName(), "log.error");
30 channel.queueBind(RabbitMqQueueEnum.EXCHANGE_QUEUE_TOPIC_ONE.getQueueName(), ExchangeTypeEnum.TOPIC.getExchangeName(), "log.info");
31 //告诉rabbitmq一次只发送一条消息,并且在前一个消息未被处理或者消费之前,不继续发送下一个消息
32 channel.basicQos(1);
33 log.info("Waiting for message...");
34 DeliverCallback deliverCallback = ((consumerTag, message) -> {
35 log.info("收到消息:[{}],routingKey:[{}],tag:[{}]", new String(message.getBody()), message.getEnvelope().getRoutingKey(), consumerTag);
36 //acknowledgment应答
37 channel.basicAck(message.getEnvelope().getDeliveryTag(), false);
38 try {
39 Thread.sleep(1000);
40 } catch (Exception e) {
41
42 }
43 });
44 //关闭自动应答
45 boolean autoAck = false;
46 channel.basicConsume(RabbitMqQueueEnum.EXCHANGE_QUEUE_TOPIC_ONE.getQueueName(), autoAck, deliverCallback, consumerTag -> {
47 });
48 }
49}
50
-
消费者2 – 订阅log.error
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 1package com.futao.springmvcdemo.mq.rabbit.topic;
2
3import com.futao.springmvcdemo.mq.rabbit.ExchangeTypeEnum;
4import com.futao.springmvcdemo.mq.rabbit.RabbitMqConnectionTools;
5import com.futao.springmvcdemo.mq.rabbit.RabbitMqQueueEnum;
6import com.rabbitmq.client.BuiltinExchangeType;
7import com.rabbitmq.client.Channel;
8import com.rabbitmq.client.DeliverCallback;
9import lombok.SneakyThrows;
10import lombok.extern.slf4j.Slf4j;
11
12/**
13 * Topic模式-消费者2
14 *
15 * @author futao
16 * Created on 2019-04-22.
17 */
18@Slf4j
19public class ConsumerTwo {
20 @SneakyThrows
21 public static void main(String[] args) {
22 Channel channel = RabbitMqConnectionTools.getChannel();
23 //开启持久化队列
24 boolean durable = true;
25 channel.queueDeclare(RabbitMqQueueEnum.EXCHANGE_QUEUE_TOPIC_TWO.getQueueName(), durable, false, false, null);
26 //定义交换器类型
27 channel.exchangeDeclare(ExchangeTypeEnum.TOPIC.getExchangeName(), BuiltinExchangeType.TOPIC);
28 //将消息队列与Exchange交换器进行绑定(只订阅路由key为"log.error"的消息)
29 channel.queueBind(RabbitMqQueueEnum.EXCHANGE_QUEUE_TOPIC_TWO.getQueueName(), ExchangeTypeEnum.TOPIC.getExchangeName(), "log.error");
30 //告诉rabbitmq一次只发送一条消息,并且在前一个消息未被处理或者消费之前,不继续发送下一个消息
31 channel.basicQos(1);
32 log.info("Waiting for message...");
33 DeliverCallback deliverCallback = ((consumerTag, message) -> {
34 log.info("收到消息:[{}],routingKey:[{}],tag:[{}]", new String(message.getBody()), message.getEnvelope().getRoutingKey(), consumerTag);
35 //acknowledgment应答
36 channel.basicAck(message.getEnvelope().getDeliveryTag(), false);
37 try {
38 Thread.sleep(2000);
39 } catch (Exception e) {
40
41 }
42 });
43 //关闭自动应答
44 boolean autoAck = false;
45 channel.basicConsume(RabbitMqQueueEnum.EXCHANGE_QUEUE_TOPIC_TWO.getQueueName(), autoAck, deliverCallback, consumerTag -> {
46 });
47 }
48}
49
-
消费者3 – 订阅log.*
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 1package com.futao.springmvcdemo.mq.rabbit.topic;
2
3import com.futao.springmvcdemo.mq.rabbit.ExchangeTypeEnum;
4import com.futao.springmvcdemo.mq.rabbit.RabbitMqConnectionTools;
5import com.futao.springmvcdemo.mq.rabbit.RabbitMqQueueEnum;
6import com.rabbitmq.client.BuiltinExchangeType;
7import com.rabbitmq.client.Channel;
8import com.rabbitmq.client.DeliverCallback;
9import lombok.SneakyThrows;
10import lombok.extern.slf4j.Slf4j;
11
12/**
13 * Topic模式-消费者3
14 *
15 * @author futao
16 * Created on 2019-04-22.
17 */
18@Slf4j
19public class ConsumerThree {
20 @SneakyThrows
21 public static void main(String[] args) {
22 Channel channel = RabbitMqConnectionTools.getChannel();
23 //开启持久化队列
24 boolean durable = true;
25 channel.queueDeclare(RabbitMqQueueEnum.EXCHANGE_QUEUE_TOPIC_THREE.getQueueName(), durable, false, false, null);
26 //定义交换器类型
27 channel.exchangeDeclare(ExchangeTypeEnum.DIRECT.getExchangeName(), BuiltinExchangeType.TOPIC);
28 //将消息队列与Exchange交换器与路由键绑定(同时订阅路由key为"log.info"和"log.error"的消息)
29 channel.queueBind(RabbitMqQueueEnum.EXCHANGE_QUEUE_TOPIC_THREE.getQueueName(), ExchangeTypeEnum.TOPIC.getExchangeName(), "log.*");
30 //告诉rabbitmq一次只发送一条消息,并且在前一个消息未被处理或者消费之前,不继续发送下一个消息
31 channel.basicQos(1);
32 log.info("Waiting for message...");
33 DeliverCallback deliverCallback = ((consumerTag, message) -> {
34 log.info("收到消息:[{}],routingKey:[{}],tag:[{}]", new String(message.getBody()), message.getEnvelope().getRoutingKey(), consumerTag);
35 //acknowledgment应答
36 channel.basicAck(message.getEnvelope().getDeliveryTag(), false);
37 try {
38 Thread.sleep(1000);
39 } catch (Exception e) {
40
41 }
42 });
43 //关闭自动应答
44 boolean autoAck = false;
45 channel.basicConsume(RabbitMqQueueEnum.EXCHANGE_QUEUE_TOPIC_THREE.getQueueName(), autoAck, deliverCallback, consumerTag -> {
46 });
47 }
48}
49
-
消费者4 – 订阅log.#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49 1package com.futao.springmvcdemo.mq.rabbit.topic;
2
3import com.futao.springmvcdemo.mq.rabbit.ExchangeTypeEnum;
4import com.futao.springmvcdemo.mq.rabbit.RabbitMqConnectionTools;
5import com.futao.springmvcdemo.mq.rabbit.RabbitMqQueueEnum;
6import com.rabbitmq.client.BuiltinExchangeType;
7import com.rabbitmq.client.Channel;
8import com.rabbitmq.client.DeliverCallback;
9import lombok.SneakyThrows;
10import lombok.extern.slf4j.Slf4j;
11
12/**
13 * Topic模式-消费者4
14 *
15 * @author futao
16 * Created on 2019-04-22.
17 */
18@Slf4j
19public class ConsumerFour {
20 @SneakyThrows
21 public static void main(String[] args) {
22 Channel channel = RabbitMqConnectionTools.getChannel();
23 //开启持久化队列
24 boolean durable = true;
25 channel.queueDeclare(RabbitMqQueueEnum.EXCHANGE_QUEUE_TOPIC_FOUR.getQueueName(), durable, false, false, null);
26 //定义交换器类型
27 channel.exchangeDeclare(ExchangeTypeEnum.DIRECT.getExchangeName(), BuiltinExchangeType.TOPIC);
28 //将消息队列与Exchange交换器与路由键绑定(同时订阅路由key为"log.info"和"log.error"的消息)
29 channel.queueBind(RabbitMqQueueEnum.EXCHANGE_QUEUE_TOPIC_FOUR.getQueueName(), ExchangeTypeEnum.TOPIC.getExchangeName(), "log.#");
30 //告诉rabbitmq一次只发送一条消息,并且在前一个消息未被处理或者消费之前,不继续发送下一个消息
31 channel.basicQos(1);
32 log.info("Waiting for message...");
33 DeliverCallback deliverCallback = ((consumerTag, message) -> {
34 log.info("收到消息:[{}],routingKey:[{}],tag:[{}]", new String(message.getBody()), message.getEnvelope().getRoutingKey(), consumerTag);
35 //acknowledgment应答
36 channel.basicAck(message.getEnvelope().getDeliveryTag(), false);
37 try {
38 Thread.sleep(1000);
39 } catch (Exception e) {
40
41 }
42 });
43 //关闭自动应答
44 boolean autoAck = false;
45 channel.basicConsume(RabbitMqQueueEnum.EXCHANGE_QUEUE_TOPIC_FOUR.getQueueName(), autoAck, deliverCallback, consumerTag -> {
46 });
47 }
48}
49
-
测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96 1>>> 生产者-生产主题分别为:`log.info` and `log.error` and `log.error.rabbitmq`的消息
2略
3
4>>> 消费者1 - 订阅`log.error` and `log.info`
519:42:31.130 [main] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerOne - Waiting for message...
619:42:48.506 [pool-1-thread-4] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerOne - 收到消息:[Hello RabbitMq!0log.info],routingKey:[log.info],tag:[amq.ctag-YQRXOwb2xsoODmB2fpJ1Qg]
719:42:49.509 [pool-1-thread-5] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerOne - 收到消息:[Hello RabbitMq!1log.info],routingKey:[log.info],tag:[amq.ctag-YQRXOwb2xsoODmB2fpJ1Qg]
819:42:50.513 [pool-1-thread-6] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerOne - 收到消息:[Hello RabbitMq!2log.info],routingKey:[log.info],tag:[amq.ctag-YQRXOwb2xsoODmB2fpJ1Qg]
919:42:51.517 [pool-1-thread-7] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerOne - 收到消息:[Hello RabbitMq!3log.info],routingKey:[log.info],tag:[amq.ctag-YQRXOwb2xsoODmB2fpJ1Qg]
1019:42:52.520 [pool-1-thread-8] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerOne - 收到消息:[Hello RabbitMq!4log.info],routingKey:[log.info],tag:[amq.ctag-YQRXOwb2xsoODmB2fpJ1Qg]
1119:42:53.524 [pool-1-thread-9] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerOne - 收到消息:[Hello RabbitMq!5log.info],routingKey:[log.info],tag:[amq.ctag-YQRXOwb2xsoODmB2fpJ1Qg]
1219:42:54.529 [pool-1-thread-10] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerOne - 收到消息:[Hello RabbitMq!6log.info],routingKey:[log.info],tag:[amq.ctag-YQRXOwb2xsoODmB2fpJ1Qg]
1319:42:55.535 [pool-1-thread-11] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerOne - 收到消息:[Hello RabbitMq!7log.info],routingKey:[log.info],tag:[amq.ctag-YQRXOwb2xsoODmB2fpJ1Qg]
1419:42:56.539 [pool-1-thread-12] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerOne - 收到消息:[Hello RabbitMq!8log.info],routingKey:[log.info],tag:[amq.ctag-YQRXOwb2xsoODmB2fpJ1Qg]
1519:42:57.540 [pool-1-thread-13] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerOne - 收到消息:[Hello RabbitMq!9log.info],routingKey:[log.info],tag:[amq.ctag-YQRXOwb2xsoODmB2fpJ1Qg]
1619:42:58.545 [pool-1-thread-14] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerOne - 收到消息:[Hello RabbitMq!0log.error],routingKey:[log.error],tag:[amq.ctag-YQRXOwb2xsoODmB2fpJ1Qg]
1719:42:59.551 [pool-1-thread-15] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerOne - 收到消息:[Hello RabbitMq!1log.error],routingKey:[log.error],tag:[amq.ctag-YQRXOwb2xsoODmB2fpJ1Qg]
1819:43:00.556 [pool-1-thread-16] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerOne - 收到消息:[Hello RabbitMq!2log.error],routingKey:[log.error],tag:[amq.ctag-YQRXOwb2xsoODmB2fpJ1Qg]
1919:43:01.560 [pool-1-thread-17] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerOne - 收到消息:[Hello RabbitMq!3log.error],routingKey:[log.error],tag:[amq.ctag-YQRXOwb2xsoODmB2fpJ1Qg]
2019:43:02.561 [pool-1-thread-18] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerOne - 收到消息:[Hello RabbitMq!4log.error],routingKey:[log.error],tag:[amq.ctag-YQRXOwb2xsoODmB2fpJ1Qg]
2119:43:03.566 [pool-1-thread-19] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerOne - 收到消息:[Hello RabbitMq!5log.error],routingKey:[log.error],tag:[amq.ctag-YQRXOwb2xsoODmB2fpJ1Qg]
2219:43:04.569 [pool-1-thread-20] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerOne - 收到消息:[Hello RabbitMq!6log.error],routingKey:[log.error],tag:[amq.ctag-YQRXOwb2xsoODmB2fpJ1Qg]
2319:43:05.572 [pool-1-thread-21] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerOne - 收到消息:[Hello RabbitMq!7log.error],routingKey:[log.error],tag:[amq.ctag-YQRXOwb2xsoODmB2fpJ1Qg]
2419:43:06.574 [pool-1-thread-22] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerOne - 收到消息:[Hello RabbitMq!8log.error],routingKey:[log.error],tag:[amq.ctag-YQRXOwb2xsoODmB2fpJ1Qg]
2519:43:07.580 [pool-1-thread-23] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerOne - 收到消息:[Hello RabbitMq!9log.error],routingKey:[log.error],tag:[amq.ctag-YQRXOwb2xsoODmB2fpJ1Qg]
26
27>>> 消费者2 - 订阅`log.error`
2819:42:36.272 [main] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerTwo - Waiting for message...
2919:42:48.516 [pool-1-thread-4] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerTwo - 收到消息:[Hello RabbitMq!0log.error],routingKey:[log.error],tag:[amq.ctag-Q3m55Q8-XWC-SlF1qX80cA]
3019:42:50.522 [pool-1-thread-5] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerTwo - 收到消息:[Hello RabbitMq!1log.error],routingKey:[log.error],tag:[amq.ctag-Q3m55Q8-XWC-SlF1qX80cA]
3119:42:52.523 [pool-1-thread-6] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerTwo - 收到消息:[Hello RabbitMq!2log.error],routingKey:[log.error],tag:[amq.ctag-Q3m55Q8-XWC-SlF1qX80cA]
3219:42:54.527 [pool-1-thread-7] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerTwo - 收到消息:[Hello RabbitMq!3log.error],routingKey:[log.error],tag:[amq.ctag-Q3m55Q8-XWC-SlF1qX80cA]
3319:42:56.529 [pool-1-thread-8] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerTwo - 收到消息:[Hello RabbitMq!4log.error],routingKey:[log.error],tag:[amq.ctag-Q3m55Q8-XWC-SlF1qX80cA]
3419:42:58.533 [pool-1-thread-9] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerTwo - 收到消息:[Hello RabbitMq!5log.error],routingKey:[log.error],tag:[amq.ctag-Q3m55Q8-XWC-SlF1qX80cA]
3519:43:00.534 [pool-1-thread-10] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerTwo - 收到消息:[Hello RabbitMq!6log.error],routingKey:[log.error],tag:[amq.ctag-Q3m55Q8-XWC-SlF1qX80cA]
3619:43:02.539 [pool-1-thread-11] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerTwo - 收到消息:[Hello RabbitMq!7log.error],routingKey:[log.error],tag:[amq.ctag-Q3m55Q8-XWC-SlF1qX80cA]
3719:43:04.541 [pool-1-thread-12] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerTwo - 收到消息:[Hello RabbitMq!8log.error],routingKey:[log.error],tag:[amq.ctag-Q3m55Q8-XWC-SlF1qX80cA]
3819:43:06.543 [pool-1-thread-13] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerTwo - 收到消息:[Hello RabbitMq!9log.error],routingKey:[log.error],tag:[amq.ctag-Q3m55Q8-XWC-SlF1qX80cA]
39
40>>> 消费者3 - 订阅`log.*`
4119:42:39.746 [main] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerThree - Waiting for message...
4219:42:48.507 [pool-1-thread-4] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerThree - 收到消息:[Hello RabbitMq!0log.info],routingKey:[log.info],tag:[amq.ctag-0-_1m0BhTsYpjikUjsWEQA]
4319:42:49.509 [pool-1-thread-5] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerThree - 收到消息:[Hello RabbitMq!1log.info],routingKey:[log.info],tag:[amq.ctag-0-_1m0BhTsYpjikUjsWEQA]
4419:42:50.513 [pool-1-thread-6] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerThree - 收到消息:[Hello RabbitMq!2log.info],routingKey:[log.info],tag:[amq.ctag-0-_1m0BhTsYpjikUjsWEQA]
4519:42:51.517 [pool-1-thread-7] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerThree - 收到消息:[Hello RabbitMq!3log.info],routingKey:[log.info],tag:[amq.ctag-0-_1m0BhTsYpjikUjsWEQA]
4619:42:52.520 [pool-1-thread-8] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerThree - 收到消息:[Hello RabbitMq!4log.info],routingKey:[log.info],tag:[amq.ctag-0-_1m0BhTsYpjikUjsWEQA]
4719:42:53.524 [pool-1-thread-9] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerThree - 收到消息:[Hello RabbitMq!5log.info],routingKey:[log.info],tag:[amq.ctag-0-_1m0BhTsYpjikUjsWEQA]
4819:42:54.529 [pool-1-thread-10] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerThree - 收到消息:[Hello RabbitMq!6log.info],routingKey:[log.info],tag:[amq.ctag-0-_1m0BhTsYpjikUjsWEQA]
4919:42:55.535 [pool-1-thread-11] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerThree - 收到消息:[Hello RabbitMq!7log.info],routingKey:[log.info],tag:[amq.ctag-0-_1m0BhTsYpjikUjsWEQA]
5019:42:56.539 [pool-1-thread-12] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerThree - 收到消息:[Hello RabbitMq!8log.info],routingKey:[log.info],tag:[amq.ctag-0-_1m0BhTsYpjikUjsWEQA]
5119:42:57.540 [pool-1-thread-13] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerThree - 收到消息:[Hello RabbitMq!9log.info],routingKey:[log.info],tag:[amq.ctag-0-_1m0BhTsYpjikUjsWEQA]
5219:42:58.545 [pool-1-thread-14] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerThree - 收到消息:[Hello RabbitMq!0log.error],routingKey:[log.error],tag:[amq.ctag-0-_1m0BhTsYpjikUjsWEQA]
5319:42:59.551 [pool-1-thread-15] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerThree - 收到消息:[Hello RabbitMq!1log.error],routingKey:[log.error],tag:[amq.ctag-0-_1m0BhTsYpjikUjsWEQA]
5419:43:00.556 [pool-1-thread-16] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerThree - 收到消息:[Hello RabbitMq!2log.error],routingKey:[log.error],tag:[amq.ctag-0-_1m0BhTsYpjikUjsWEQA]
5519:43:01.560 [pool-1-thread-17] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerThree - 收到消息:[Hello RabbitMq!3log.error],routingKey:[log.error],tag:[amq.ctag-0-_1m0BhTsYpjikUjsWEQA]
5619:43:02.561 [pool-1-thread-18] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerThree - 收到消息:[Hello RabbitMq!4log.error],routingKey:[log.error],tag:[amq.ctag-0-_1m0BhTsYpjikUjsWEQA]
5719:43:03.566 [pool-1-thread-19] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerThree - 收到消息:[Hello RabbitMq!5log.error],routingKey:[log.error],tag:[amq.ctag-0-_1m0BhTsYpjikUjsWEQA]
5819:43:04.569 [pool-1-thread-20] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerThree - 收到消息:[Hello RabbitMq!6log.error],routingKey:[log.error],tag:[amq.ctag-0-_1m0BhTsYpjikUjsWEQA]
5919:43:05.572 [pool-1-thread-21] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerThree - 收到消息:[Hello RabbitMq!7log.error],routingKey:[log.error],tag:[amq.ctag-0-_1m0BhTsYpjikUjsWEQA]
6019:43:06.574 [pool-1-thread-22] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerThree - 收到消息:[Hello RabbitMq!8log.error],routingKey:[log.error],tag:[amq.ctag-0-_1m0BhTsYpjikUjsWEQA]
6119:43:07.580 [pool-1-thread-23] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerThree - 收到消息:[Hello RabbitMq!9log.error],routingKey:[log.error],tag:[amq.ctag-0-_1m0BhTsYpjikUjsWEQA]
62
63
64>>> 消费者4 - 订阅`log.#`
6519:42:42.624 [main] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerFour - Waiting for message...
6619:42:48.506 [pool-1-thread-4] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerFour - 收到消息:[Hello RabbitMq!0log.info],routingKey:[log.info],tag:[amq.ctag-Ml8Iiz8KSEh4RBn4yfA0xA]
6719:42:49.509 [pool-1-thread-5] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerFour - 收到消息:[Hello RabbitMq!1log.info],routingKey:[log.info],tag:[amq.ctag-Ml8Iiz8KSEh4RBn4yfA0xA]
6819:42:50.513 [pool-1-thread-6] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerFour - 收到消息:[Hello RabbitMq!2log.info],routingKey:[log.info],tag:[amq.ctag-Ml8Iiz8KSEh4RBn4yfA0xA]
6919:42:51.517 [pool-1-thread-7] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerFour - 收到消息:[Hello RabbitMq!3log.info],routingKey:[log.info],tag:[amq.ctag-Ml8Iiz8KSEh4RBn4yfA0xA]
7019:42:52.520 [pool-1-thread-8] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerFour - 收到消息:[Hello RabbitMq!4log.info],routingKey:[log.info],tag:[amq.ctag-Ml8Iiz8KSEh4RBn4yfA0xA]
7119:42:53.524 [pool-1-thread-9] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerFour - 收到消息:[Hello RabbitMq!5log.info],routingKey:[log.info],tag:[amq.ctag-Ml8Iiz8KSEh4RBn4yfA0xA]
7219:42:54.529 [pool-1-thread-10] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerFour - 收到消息:[Hello RabbitMq!6log.info],routingKey:[log.info],tag:[amq.ctag-Ml8Iiz8KSEh4RBn4yfA0xA]
7319:42:55.535 [pool-1-thread-11] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerFour - 收到消息:[Hello RabbitMq!7log.info],routingKey:[log.info],tag:[amq.ctag-Ml8Iiz8KSEh4RBn4yfA0xA]
7419:42:56.539 [pool-1-thread-12] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerFour - 收到消息:[Hello RabbitMq!8log.info],routingKey:[log.info],tag:[amq.ctag-Ml8Iiz8KSEh4RBn4yfA0xA]
7519:42:57.540 [pool-1-thread-13] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerFour - 收到消息:[Hello RabbitMq!9log.info],routingKey:[log.info],tag:[amq.ctag-Ml8Iiz8KSEh4RBn4yfA0xA]
7619:42:58.545 [pool-1-thread-14] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerFour - 收到消息:[Hello RabbitMq!0log.error],routingKey:[log.error],tag:[amq.ctag-Ml8Iiz8KSEh4RBn4yfA0xA]
7719:42:59.551 [pool-1-thread-15] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerFour - 收到消息:[Hello RabbitMq!1log.error],routingKey:[log.error],tag:[amq.ctag-Ml8Iiz8KSEh4RBn4yfA0xA]
7819:43:00.556 [pool-1-thread-16] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerFour - 收到消息:[Hello RabbitMq!2log.error],routingKey:[log.error],tag:[amq.ctag-Ml8Iiz8KSEh4RBn4yfA0xA]
7919:43:01.560 [pool-1-thread-17] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerFour - 收到消息:[Hello RabbitMq!3log.error],routingKey:[log.error],tag:[amq.ctag-Ml8Iiz8KSEh4RBn4yfA0xA]
8019:43:02.561 [pool-1-thread-18] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerFour - 收到消息:[Hello RabbitMq!4log.error],routingKey:[log.error],tag:[amq.ctag-Ml8Iiz8KSEh4RBn4yfA0xA]
8119:43:03.566 [pool-1-thread-19] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerFour - 收到消息:[Hello RabbitMq!5log.error],routingKey:[log.error],tag:[amq.ctag-Ml8Iiz8KSEh4RBn4yfA0xA]
8219:43:04.569 [pool-1-thread-20] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerFour - 收到消息:[Hello RabbitMq!6log.error],routingKey:[log.error],tag:[amq.ctag-Ml8Iiz8KSEh4RBn4yfA0xA]
8319:43:05.572 [pool-1-thread-21] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerFour - 收到消息:[Hello RabbitMq!7log.error],routingKey:[log.error],tag:[amq.ctag-Ml8Iiz8KSEh4RBn4yfA0xA]
8419:43:06.574 [pool-1-thread-22] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerFour - 收到消息:[Hello RabbitMq!8log.error],routingKey:[log.error],tag:[amq.ctag-Ml8Iiz8KSEh4RBn4yfA0xA]
8519:43:07.580 [pool-1-thread-23] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerFour - 收到消息:[Hello RabbitMq!9log.error],routingKey:[log.error],tag:[amq.ctag-Ml8Iiz8KSEh4RBn4yfA0xA]
8619:43:08.586 [pool-1-thread-24] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerFour - 收到消息:[Hello RabbitMq!0log.error.rabbitmq],routingKey:[log.error.rabbitmq],tag:[amq.ctag-Ml8Iiz8KSEh4RBn4yfA0xA]
8719:43:09.587 [pool-1-thread-25] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerFour - 收到消息:[Hello RabbitMq!1log.error.rabbitmq],routingKey:[log.error.rabbitmq],tag:[amq.ctag-Ml8Iiz8KSEh4RBn4yfA0xA]
8819:43:10.589 [pool-1-thread-26] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerFour - 收到消息:[Hello RabbitMq!2log.error.rabbitmq],routingKey:[log.error.rabbitmq],tag:[amq.ctag-Ml8Iiz8KSEh4RBn4yfA0xA]
8919:43:11.593 [pool-1-thread-26] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerFour - 收到消息:[Hello RabbitMq!3log.error.rabbitmq],routingKey:[log.error.rabbitmq],tag:[amq.ctag-Ml8Iiz8KSEh4RBn4yfA0xA]
9019:43:12.599 [pool-1-thread-26] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerFour - 收到消息:[Hello RabbitMq!4log.error.rabbitmq],routingKey:[log.error.rabbitmq],tag:[amq.ctag-Ml8Iiz8KSEh4RBn4yfA0xA]
9119:43:13.602 [pool-1-thread-26] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerFour - 收到消息:[Hello RabbitMq!5log.error.rabbitmq],routingKey:[log.error.rabbitmq],tag:[amq.ctag-Ml8Iiz8KSEh4RBn4yfA0xA]
9219:43:14.605 [pool-1-thread-26] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerFour - 收到消息:[Hello RabbitMq!6log.error.rabbitmq],routingKey:[log.error.rabbitmq],tag:[amq.ctag-Ml8Iiz8KSEh4RBn4yfA0xA]
9319:43:15.607 [pool-1-thread-26] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerFour - 收到消息:[Hello RabbitMq!7log.error.rabbitmq],routingKey:[log.error.rabbitmq],tag:[amq.ctag-Ml8Iiz8KSEh4RBn4yfA0xA]
9419:43:16.608 [pool-1-thread-26] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerFour - 收到消息:[Hello RabbitMq!8log.error.rabbitmq],routingKey:[log.error.rabbitmq],tag:[amq.ctag-Ml8Iiz8KSEh4RBn4yfA0xA]
9519:43:17.609 [pool-1-thread-26] INFO com.futao.springmvcdemo.mq.rabbit.topic.ConsumerFour - 收到消息:[Hello RabbitMq!9log.error.rabbitmq],routingKey:[log.error.rabbitmq],tag:[amq.ctag-Ml8Iiz8KSEh4RBn4yfA0xA]
96