RabbitMQ简介
RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件)。RabbitMQ服务器是用Erlang语言编写的,而群集和故障转移是构建在开放电信平台框架上的。所有主要的编程语言均有与代理接口通讯的客户端库。 —摘自《百度百科》
直连模式
官网图解(https://www.rabbitmq.com/getstarted.html)
Java程序实现
实现步骤
- 第一步: 建立连接
- 第二步: 建立通道
- 第三步: 绑定消息队列
- 第四步: 发送消息
- 第五步: 关闭连接跟通道(消费者不关闭,时刻处于监听状态)
代码实现
生产者
package com.mahy.helloworld;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* @Auther : mahy
* @Date : 2020/7/27 15:26
* @Description : 直连模式--HelloWorld.
*/
public class Provider {
public static void main(String[] args) throws IOException, TimeoutException {
//设置属性
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.43.129"); //设置RabbitMQ所在主机IP
factory.setPort(5672); //设置端口号
factory.setVirtualHost("/nxxm"); //设置虚拟主机 类似于MySQL的数据库
factory.setUsername("nxxm"); //设置虚拟主机绑定的用户名
factory.setPassword("nxxm"); //设置用户密码
//建立连接
Connection connection = factory.newConnection();
//建立通道
Channel channel = connection.createChannel();
/**
* 给通道绑定消息队列
* 参数一:消息队列的名称
* 参数二:队列是否持久化 注意:只持久化队列 不持久化消息
* 参数三:是否独占队列
* 参数四:是否在消费完成后自动删除队列
* 参数五:额外附加参数
* 注意: 生产者参数要与消费者参数绑定时保持一致 不然报错
*/
channel.queueDeclare("nx",true,false,false,null);
/**
* 发送消息
* 参数一:交换机名称
* 参数二:发往消息的队列名称
* 参数三:传递消息的额外设置 eg:MessageProperties.PERSISTENT_TEXT_PLAIN 消息持久化 前提是队列持久化
* 参数四:消息的具体内容 字节类型
*/
channel.basicPublish("","nx",null,"This is a HelloWorld Message".getBytes());
//关闭连接
channel.close();
connection.close();
}
}
消费者
package com.mahy.helloworld;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* @Auther : mahy
* @Date : 2020/7/27 15:49
* @Description : Please describe here.
*/
public class Customer {
public static void main(String[] args) throws IOException, TimeoutException {
//设置属性
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.43.129"); //设置RabbitMQ所在主机IP
factory.setPort(5672); //设置端口号
factory.setVirtualHost("/nxxm"); //设置虚拟主机 类似于MySQL的数据库
factory.setUsername("nxxm"); //设置虚拟主机绑定的用户名
factory.setPassword("nxxm"); //设置用户密码
//建立连接
Connection connection = factory.newConnection();
//建立通道
Channel channel = connection.createChannel();
/**
* 给通道绑定消息队列
* 参数一:消息队列的名称
* 参数二:队列是否持久化 注意:只持久化队列 不持久化消息
* 参数三:是否独占队列
* 参数四:是否在消费完成后自动删除队列
* 参数五:额外附加参数
* 注意: 生产者参数要与消费者参数绑定时保持一致 不然报错
*/
channel.queueDeclare("nx",true,false,false,null);
/**
* 消费消息
* 参数一:要消费的消息队列名称
* 参数二:是否开启消息确认机制
* 参数三:消费时的回调函数
*/
channel.basicConsume("",true,new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("消费者消费:" + new String(body));
}
});
//不关闭连接跟通道
}
}
结果
启动消费者处于监控状态,RUN生产者发送消息,消费者消费消息如图:
重置代码(建立连接工具类)
每次生产者发送消息时,都要复写建立连接的代码,造成代码冗余,为了方便以及代码的复用性,创建连接工具类:
package com.mahy.utils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
/**
* @Auther : mahy
* @Date : 2020/7/22 22:28
* @Description : RabbitMQ连接工具类.
*/
public class RabbitMQUtils {
private static ConnectionFactory factory;
static {
factory = new ConnectionFactory();
factory.setHost("192.168.43.129");
factory.setPort(5672);
factory.setVirtualHost("/heihei");
factory.setUsername("heihei");
factory.setPassword("heihei");
}
/**
* 获取RabbitMQ的连接
* @return 连接对象
*/
public static Connection getConnection(){
try {
Connection connection = factory.newConnection();
return connection;
}catch (Exception e){
e.printStackTrace();
}
return null;
}
/**
* 关闭连接 注意:一般消费者不用关闭连接 只用于生产者关闭连接
* @param channel
* @param connection
*/
public static void closeConnection(Channel channel,Connection connection){
try {
if (channel != null){
channel.close();
}
if (connection != null){
connection.close();
}
}catch (Exception e){
e.printStackTrace();
}
}
}
使用工具类
生产者
package com.mahy.helloworld;
import com.mahy.utils.RabbitMQUtils;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* @Auther : mahy
* @Date : 2020/7/27 16:18
* @Description : 直连模式--HelloWorld.
*/
public class Provider {
public static void main(String[] args) throws IOException {
//建立连接
Connection connection = RabbitMQUtils.getConnection();
//建立通道
Channel channel = connection.createChannel();
/**
* 给通道绑定消息队列
* 参数一:消息队列的名称
* 参数二:队列是否持久化 注意:只持久化队列 不持久化消息
* 参数三:是否独占队列
* 参数四:是否在消费完成后自动删除队列
* 参数五:额外附加参数
* 注意: 生产者参数要与消费者参数绑定时保持一致 不然报错
*/
channel.queueDeclare("nx",true,false,false,null);
/**
* 发送消息
* 参数一:交换机名称
* 参数二:发往消息的队列名称
* 参数三:传递消息的额外设置 eg:MessageProperties.PERSISTENT_TEXT_PLAIN 消息持久化 前提是队列持久化
* 参数四:消息的具体内容 字节类型
*/
channel.basicPublish("","nx",null,"This is a HelloWorld Message".getBytes());
//关闭连接
RabbitMQUtils.closeConnection(channel,connection);
}
}
消费者
package com.mahy.helloworld;
import com.mahy.utils.RabbitMQUtils;
import com.rabbitmq.client.*;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
/**
* @Auther : mahy
* @Date : 2020/7/27 16:33
* @Description : Please describe here.
*/
public class Customer {
public static void main(String[] args) throws IOException, TimeoutException {
//建立连接
Connection connection = RabbitMQUtils.getConnection();
//建立通道
Channel channel = connection.createChannel();
/**
* 给通道绑定消息队列
* 参数一:消息队列的名称
* 参数二:队列是否持久化 注意:只持久化队列 不持久化消息
* 参数三:是否独占队列
* 参数四:是否在消费完成后自动删除队列
* 参数五:额外附加参数
* 注意: 生产者参数要与消费者参数绑定时保持一致 不然报错
*/
channel.queueDeclare("nx",true,false,false,null);
/**
* 消费消息
* 参数一:要消费的消息队列名称
* 参数二:是否开启消息确认机制
* 参数三:消费时的回调函数
*/
channel.basicConsume("",true,new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
System.out.println("消费者消费:" + new String(body));
}
});
//不关闭连接跟通道
}
}
运行结果
最后说明
这是观看BILIBILI上“编程不良人”大神的视频学习记录的笔记,如果眼花有记错的地方,希望能够提出,大家共同努力,谢谢。