From cb9cb79904faf8f9df5068b32c6cc74437609632 Mon Sep 17 00:00:00 2001 From: bunny <1319900154@qq.com> Date: Mon, 19 May 2025 10:55:52 +0800 Subject: [PATCH] =?UTF-8?q?:memo:=20=E7=94=9F=E4=BA=A7=E8=80=85=E7=AB=AF?= =?UTF-8?q?=E6=B6=88=E6=81=AF=E7=A1=AE=E8=AE=A4=E6=9C=BA=E5=88=B6-RabbitMQ?= =?UTF-8?q?=E9=85=8D=E7=BD=AE-=E5=A4=87=E4=BB=BD=E4=BA=A4=E6=8D=A2?= =?UTF-8?q?=E6=9C=BA-=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ReadMe.md | 3 +- mq-demo/ReadMe.md | 169 ++++++++++++++++++ mq-demo/images/image-20250519104914787.png | Bin 0 -> 12025 bytes mq-demo/images/image-20250519105042156.png | Bin 0 -> 26335 bytes mq-demo/images/image-20250519105250365.png | Bin 0 -> 15767 bytes mq-demo/push.sh | 5 - mq-demo/src/main/resources/application.yaml | 10 +- .../src/main/resources/templates/index.html | 69 +++---- 8 files changed, 204 insertions(+), 52 deletions(-) create mode 100644 mq-demo/ReadMe.md create mode 100644 mq-demo/images/image-20250519104914787.png create mode 100644 mq-demo/images/image-20250519105042156.png create mode 100644 mq-demo/images/image-20250519105250365.png delete mode 100644 mq-demo/push.sh diff --git a/ReadMe.md b/ReadMe.md index 02a16a6..d063947 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,4 +1,5 @@ # 教程和Demo相关 1. Drools -2. vue的v-model绑定 \ No newline at end of file +2. vue的v-model绑定 +3. RabbitMQ示例 \ No newline at end of file diff --git a/mq-demo/ReadMe.md b/mq-demo/ReadMe.md new file mode 100644 index 0000000..2959af9 --- /dev/null +++ b/mq-demo/ReadMe.md @@ -0,0 +1,169 @@ +# RabbitMQ + +## 基本示例 + +**生产者** + +```java +@SpringBootTest +class MqDemoApplicationTests { + + @Autowired + private RabbitTemplate rabbitTemplate; + + /** + * 1. 测试发送消息,示例代码 + * 2. 测试成功的情况 + */ + @Test + void publishTest() { + String exchangeDirect = RabbitMQMessageListenerConstants.EXCHANGE_DIRECT; + String routingKeyDirect = RabbitMQMessageListenerConstants.ROUTING_KEY_DIRECT; + rabbitTemplate.convertAndSend(exchangeDirect, routingKeyDirect, "你好小球球~~~"); + + Bunny bunny = Bunny.builder().rabbitName("Bunny").age(2).build(); + rabbitTemplate.convertAndSend(exchangeDirect, routingKeyDirect, JSON.toJSONString(bunny)); + } + +} +``` + +**消费者** + +```java +@Component +@Slf4j +public class MessageListenerOrder { + + @RabbitListener(bindings = @QueueBinding( + exchange = @Exchange(value = EXCHANGE_DIRECT), + value = @Queue(value = QUEUE_NAME, durable = "true"), + key = ROUTING_KEY_DIRECT + ) + ) + public void processMessage(String dataString, Message message, Channel channel) { + System.out.println("消费端接受消息:" + dataString); + } + +} +``` + +## 可靠性 + +在Rabbi中队列和交换机都是持久化的,自动删除都是False。 + +### 生产者确认 + +**配置文件** + +```yaml +rabbitmq: + host: ${bunny.rabbitmq.host} + port: ${bunny.rabbitmq.port} + username: ${bunny.rabbitmq.username} + password: ${bunny.rabbitmq.password} + virtual-host: ${bunny.rabbitmq.virtual-host} + publisher-confirm-type: correlated # 交换机确认 + publisher-returns: true # 队列确认 +``` + +#### RabbitMQ配置 + +> [!NOTE] +> **@PostConstruct 注解** +> **作用**:在Bean依赖注入完成后执行初始化方法(构造器之后,`afterPropertiesSet()`之前)。 +> +> **特点**: +> - 方法需**无参**、返回**void**,名称任意 +> - 执行顺序:构造器 → 依赖注入 → `@PostConstruct` +> - 若抛出异常,Bean创建会失败 +> +> **注意**: +> - 代理类(如`@Transactional`)中,会在**原始对象**初始化时调用 +> - `prototype`作用域的Bean每次创建均会执行 +> - 避免耗时操作,推荐轻量级初始化 +> +> **替代方案**: +> `InitializingBean`接口 或 `@Bean(initMethod="xxx")` + +```java +@Slf4j +@Configuration +@RequiredArgsConstructor +public class RabbitConfiguration implements RabbitTemplate.ConfirmCallback, RabbitTemplate.ReturnsCallback { + + private final RabbitTemplate rabbitTemplate; + + @PostConstruct + public void initRabbitTemplate() { + rabbitTemplate.setConfirmCallback(this); + rabbitTemplate.setReturnsCallback(this); + } + + @Override + public void confirm(CorrelationData correlationData, boolean ack, String cause) { + System.out.println("============correlationData <回调函数打印> = " + correlationData); + System.out.println("============ack <输出> = " + ack); + System.out.println("============cause <输出> = " + cause); + } + + @Override + public void returnedMessage(ReturnedMessage returnedMessage) { + // 发送到队列失败才会走这个 + log.error("消息主体:{}", returnedMessage.getMessage().getBody()); + log.error("应答码:{}", returnedMessage.getReplyCode()); + log.error("消息使用的父交换机:{}", returnedMessage.getExchange()); + log.error("消息使用的路由键:{}", returnedMessage.getRoutingKey()); + } +} +``` + +**测试失败的情况** + +交换机找不到 + +```java +/* 测试失败交换机的情况 */ +@Test +void publishExchangeErrorTest() { + String exchangeDirect = RabbitMQMessageListenerConstants.EXCHANGE_DIRECT; + String routingKeyDirect = RabbitMQMessageListenerConstants.ROUTING_KEY_DIRECT; + rabbitTemplate.convertAndSend(exchangeDirect, routingKeyDirect, "----失败的消息发送----"); + + Bunny bunny = Bunny.builder().rabbitName("Bunny").age(2).build(); + rabbitTemplate.convertAndSend(exchangeDirect + "~", routingKeyDirect, JSON.toJSONString(bunny)); +} +``` + +队列找不到 + +```java +/* 测试失败队列的情况 */ +@Test +void publishQueueErrorTest() { + String exchangeDirect = RabbitMQMessageListenerConstants.EXCHANGE_DIRECT; + String routingKeyDirect = RabbitMQMessageListenerConstants.ROUTING_KEY_DIRECT; + rabbitTemplate.convertAndSend(exchangeDirect, routingKeyDirect, "----失败的队列发送----"); + + Bunny bunny = Bunny.builder().rabbitName("Bunny").age(2).build(); + rabbitTemplate.convertAndSend(exchangeDirect, routingKeyDirect + "~", JSON.toJSONString(bunny)); +} +``` + +#### 备份交换机 + +> [!NOTE] +> +> 创建好的交换机是无法修改的,只能删除重新建立。 + +创建广播类型的交换机,因为没有路由键,只能通过广播的方式去找。 + +![image-20250519104914787](./images/image-20250519104914787.png) + +创建与备份交换机的队列,交换机是广播的模式,不指定路由键。 + +![image-20250519105042156](./images/image-20250519105042156.png) + +通过指定`Alternate exchange`的交换机进行绑定。第一个填写的不是备份交换机,是投递交换机,之后通过`Alternate exchange`绑定备份的交换机。 + +![image-20250519105250365](./images/image-20250519105250365.png) \ No newline at end of file diff --git a/mq-demo/images/image-20250519104914787.png b/mq-demo/images/image-20250519104914787.png new file mode 100644 index 0000000000000000000000000000000000000000..be283cbd1829df3f3ea9a4455223839c1fd9a353 GIT binary patch literal 12025 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 CUta(K literal 0 HcmV?d00001 diff --git a/mq-demo/images/image-20250519105250365.png b/mq-demo/images/image-20250519105250365.png new file mode 100644 index 0000000000000000000000000000000000000000..5abaec302f9f371735690beec6160a6ce6df428f GIT binary patch literal 15767 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 KkkXGj-~JE(QQyD- literal 0 HcmV?d00001 diff --git a/mq-demo/push.sh b/mq-demo/push.sh deleted file mode 100644 index 7b9a8ff..0000000 --- a/mq-demo/push.sh +++ /dev/null @@ -1,5 +0,0 @@ -git checkout master -git merge dev -git push --all -git push --tags -git checkout dev diff --git a/mq-demo/src/main/resources/application.yaml b/mq-demo/src/main/resources/application.yaml index 604d28c..b2cde8c 100644 --- a/mq-demo/src/main/resources/application.yaml +++ b/mq-demo/src/main/resources/application.yaml @@ -13,11 +13,11 @@ spring: username: ${bunny.rabbitmq.username} password: ${bunny.rabbitmq.password} virtual-host: ${bunny.rabbitmq.virtual-host} - publisher-confirm-type: correlated # 交换机确认 - publisher-returns: true # 队列确认 - # listener: - # simple: - # acknowledge-mode: manual # 手动处理消息 + # publisher-confirm-type: correlated # 交换机确认 + # publisher-returns: true # 队列确认 + listener: + simple: + acknowledge-mode: manual # 手动处理消息 # connection-timeout: 1s # 设置MQ连接超时时间 # template: # retry: diff --git a/mq-demo/src/main/resources/templates/index.html b/mq-demo/src/main/resources/templates/index.html index 2b089e4..a81542e 100644 --- a/mq-demo/src/main/resources/templates/index.html +++ b/mq-demo/src/main/resources/templates/index.html @@ -147,7 +147,8 @@

通过实践项目学习消息队列的核心概念与应用场景

@@ -291,60 +292,46 @@
-

生产者配置

+

生产者示例

-
@Configuration
-public class RabbitMQConfig {
+                    

+@Autowired
+private RabbitTemplate rabbitTemplate;
 
-    @Bean
-    public Queue helloQueue() {
-        return new Queue("hello", true);
-    }
+/* 测试发送消息 */
+@Test
+void publishTest() {
+    String exchangeDirect = RabbitMQMessageListenerConstants.EXCHANGE_DIRECT;
+    String routingKeyDirect = RabbitMQMessageListenerConstants.ROUTING_KEY_DIRECT;
+    rabbitTemplate.convertAndSend(exchangeDirect, routingKeyDirect, "你好小球球~~~");
 
-    @Bean
-    public DirectExchange directExchange() {
-        return new DirectExchange("direct.exchange");
-    }
-
-    @Bean
-    public Binding binding(Queue helloQueue,
-                         DirectExchange directExchange) {
-        return BindingBuilder.bind(helloQueue)
-               .to(directExchange)
-               .with("routing.key");
-    }
+    Bunny bunny = Bunny.builder().rabbitName("Bunny").age(2).build();
+    rabbitTemplate.convertAndSend(exchangeDirect, routingKeyDirect, JSON.toJSONString(bunny));
+}
 }

消费者示例

-
@Component
-@RabbitListener(queues = "hello")
-public class MessageConsumer {
-
-    private static final Logger logger =
-        LoggerFactory.getLogger(MessageConsumer.class);
-
-    @RabbitHandler
-    public void receive(String message,
-                      Channel channel,
-                      @Header(AmqpHeaders.DELIVERY_TAG) long tag) {
-        try {
-            logger.info("Received message: {}", message);
-            // 业务处理逻辑
-            channel.basicAck(tag, false);
-        } catch (Exception e) {
-            channel.basicNack(tag, false, true);
-        }
-    }
-}
+

+@RabbitListener(bindings = @QueueBinding(
+        exchange = @Exchange(value = EXCHANGE_DIRECT),
+        value = @Queue(value = QUEUE_NAME, durable = "true"),
+        key = ROUTING_KEY_DIRECT
+)
+)
+public void processMessage(String dataString, Message message, Channel channel) {
+    System.out.println("消费端接受消息:" + dataString);
+}
+