如何设计响应式网站,网页美术设计专业,黑色企业网站,平台推广员rabbitmq五种模式的实现——springboot 基础知识和javase的实现形式可以看我之前的博客 代码地址#xff1a;https://github.com/9lucifer/rabbitmq4j-learning 一、进行集成
#xff08;一#xff09;Spring Boot 集成 RabbitMQ 概述
Spring Boot 提供了对 RabbitMQ 的自…rabbitmq五种模式的实现——springboot 基础知识和javase的实现形式可以看我之前的博客 代码地址https://github.com/9lucifer/rabbitmq4j-learning 一、进行集成
一Spring Boot 集成 RabbitMQ 概述
Spring Boot 提供了对 RabbitMQ 的自动配置支持通过 RabbitTemplate 和 RabbitListener 可以方便地实现消息的生产和消费。以下是基于 Spring Boot 的 RabbitMQ 集成示例。 二生产者代码解析
生产者负责创建消息并将其发送到指定的队列中。
1. 配置文件application.yml
spring:rabbitmq:host: 自己服务器的ip # RabbitMQ 服务器地址port: 5672 # RabbitMQ 端口号username: admin # RabbitMQ 用户名password: admin # RabbitMQ 密码virtual-host: / # 虚拟主机默认是 /
server:port: 8081 # 应用端口2. 生产者代码Controller
package top.miqiu.controller;import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;RestController
public class SendController {Autowiredprivate RabbitTemplate rabbitTemplate;GetMapping(/sendMsg)public String sendMsg(RequestParam String msg) {// 发送消息到队列 boot_queuerabbitTemplate.convertAndSend(, boot_queue, msg);return 发送成功: msg;}
}关键
RabbitTemplateSpring 提供的 RabbitMQ 操作模板用于发送消息。convertAndSend发送消息到指定队列。GetMapping定义一个 GET 请求接口路径为 /sendMsg。
效果 三消费者代码解析
消费者负责从队列中接收并处理消息。
消费者代码Listener
package top.miqiu.controller;import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;Component
public class Receive {RabbitListener(queuesToDeclare Queue(boot_queue))public void consumer(String msg) {System.out.println(消息内容为 msg);}
}关键
RabbitListener监听指定队列当队列中有消息时自动调用 consumer 方法。queuesToDeclare如果队列不存在会自动创建队列。
效果 二、工作模式
一生产者 生产者通过 RabbitTemplate 将消息发送到 RabbitMQ 的队列中。 关键代码解析 java复制 rabbitTemplate.convertAndSend(, boot_work, msg i);rabbitTemplateRabbitMQ 的核心操作类用于发送消息。convertAndSend 方法 第一个参数是交换机名称这里为空字符串表示默认交换机。第二个参数是队列名称boot_work。第三个参数是消息内容msg i。 循环发送代码中通过循环发送了 20 条消息每条消息内容为 msg i。 运行逻辑 生产者调用 /sendMsg 接口时会将消息发送到队列 boot_work 中消息内容为循环生成的字符串。 二消费者 功能描述 消费者从队列中接收消息并处理处理完成后发送确认信号。 关键代码解析 RabbitListener(queuesToDeclare Queue(boot_work))RabbitListener注解用于监听指定队列的消息。queuesToDeclare声明队列名称boot_work。Queue声明队列的详细信息。 public void consumer(String msg,Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag,Channel channel
) throws IOException, InterruptedException {Thread.sleep(1000); // 模拟消息处理时间channel.basicAck(deliveryTag, true); // 确认消息已处理System.out.println(消费者1 消息内容为 msg);
}msg接收到的消息内容。deliveryTag消息的唯一标识用于确认消息是否成功处理。ChannelRabbitMQ 的通道用于执行消息确认操作。basicAck确认消息已处理避免消息重复发送。 第一个参数是 deliveryTag。第二个参数是 multiple表示是否批量确认。 运行逻辑 消费者监听队列 boot_work接收到消息后模拟处理时间Thread.sleep(1000)然后通过 channel.basicAck 发送确认信号表示消息已处理完成。
三效果 可以看到休眠的时长不同消费的速度不同侧面证明该模式适用于任务分配场景多个消费者可以并行处理任务提高效率。
三、Pub/Sub 模式
一Pub/Sub 模式概述
Pub/Sub发布/订阅模式是一种消息传递模式生产者将消息发送到一个交换机Exchange而不是直接发送到队列。消费者通过绑定交换机来接收消息。这种模式允许多个消费者订阅同一个消息源实现消息的广播。
二生产者 功能描述 生产者通过 RabbitTemplate 将消息发送到一个名为 boot-pubsub 的交换机。 关键代码解析 rabbitTemplate.convertAndSend(boot-pubsub, , msg);convertAndSend 方法 第一个参数是交换机名称boot-pubsub。第二个参数是路由键这里为空字符串表示不指定路由键。第三个参数是消息内容msg。 交换机类型boot-pubsub 是一个 fanout 类型的交换机它会将消息广播到所有绑定的队列。 运行逻辑 生产者调用 /sendPubsub 接口时将消息发送到 boot-pubsub 交换机交换机会将消息广播到所有绑定的队列。 运行结果 三消费者 功能描述 消费者通过绑定到 boot-pubsub 交换机接收消息并处理接收到的消息。 关键代码解析 RabbitListener(bindings QueueBinding(value Queue,exchange Exchange(value boot-pubsub, type fanout)))
public void consumer(String msg) {System.out.println(consumer 4 消息内容为 msg);
}RabbitListener注解用于监听消息。QueueBinding声明队列与交换机的绑定关系。 value Queue声明一个匿名队列。exchange Exchange声明交换机的名称boot-pubsub和类型fanout。 consumer 方法处理接收到的消息并打印消息内容。 运行逻辑 消费者绑定到 boot-pubsub 交换机接收所有广播的消息并打印消息内容。 运行效果 四Pub/Sub 模式特点
广播机制 生产者发送的消息会被广播到所有绑定到交换机的队列多个消费者可以同时接收相同的消息。解耦合 生产者和消费者之间通过交换机解耦生产者无需知道消费者的存在消费者也无需知道生产者的存在。动态绑定 可以动态添加或移除消费者而无需修改生产者的代码。 四、Routing 模式
一Routing 模式概述
Routing 模式是一种基于路由键Routing Key的消息路由模式。生产者将消息发送到 direct 类型的交换机并指定一个路由键。消费者通过绑定到交换机并指定绑定键Binding Key来接收消息。只有路由键与绑定键完全匹配时消息才会被路由到对应的队列。 二生产者 功能描述 生产者通过 RabbitTemplate 将消息发送到 boot-routing 交换机并指定路由键key。 关键代码解析 rabbitTemplate.convertAndSend(boot-routing, key, msg);boot-routing交换机名称类型为 direct。key路由键由方法参数传入用于指定消息的路由规则。msg消息内容由方法参数传入。 运行逻辑 生产者调用 /sendRouting 接口时将消息发送到 boot-routing 交换机并通过路由键决定消息的去向。 三消费者 功能描述 消费者通过绑定到 boot-routing 交换机接收消息并处理接收到的消息。 关键代码解析 RabbitListener(bindings QueueBinding(value Queue,exchange Exchange(value boot-routing, type direct),key {trace}))
public void consumer(String msg) {System.out.println(consumer 6 消息内容为 msg);
}RabbitListener注解用于监听消息。QueueBinding声明队列与交换机的绑定关系。 value Queue声明一个匿名队列。exchange Exchange声明交换机的名称boot-routing和类型direct。key {trace}绑定键表示该队列只接收路由键为 trace 的消息。 consumer 方法处理接收到的消息并打印消息内容。 运行逻辑 消费者绑定到 boot-routing 交换机并通过绑定键 trace 接收匹配的消息。 四Routing 模式特点 精确匹配 direct 类型的交换机要求路由键与绑定键完全匹配消息才会被路由到对应的队列。 多队列绑定 一个交换机可以绑定多个队列每个队列可以指定不同的绑定键。 解耦合 生产者和消费者之间通过交换机解耦生产者无需知道消费者的存在消费者也无需知道生产者的存在。
五、Topic 模式
一Topic 模式概述
Topic 模式是一种灵活的发布/订阅消息模式适用于需要根据动态路由规则分发消息的场景。生产者将消息发送到一个 topic 类型的交换机并指定一个路由键Routing Key。消费者通过绑定交换机并指定匹配规则Binding Key来接收消息。topic 类型的交换机支持模糊匹配允许更灵活的消息路由。
二生产者 功能描述 生产者通过 RabbitTemplate 将消息发送到 boot-topic 交换机并指定路由键key。 关键代码解析 rabbitTemplate.convertAndSend(boot-topic, key, msg);boot-topic交换机名称类型为 topic。key路由键由方法参数传入用于指定消息的路由规则。例如user.login 或 user.register。msg消息内容由方法参数传入。 运行逻辑 生产者调用 /sendTopic 接口时将消息发送到 boot-topic 交换机并通过路由键决定消息的去向。交换机会根据绑定规则将消息路由到匹配的队列。 三消费者 功能描述 消费者通过绑定到 boot-topic 交换机接收消息并处理接收到的消息。 关键代码解析 RabbitListener(bindings QueueBinding(value Queue,exchange Exchange(value boot-topic, type topic),key {user.*}))
public void consumer(String msg) {System.out.println(consumer 8 user.* 消息内容为 msg);
}RabbitListener注解用于监听消息。QueueBinding声明队列与交换机的绑定关系。 value Queue声明一个匿名队列。exchange Exchange声明交换机的名称boot-topic和类型topic。key {user.\*}绑定键表示该队列只接收路由键以 user. 开头的消息例如 user.login 或 user.register。 consumer 方法处理接收到的消息并打印消息内容。 运行逻辑 消费者绑定到 boot-topic 交换机并通过绑定键 user.* 接收匹配的消息。例如生产者发送路由键为 user.login 的消息时该消费者会接收并处理该消息。 四Topic 模式特点
灵活的路由规则 topic 类型的交换机支持模糊匹配 *星号匹配一个单词。#井号匹配零个或多个单词。 例如路由键为 user.login 的消息可以被绑定键为 user.* 或 user.login 的队列接收。 动态绑定 消费者可以根据需要动态绑定不同的队列而无需修改生产者的代码。解耦合 生产者和消费者之间通过交换机解耦生产者无需知道消费者的存在消费者也无需知道生产者的存在。 五注意事项
交换机类型 确保交换机类型为 topic因为 topic 类型的交换机支持模糊匹配。绑定键的正确性 消费者需要正确设置绑定键key否则无法接收到匹配的消息。路由键的格式 路由键应使用点分隔符.例如 user.login 或 trace.error以符合 topic 交换机的匹配规则。队列声明 如果使用匿名队列Queue队列会在消费者启动时自动创建但在 RabbitMQ 管理界面中可能看不到队列名称。如果需要持久化队列可以显式声明队列名称。消息丢失问题 如果没有消费者绑定到匹配的路由键消息可能会丢失。可以通过设置交换机的 DLXDead Letter Exchange来处理未消费的消息。