1.前言
1.消息列队解决了什么问题??
异步处理
应用解耦
流量削峰(高并发:抢红包、秒杀)
日志处理……
2.java操作RabbitMQ
- simple 简单队列
- work queues 工作队列
- publish/subscribe 发布订阅
- routing 路由选择 通配符模式
- topic 主题
- 手动和自动确认消息
- 队列的持久化和非持久化
- RabbitMQ的延迟队列
3.Spring AMQP协议
打开
进⼊入rabbitmq的
sbin⽬目录(我的⽬目录是:C:\Program Files\RabbitMQ
Server\rabbitmq_server-3.7.2\sbin),输⼊入:
rabbitmq-plugins enable rabbitmq_management
命令,稍等会会发现出现plugins安装成功的提示
打开浏览器进入 http://localhost:15672/ 用户名guest 密码guest
- 添加用户:(huyanglin huyanglin )
- virtual hosts 管理
virtual hosts 相当于mysql 的db
一般以/开头
我们需要对用户进行授权
<dependencies>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>3.4.1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
</dependency>
</dependencies>
3.简单队列
P:消息的生产者-->队列-->消费者
连接rabbitmq
public static Connection getConnections() throws IOException{
//定义一个连接工厂
ConnectionFactory factory=new ConnectionFactory();
//设置服务器ַ
factory.setHost("127.0.0.1");
// AMQP 5672
factory.setPort(5672);
//vhost
factory.setVirtualHost("/vhost_mmr");
//用户名
factory.setUsername("huyanglin");
//密码
factory.setPassword("huyanglin");
Connection newConnection = factory.newConnection();
return newConnection;
}
发送消息
public static void main(String[] args) throws IOException {
//1.获取链接
Connection connections = ConnectionUtils.getConnections();
//2.创建通道
Channel channel = connections.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
String msg="hello simple";
channel.basicPublish("", QUEUE_NAME, null, msg.getBytes());
System.out.println(msg);
channel.close();
connections.close();
}
监听(接收消息)
private static final String QUEUE_NAME="test_simple_queue";
public static void main(String[] args) throws IOException {
//建立链接、创建通道
Connection connections = ConnectionUtils.getConnections();
Channel channel = connections.createChannel();
//队列声明
channel.queueDeclare(QUEUE_NAME, false, false, false, null) ;
//定义消费者
DefaultConsumer defaultConsumer = new DefaultConsumer(channel){
//获取到达的消息
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
String msg=new String(body,"utf-8");
System.out.println("取数据"+msg);
};
};
//消费队列
channel.basicCons