docker运行:
docker run -e RABBITMQ_DEFAULT_USER=ITCAST -e RABBITMQ_DEFAULT_PASS=123 --name mq -p 15672:15672 -p 5672:5672 -d rabbitmq
1.进入容器
docker exec -it mq /bin/bash
2.开启web页面管理
rabbitmq-plugins enable rabbitmq_management
消息队列——生产者、消费者模型
应用:
1.跨系统数据传递
2.高并发的流量削峰
3.数据的并发和异步处理
组成部分:
Broker:消息队列服务进程,此进程包括两个部分:Exchange和Queue
Exchange:消息队列交换机,按一定的规则将消息路由转发到某个队列
Queue:消息队列,存储消息的队列,消息到达队列并转发
Producer:消息生产者
Consumer:消息消费者
生产者发送消息流程:
主要maven
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
1.建立tcp连接
ConnectionFactory connectionFactory = new ConnectionFactory();
connectionFactory.setHost("");
connectionFactory.setPort("");
connectionFactory.setVirtualHost("/");设置虚拟机
connectionFactory.setUsername("");
connectionFactory.setPassword("");
2.建立通道
Connection connection = connectionFactory.newConnection(connectionName);
//通过连接获取通道Channel
Channel channel = connection.createChannel();
//通过创建交换机,声明队列;绑定关系;路由,来发送消息和接收消息
/*
*@params1 队列的名称
*@params2 是否需要持久化
*@params3 排他性,是否是独占队列
*@params4 是否自动删除,指最后一个消费者消费完消息后,是否把队列自动删除
*@params5 携带附加参数,信息
*/
channel.queueDeclare(queuename,durable,exclusive,autoDelete,arguments);
//发送消息
String message = "";
channel.basicPublish(exchange,queueName,message.getBytes());
connection.close();
channel.close();
3.发送消息,由交换机发送到指定队列
消费者消费流程:
建立连接,建立通道,监听指定的queue,ack回复
DefaultConsumer consumer = new DefaultConsumer(channel){
// 获取消息,并且处理,这个方法类似事件监听,如果有消息的时候,会被自动调用
/**
* 当接收到消息后此方法将被调用
* @param consumerTag 消费者标签,用来标识消费者的,在监听队列时设置channel.basicConsume
* @param envelope 信封,通过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();
//消息id,mq在channel中用来标识消息的id,可用于确认消息已接收
long deliveryTag = envelope.getDeliveryTag();
// body 即消息体
String msg = new String(body,"utf-8");
System.out.println(" [x] received : " + msg + "!");
}
};
// 监听队列,第二个参数:是否自动进行消息确认。
//参数:String queue, boolean autoAck, Consumer callback
/**
* 参数明细:
* 1、queue 队列名称
* 2、autoAck 自动回复,当消费者接收到消息后要告诉mq消息已接收,如果将此参数设置为tru表示会自动回复mq,如果设置为false要通过编程实现回复
* 3、callback,消费方法,当消费者接收到消息要执行的方法
*/
channel.basicConsume(QUEUE_NAME, true, consumer);
通过channel而不是连接,是由于性能更高,不用每次都先建立连接,三次握手等
利用rabbitTemplate发送:
添加连接信息:
spring:
rabbitmq:
host: http://192.168.91.128
port: 5672 #mq服务器port,默认为5672
username: ITCAST #mq服务器username,默认为gust
password: 123 #mq服务器password,默认为guest
使用rabbitTemplate发送
使用监听接收数据: