1.RabbitMQ中的简单模式架构介绍:
1.简单模式复习;
- 1.在Rabbit的应用章节中,我们创建了一个工作队列。我们假设的是工作队列背后,每个任务都恰好交付给一个消费者(工作进程),即简单模式
- 1.RabbitMQ简单模式的工作流程:生产者发送单个消息的,接收消息并打印出来的消费者。
“ P”是我们的生产者,“ C”是我们的消费者
。中间的框是一个队列--RabbitMQ 代表使用者保留的消息缓冲区
2.编码实现RabbitMQ中的简单模式
2.1.创建空工程:
- 1.创建空工程
是为了把所有的代码都同一的放在空工程中
- 2.空工程创建完毕后,可以设置JDK版本、设置字符集、Maven路径等,这样后面建的模块就不用再逐个设置更改了
2.2.新建第一个模块
a.创建新的模块:
b.设定项目名称:
c.在pom文件中引入依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.jianqun</groupId>
<artifactId>rabbitmq-hello</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!--rabbitmq 依赖客户端-->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.8.0</version>
</dependency>
<!--文件操作流的一个依赖-->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.6</version>
</dependency>
</dependencies>
<!-- 指定jdk版本 -->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
</project>
2.3.实现发送消息的需求:
a.生产者:Producer.java
package com.jianqun.rabbitmq.one;
import com.rabbitmq.client.*;
public class Producer {
//队列的名称
private final static String QUEUE_NAME = "hello";
public static void main(String[] args) throws Exception {
//创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
//工厂连接ip 连接RabbitMQ的队列
factory.setHost("192.168.148.3");
factory.setUsername("admin");
factory.setPassword("123");
//创建连接,连接后要获取里面的信道去发送消息
Connection connection = factory.newConnection();
//创建信道,信道是用来发送消息的
Channel channel = connection.createChannel();
/**
* 创建一个队列,其参数的含义如下所示:
* 1.队列名称
* 2.队列里面的消息是否持久化 默认消息存储在内存中,true代表持久化
* 3.该队列是否只供一个消费者进行消费 是否进行共享,true可以多个消费者消费
* 4.是否自动删除,最后一个消费者端开连接以后,该队列是否自动删除,true自动删除
* 5.其他参数
*/
channel.queueDeclare(QUEUE_NAME,false,false,false,null);
//要发送的消息内容
String message="hello";
/**
* 使用信道去发送一个消息到队列中
* 1.发送到哪个交换机(这里先置为空,使用默认值)
* 2.路由的 key 是哪个,这里使用队列的名称
* 3.其他的参数信息
* 4.发送消息的消息体
*/
channel.basicPublish("",QUEUE_NAME,null,message.getBytes());
System.out.println("消息发送完毕");
}
}
b.消费者:Consumer .java
package com.jianqun.rabbitmq.one;
import com.rabbitmq.client.*;
/**
* 消费者
*
*/
public class Consumer {
//队列的名称
private final static String QUEUE_NAME = "hello";
public static void main(String[] args) throws Exception {
//创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.148.3");
factory.setUsername("admin");
factory.setPassword("123");
Connection connection = factory.newConnection();//创建连接
Channel channel = connection.createChannel();//创建信道
System.out.println("等待接收消息....");
/**
* 消费者消费消息
* 1.消费哪个队列中的消息
* 2.消费成功之后是否要自动应答,true代表自动应答,false手动应答
* 3.消费者未成功消费的回调
* 4.消费者取消消费的回调
*/
channel.basicConsume(QUEUE_NAME,true,deliverCallback,cancelCallback);
//推送的消息如何进行消费的接口回调
DeliverCallback deliverCallback=(consumerTag, delivery)->{
String message= new String(delivery.getBody());
System.out.println("接受到的消息内容是::" + message);
};
//取消消费的一个回调接口 如在消费的时候队列被删除掉了
CancelCallback cancelCallback=(consumerTag)->{
System.out.println("消息消费被中断");
};
}
}