RabbitMQ的工作模式
一、模式概述
RabbitMQ提供了6种工作模式:简单模式、工作队列模式、订阅模式、路由模式、通配符模式、远程调用模式
其中远程调用模式(RPC)暂不作介绍。
官网对于模式介绍:https://www.rabbitmq.com/getstarted.html
二、简单模式 HelloWorld
2.1、模式说明
在上图的模型中,有以下概念:
- P:生产者,也就是要发送消息的程序
- C:消费者,消息的接收者,会一直等待消息到来
- Queue:消息队列,图中红色部分。类似一个邮箱,可以缓存消息;生产者向其中投递消息,消费者从其中取出消息。
2.2、代码举例
需求:使用简单模式完成消息传递
步骤:
- 创建工程(生产者、消费者)
- 分别添加依赖
- 编写生产者发送消息
- 编写消费者接收消息
1、创建工程
创建空项目RabbitMQ,然后在RabbitMQ下面创建生产者rabbitmq-producer、消费者rabbitmq-consumer模块(New Module - Build System选Maven)
2、添加依赖和编译插件
这里生产者和消费者是一样的
maven-compiler-plugin 插件是一个 Maven 插件,用来编译项目代码。
自从3.0开始默认的编译器是 javax.tools.JavaCompiler,用来编译 Java 源码;
如果你想强制插件使用 javac 编译器,你必须配置插件的属性 forceJavacCompilerUse;
还要注意,当前默认源(source)设置为 1.8,默认目标(target)设置为 1.8。独立运行 Maven 和 JDK,可以通过 source 和 target 选项更改他们的默认值;
插件设置的各种参数信息请查看
http://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html#forceJavacCompilerUse
<dependencies>
<!--rabbitmq java 客户端-->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.6.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
3、编写生产者发送消息
public class Producer_HelloWorld {
public static void main(String[] args) throws IOException, TimeoutException {
// 1、创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
// 2、设置参数
factory.setHost("192.168.3.100"); // ip 默认值 localhost
factory.setPort(5673); // 端口 默认值 5672
factory.setVirtualHost("/"); // 虚拟机 默认值 /
factory.setUsername("guest"); // 用户名 默认值 guest
factory.setPassword("guest"); // 密码 默认值 guest
// 3、创建连接 Connection
Connection connection = factory.newConnection();
// 4、创建频道 Channel
Channel channel = connection.createChannel();
// 5、创建队列 Queue
/*
queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments)
参数:
1、queue:队列名称
2、durable:是否持久化,当mq重启之后,还在
3、exclusive:
* 是否独占。只能有一个消费者监听这队列
* 当Connection关闭时,是否删除队列
4、autoDelete:是否自动化删除。当没有Consumer时,自动删掉
5、arguments:参数。
*/
// 如果没有一个名字叫 Hello_World 的队列,则会创建该队列,如果有则不会创建
channel.queueDeclare("Hello_World", true, false, false, null);
// 6、发送消息
/*
basicPublish(String exchange, String routingKey, AMQP.BasicProperties props, byte[] body)
参数:
1、exchange:交换机名称。简单模式下交换机会使用默认的 ""
2、routingKey:路由名称
3、props:配置信息
4、body:发送消息数据
*/
String body = "Hello RabbitMQ~~~";
channel.basicPublish("", "Hello_World", null, body.getBytes());
// 7、释放资源
channel.close();
connection.close();
}
}
4、编写消费者接收消息
public class Consumer_HelloWorld {
public static void main(String[] args) throws IOException, TimeoutException {
// 1、创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
// 2、设置参数
factory.setHost("192.168.3.100"); // ip 默认