Success
- 自述
- 简单队列
- 简单队列模型分解
- Java环境
- 生产者
- RabbitMQ客户端查看队列数据
- 消费者
- 总结
- Ending
自述
此篇就开始进入RabbitMQ的实战了,RabbitMQ有6种场景,我会分为6个章节一一描述,本章节描述第一个场景------简单队列。
简单队列
队列是RabbitMQ中邮箱的名称,虽然消息可以通过RabbitMQ和应用程序传递,但它们只能存储在队列中,队列只受主机内存和磁盘的限制,它本质上是一个大型消息缓冲区。RabbitMQ是一个消息代理,它可以接收和转发消息,RabbitMQ类似于邮局,我们将想要邮寄的东西放到邮局,邮局再将我们邮寄的东西送到收件人那里,但它和邮局的区别在于,它不会处理接收的数据,而只是进行存储,存储二进制数据。
简单队列模型分解
生产者无非就是发送,发送消息的程序就是生产者:
队列是RabbitMQ中邮箱的名称,队列只受主机内存和磁盘的限制,它本质上是一个大型消息缓冲区:
消费者与接收具有相似的含义,一个消费者是一个程序,主要是等待接收数据:
生产者或消费者不必非要在一个主机上,应用程序既可以是生产者,也可以是消费者。
Java环境
一、首先将RabbitMQ客户端进行启动,启动教程和下载教程于消息队列----RabbitMQ的学习(一)。
二、导入Pom.xml依赖。
<dependencies>
<!--amqp协议-->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.5.3</version>
</dependency>
<!--slf4j api-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.26</version>
</dependency>
<!--slf4j simple-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.26</version>
<scope>compile</scope>
</dependency>
</dependencies>
生产者
发送消息的程序则为生产者,那么下面我们将构建生产者进行发送数据于队列中。
Send.java
/**
* 简单的队列----producing---生产者
* 1.RabbitMQ的核心就是基于通道(Channel)进行开展的
* 2.通道的概念非常常见,例如:NIO的三大核心其中有一项就是通道
*/
public class Send {
private static final String QUEUE_NAME = "yunkai_queue"; //队列名称
public static void main(String[] args) {
try {
//获取RabbitMQ连接
Connection connection = ConnectionUtil.getConnection();
//获取管道
Channel channel = connection.createChannel();
/**
* 创建队列
* paramone:队列名称
* 其余参数后续场景会依次开启
*/
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
/**
* channel.basicPublish() --- 进行发送消息
* paramtwo:队列名称
* paramfour:存储的数据(字节形式)
* 可通过循环发送信息到队列中
*/
for (int i = 0; i < 1; i++) {
String msg = "Hell Word,this is queue" + (i + 1);
channel.basicPublish("", QUEUE_NAME, null, msg.getBytes());
}
//消息发送成功
System.out.println("===send msg success===");
} catch (Exception e) {
e.printStackTrace();
}
}
}
ConnectionUtil.java
/**
* Rabbitmq的工具类
* methodone:连接
* methodtwo关闭链接
*/
public class ConnectionUtil {
private static final String HOST = "127.0.0.1"; //访问地址
private static final String USER_NAME = "guest"; //用户名
private static final String PWD = "guest"; //密码
private static final String VIRTUAL_HOST = "/"; //虚拟主机
private static final Integer PORT = 5672; //amqp协议端口
/**
* 获取连接对象
*
* @return
* @throws Exception
*/
public static Connection getConnection() throws Exception {
ConnectionFactory factory = new ConnectionFactory(); //Rabbitmq连接工厂
factory.setHost(HOST); //主机
factory.setUsername(USER_NAME); //用户名
factory.setPassword(PWD); //pwd
factory.setVirtualHost(VIRTUAL_HOST);
factory.setPort(PORT);
return factory.newConnection();
}
/**
* 关闭连接
*
* @param con
* @param channel
*/
public static void closeConnection(Connection con, Channel channel) {
try {
if (channel != null)
channel.close();
if (con != null)
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
以上代码都完成之后,运行Send类的main()方法,将生产数据并发送到到队列中。
RabbitMQ客户端查看队列数据
生产者生产数据成功之后可以通过RabbitMQ客户端查看队列的消息。
当点击Get Message按钮的时候,队列的消息会以列表的方式呈现出来。
消费者
与生产者不同,消费者监听RabbitMQ消息并获取RabbitMQ消息。
Recv.java
/**
1. 简单的队列---Recv----消费者
2. 1.消费者无非就是获取数据/使用数据
*/
public class Recv {
private static final String QUEUE_NAME = "yunkai_queue"; //队列名称---在某个队列中读取数据
public static void main(String[] args) {
try {
//连接RabbitMQ
Connection connection = ConnectionUtil.getConnection();
//创建队列
Channel channel = connection.createChannel();
/**
* 创建队列---和生产者代码一致
* 注意:生产者或消费者程序不存在优先级关系,所以在此声明队列的原因,是保证队列存在
*/
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
/**
* 内部静态类 --实现方法①
* Lambda表达式--实现方法②
* lambda实现方式前提:必须是函数式接口(一个接口中只有一个方法)
*/
DeliverCallback deliverCallback = new DeliverCallback() {
@Override
public void handle(String s, Delivery delivery) throws IOException {
//delivery.getBody()返回的是二进制数组-字节数组
String returnmsg = new String(delivery.getBody(), "utf-8");
System.out.println("成功读取到的消息为======" + returnmsg);
}
};
/**
* 消费者
*/
channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumer -> {
});
} catch (Exception e) {
e.printStackTrace();
}
}
}
DeliverCallback子类所做的事情则是,告诉服务器将队列中的消息传递给我们,因为它是异步形式推送消息,所以我们提供了一个对象形式的回调,该对象将缓冲消息,我们使用的时候拿来用即可。
总结
简单队列在此就完结了,对于简单队列场景,我进行了一个总结如下:
- 简单队列的实现方式由单个生产者和单个消费者所组成,但只适用于简单的队列场景。
- 简单队列的优点在于如其名,简单粗暴,易理解,易上手,适合初学者。
Ending
到这里也就接近尾声了,本篇文章是RabbitMQ系列的第二章,如果您是初学者的话,建议从第一章看起,毕竟练武不练功,到老一场空嘛~~~