1 RabbitMq介绍
RabbitMQ是由erlang语言开发,基于AMQP(Advanced Message
Queue 高级消息队列协议)协议实现的消息队列,它是一种应用程序之间的通信方法,消息队列在分布式系统开发中应用非常广泛。
2应用场景
1、任务异步处理。
将不需要同步处理的并且耗时长的操作由消息队列通知消息接收方进行异步处理。提高了应用程序的响应时间。
2、应用程序解耦合
MQ相当于一个中介,生产方通过MQ与消费方交互,它将应用程序进行解耦合
3 为什么使用RabbitMQ呢?
1、使得简单,功能强大。
2、基于AMQP协议。
3、社区活跃,文档完善。
4、高并发性能好,这主要得益于Erlang语言。
5、Spring Boot默认已集成RabbitMQ
快速入门
组成部分说明如下:
Broker:消息队列服务进程,此进程包括两个部分:Exchange和Queue。
Exchange:消息队列交换机,按一定的规则将消息路由转发到某个队列,对消息进行过虑。
Queue:消息队列,存储消息的队列,消息到达队列并转发给指定的消费方。
Producer:消息生产者,即生产方客户端,生产方客户端将消息发送到MQ。
Consumer:消息消费者,即消费方客户端,接收MQ转发的消息。
下载安装
1)下载erlang
地址如下:
http://erlang.org/download/otp_win64_20.3.exe
erlang安装完成需要配置erlang环境变量: ERLANG_HOME=D:\Program Files\erl9.3 在path中添
加%ERLANG_HOME%\bin;
2)安装RabbitMQ
https://github.com/rabbitmq/rabbitmq-server/releases/tag/v3.7.3
启动
1)从开始菜单启动RabbitMQ
一般会有如下目录
RabbitMQ Service-install :安装服务
RabbitMQ Service-remove 删除服务
RabbitMQ Service-start 启动
RabbitMQ Service-stop 启动
2)如果没有开始菜单则进入安装目录下sbin目录手动启动:
1)安装并运行服务
rabbitmq-service.bat install 安装服务 rabbitmq-service.bat stop 停止服务 rabbitmq-service.bat start 启动服务
2)安装管理插件
安装rabbitMQ的管理插件,方便在浏览器端管理RabbitMQ
管理员身份运行 rabbitmq-plugins.bat enable rabbitmq_management
3、启动成功 登录RabbitMQ
进入浏览器,输入:http://localhost:15672
初始账号和密码:guest/guest
入门案例生产者
1、生产者和Broker建立TCP连接。
2、生产者和Broker建立通道。
3、生产者通过通道消息发送给Broker,由Exchange将消息进行转发。
4、Exchange将消息转发到指定的Queue(队列)
基本上参考这个写代码
部分示例代码
public class Producer01 {
private static final String QUEUE = "helloworld";
public static void main(String[] args) {
//连接
Connection connection = null;
//通道
Channel channel = null;
try {
//给MQ发送消息
//连接MQ
//通过连接工厂创建连接
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("127.0.0.1");//IP地址
connectionFactory.setPort(5672);//默认mq服务端口
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
connectionFactory.setVirtualHost("/");//设置mq虚拟机
//和MQ创建连接
connection = connectionFactory.newConnection();
//建立channel通道,会话通道,在通道中向mq发送消息
channel = connection.createChannel();
//声明一个队列,根据队列名称判断,如果在mq中没有此队列就创建一个队列,如果有此队列则不作处理
/**
* 参数:String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments
* 1、队列名称
* 2、是否持久化,true表示持久化,当mq重启之后此队列还在
* 3、是否独占通道,true表示此通道只能由此队列来使用
* 4、自动删除,true表示自动删除,mq重启后队列删除
* 5、队列参数列表
*/
channel.queueDeclare(QUEUE,true,false,false,null);
//发送消息
/**
* 参数String exchange, String routingKey, BasicProperties props, byte[] body;
* 1、exchange 交换机名称,不指定交换机设置成空字符串,mq会使用一个默认的交换机
* 2、routingKey 路由key,交换机跟路由key来转发消息,由于没有指定交换机,所以routingkey设置为队列的名称
* 3、消息属性
* 4、消息内容
*/
String message ="hello 小明"+ System.currentTimeMillis();
channel.basicPublish("",QUEUE,null,message.getBytes());
System.out.println("send message.."+message);
channel.close();
connection.close();
}
入门案例消费者
1、消费者和Broker建立TCP连接
2、消费者和Broker建立通道
3、消费者监听指定的Queue(队列)
4、当有消息到达Queue时Broker默认将消息推送给消费者。
5、消费者接收到消息。
public class Consumer01 {
private static final String QUEUE = "helloworld";
public static void main(String[] args) {
//连接
Connection connection = null;
//通道
Channel channel = null;
try {
//给MQ发送消息
//连接MQ
//通过连接工厂创建连接
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("127.0.0.1");//IP地址
connectionFactory.setPort(5672);//默认mq服务端口
connectionFactory.setUsername("guest");
connectionFactory.setPassword("guest");
connectionFactory.setVirtualHost("/");//设置mq虚拟机
//和MQ创建连接
connection = connectionFactory.newConnection();
//建立channel通道,会话通道,在通道中向mq发送消息
channel = connection.createChannel();
//声明一个队列,根据队列名称判断,如果在mq中没有此队列就创建一个队列,如果有此队列则不作处理
/**
* 参数:String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments
* 1、队列名称
* 2、是否持久化,true表示持久化,当mq重启之后此队列还在
* 3、是否独占通道,true表示此通道只能由此队列来使用
* 4、自动删除,true表示自动删除,mq重启后队列删除
* 5、队列参数列表
*/
channel.queueDeclare(QUEUE,true,false,false,null);
//创建回调方法类
DefaultConsumer consumer = new DefaultConsumer(channel){
/**
* 消费者接收到消息后会调用此方法
* @param consumerTag 消费者标签,用来标识消费,如果不指定默认一个名称
* @param envelope 消息内容包
* @param properties 消息的属性
* @param body 消息的内容
* @throws IOException
*/
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
String exchange = envelope.getExchange();//交换
long deliveryTag = envelope.getDeliveryTag();//消息id
String routingKey = envelope.getRoutingKey();//路由key
String message = new String(body, "utf-8");
System.out.println(message);
}
};
//监听队列,接收消息
/**
* 参数:String queue, boolean autoAck, Consumer callback
* 1、监听队列的名称
* 2、autoAck是否自动回复,消息者接收到消息要给mq回复表示此消息已接收,此时mq去删除消息
* 如果autoAck设置true,表示消费者接收到消息后自动回复,如果设置为false,需要程序员在代码中手动回复(channel.basicAck();)
* 3、回调方法,接收到消息后调用此callback
*/
channel.basicConsume(QUEUE,true,consumer);