转载自 版权声明:本文为博主原创文章,艾特米工作室,欢迎转载 https://blog.csdn.net/zhaozao5757/article/details/79693670
消息驱动/RabbitMQ的使用
1、RabbitMQ服务器安装
这一章所使用的RibbitMQ的服务器版本是3.6.11(Windows版本),RibbitMQ的服务器要使用Erlang语言,所以需要先下载Erlang(20.4 64bit)
1.1、安装Erlang
- Erlang
- 傻瓜式安装
1.2、安装RabbitMQ-Server
- 消息代理中间件
- 傻瓜式安装
- 安装完成后,管理器中能看到服务
1.3、查看插件
- 进入rabbitmq的sbin目录下,按下shift键,鼠标右键
- 查看插件:rabbitmq-plugins list
1.4、开启插件
- 开启管理插件 :rabbitmq-plugins enable rabbitmq_management
1.5、访问RabbitMQ
- 帐号密码均为:guest
- 浏览器访问http://localhost:15672
2、消息生产者
- 消息的生产者/消费者都属于客户端,均使用AMQP协议与RabbitMQ服务器进行通信
- 向本机安装的RabbitMQ服务器发送消息
- 新建Maven项目:atm_rabbitMq_producer
2.1、引入依赖
<!-- AMQP -->
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>4.2.0</version>
</dependency>
<!-- SLF4J日志 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.9</version>
</dependency>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
2.2、main测试
package com.atm.cloud;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class SendMessage {
public static void main(String[] args) throws Exception {
/*
* 1.生产者会发送消息给RabbitMQ服务器。 2.通过渠道叫消息发送给交换器。 3.交换器会发送给队列。 4.队列将消息发送给消费者。
*/
// 建立连接工厂
ConnectionFactory factory = new ConnectionFactory();
// 设置host,其实无需设置,默认为localhost,用户名/密码默认guest,端口默认5671
// factory.setHost("localhost");
// 创建新的连接
Connection connection = factory.newConnection();
// 通过连接创建渠道(向该渠道发送消息)
Channel channel = connection.createChannel();
// 声明交换器(默认绑定),交换器会将消息发送给队列,对列再发送给消费者
// 直接声明队列,使用默认交换器
String queueName = "MyQueueName";
channel.queueDeclare(queueName, false, false, false, null);
// 创建消息,使用渠道发布消息,""使用默认交换器,本列子中routingKey就使用queueName
String messageBody = "Hello Wrold!";
channel.basicPublish("", queueName, null, messageBody.getBytes());
// 发送之后,关闭渠道等(先关渠道,再关连接)
channel.close();
connection.close();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
3、消息消费者
- 读取刚刚的队列消息
package com.atm.cloud;
import java.io.IOException;
import com.rabbitmq.client.AMQP.BasicProperties;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.Consumer;
import com.rabbitmq.client.DefaultConsumer;
import com.rabbitmq.client.Envelope;
public class ReadMessage {
public static void main(String[] args) throws Exception {
// 建立连接工厂
ConnectionFactory factory = new ConnectionFactory();
// 创建新的连接
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
String queueName = "MyQueueName";
channel.queueDeclare(queueName, false, false, false, null);
// 通过队列创建Consumer
Consumer consumer = 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);
}
};
// 渠道绑定consumer
channel.basicConsume(queueName, consumer);
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 程序是一直处于阻塞状态,连接着渠道去接收消息
- 目前只需要了解大概流程,以后结合SpringCloud适合,就简单很多了
4、交换器、绑定与队列
- 消息发送过来,消息自身带着一个routingKey,交换器根据该key进行队列的绑定
4.1、交换器
- direct:根据生产者传过来的routingKey是否等于bindingkey,来决定将消息发送给哪个队列
- topic:根据传过来的routingkey是否匹配一定的表达式,来决定消息发送给哪个或者哪些队列
- fanout:将消息发送给交换器知道的全部队列,这种交换器会忽略掉设置的routingkey(广播机制)
- headers:根据消息的头消息,来决定将消息发送给哪些队列