RabbitMQ的直接模式(Direct)
程序员文章站
2022-07-13 21:28:36
...
什么是直接模式(Direct)模式?
- 我们需要将消息发送给唯一一个节点时使用这种模式,这是最简单的一种形式。
任何发送到Direct Exchange的消息都会被转发到RouteKey 中指定的 Queue。
- 一般情况可以使用 rabbitMQ自带的Exchange:""(改Excchange的名字为空字符串,下文称其为default Exchange)。
- 这种模式下不需要将 Exchange 进行任何绑定(binding)操作。
- 消息传递时需要一个"RouteKey" ,可以简单的理解为要发送到的队列名字。
- 如果Vhost 中不存在RouteKey 中指定的队列名,则该消息会被抛弃。
1),创建Queue(队列)如下
- Durability: 是否做持久化 Durable(持久) transient)(临时)
- Auto delete : 是否自动删除
2),创建一个maven的工程,并把工程修改为springboot项目
2-1),pom添加依赖如下
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
<relativePath/>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2-2),resources 下面新建application.yml配置文件,并配置rabbitmq端口
spring:
rabbitmq:
host: 192.168.11.134
server:
port: 8001
2-3),新建springboot启动类RabbitMQApplication如下
3),编写消息生产者类 ProductTest ,如下在 test 模块下
import com.mq.RabbitMQApplication;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
/** 消息生产者
* @author Administrator
* @version 1.0
* @date 2019/11/29 14:27
*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = RabbitMQApplication.class)
public class ProductTest {
@Autowired
private RabbitTemplate rabbitTemplate;
@Test
public void sendMessage(){
rabbitTemplate.convertAndSend("itcast","我要升职加薪,boss");
}
}
3-1),运行 sendMessage方法 查看是否localhost:15672 下的Queue是否有一条消息,如下
4),接下里编写Customer类--消息消费者
/**
* 消费者
*
* @author Administrator
* @version 1.0
* @date 2019/11/29 14:32
*/
@Component
@RabbitListener(queues = "itcast")
public class Consumer {
@RabbitHandler
public void getMessage(String msg) {
System.out.println("直接模式消费者" + msg);
}
}
4-1),运行启动类,可以在控制台看到刚才发送的消息,如下
问题发现
- 开启多个消费者工程,测试运行消息生产者工程?
- 如何在 IDEA 中多次启动同一个程序呢?
IDEA 多次启用同一程序如下 勾选 Allow parallel run 上允许并行运行如下
1),第一次启动springboot 工程 application.yml 端口为 8001 并把getMessage方法输出内容改为
System.out.println("直接模式消费者111" + msg);
2),把application.yml 改为 8002 并把getMessage方法输出内容改为
System.out.println("直接模式消费者222" + msg);
2),把application.yml 改为 8003 并把getMessage方法输出内容改为
System.out.println("直接模式消费者333" + msg);
2),我们使用生产者的测试方法来进行消息的生产,测试如下
第一条消息被8001 所消费
第二条消息被8002所消费
生产者的第三条消息被8003所消费
发现了什么
- RabbitMQ 自身使用负载均衡,好处是 不会使其中一台服务器压力过大,多台服务器进行平摊压力
推荐阅读
-
变现最为直接的VR线下体验店 出现了三种模式
-
RabbitMQ的简单模式快速入门与超时异常的处理方法
-
RabbitMQ学习第四记:路由模式(direct)
-
rabbitmq-direct(直接交换模式)
-
RabbitMQ的直接模式(Direct)
-
springboot整合rabbitmq 五种模式及死信队列的demo代码
-
RabbitMQ-Direct模式
-
关于RabbitMQ的六种工作模式说明
-
将redis发布订阅模式用做消息队列和rabbitmq的区别?Redis禁用持久化功能的设置?想想为什么要使用MQ?使用了消息队列会有什么缺点?
-
RabbitMQ的5种模式,并使用java进行模拟操作