RabbitMQ
当你成功安装好了 RabbitMQ ,非常值得庆幸,可喜可贺。
下面我们就应该开始尝试第一个 Demo 了,经典的HelloWorld 案例。
当然 在开始之前有必要 了解什么是 消息/订阅模式。这样会更加容易理解消息中间件
好了,开始我们的实验吧。
添加依赖
首先要创建一个 Maven 项目,然后添加 RabbitMQ 的依赖
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.4.3</version>
</dependency>
代码参考 《RabbitMq 实战指南》
创建常量类
首先我们先定义 交换机、队列、路由键值 的值,放入到一个接口中
Constant.java
public interface Constant {
/** 交换机 */
String EXCHANGE_NAME = "exchange_demo";
/** 路由键值 */
String ROUTING_KEY = "routing_key";
/** 队列名称 */
String QUEUE_NAME = "queue_demo";
}
创建工具类
无论是消费者和生产者,都需要先连接上 RabbitMQ,这里会造成冗余代码,所以我们创建一个工具类
注意:请把 ip 、username、password 换成你自己的
RabbitMQConnectionUtil.java
public class RabbitMQConnectionUtil {
/** Ip 地址 */
private static final String IP_ADDRESS = "127.0.0.1";
/** 固定端口 */
private static final int PORT = 5672;
/** 用户名 */
private static final String USER_NAME = "root";
/** 密码 */
private static final String PASSWORD = "dcpnet";
/** 连接工厂 */
private static final ConnectionFactory connectionFactory;
static {
connectionFactory = new ConnectionFactory();
connectionFactory.setHost(IP_ADDRESS);
connectionFactory.setPort(PORT);
connectionFactory.setUsername(USER_NAME);
connectionFactory.setPassword(PASSWORD);
}
/**
* 获取连接
* @return 连接
* @throws IOException IOException
* @throws TimeoutException TimeOutException
*/
public static Connection getConnection() throws IOException, TimeoutException {
return connectionFactory.newConnection(); // 创建一个新的连接
}
/**
* 关闭连接和信道
* @param connection 连接
* @param channel 信道
*/
public static void close(Connection connection, Channel channel){
try {
if (channel == null) {
channel.close();
}
if (connection == null){
connection.close();
}
} catch (IOException | TimeoutException e) {
e.printStackTrace();
}
}
}
开始之前,我们先做准备工作,让各个模块的代码更加的分工明确
创建 交换机、队列、绑定队列到交换机
▌方式一、代码创建
public class Preparation {
public static void main(String[] args) throws Exception{
Connection connection = RabbitMQConnectionUtil.getConnection();
Channel channel = connection.createChannel();
// 申明交换机
channel.exchangeDeclare(Constant.EXCHANGE_NAME,"direct",true,false,null);
// 声明队列
channel.queueDeclare(Constant.QUEUE_NAME,true,false,false,null);
// 绑定队列
channel.queueBind(Constant.QUEUE_NAME,Constant.EXCHANGE_NAME,Constant.ROUTING_KEY);
RabbitMQConnectionUtil.close(connection,channel);
}
}
运行此段代码后就成功了,可以再管理界面看到这个交换机和队列,点机队列查看详情看到也绑定成功了
▌方式二、管理页面创建
1.创建交换机
2.创建队列
3.绑定队列到交换机
然后跳转到
输入指定交换机和路由键值后进行绑定
生产者
首先我们创建一个发送消息的 ProviderClient 作为生产者客户端
ProviderClient.java
public class ProviderClient {
public static void main(String[] args) throws Exception{
Connection connection = RabbitMQConnectionUtil.getConnection();
Channel channel = connection.createChannel();
String message = "Hello,World";
channel.basicPublish(Constant.EXCHANGE_NAME,Constant.ROUTING_KEY, MessageProperties.PERSISTENT_TEXT_PLAIN,message.getBytes());
// 关闭信道和连接
RabbitMQConnectionUtil.close(connection,channel);
}
}
上面的生产者客户端的代码首先和RabbitMQ 服务器建立一个连接 (Connection ) , 然后在这个连接之上创建一个信道(Channel) 。往指定的 交换机 的指定 路由键值 发送一条消息, 最后关闭资源。
可以进入管理页面看到 queue_demo 中多了一条消息
然后我们创建 消息接收者客户端
消费者
ConsumerClient.java
public class ConsumerClient {
public static void main(String[] args) throws Exception{
Connection connection = RabbitMQConnectionUtil.getConnection();
Channel channel = connection.createChannel();
channel.basicQos(1); // 一次消费一条消息
// 定义消费具体详情
Consumer consumer = new DefaultConsumer(channel){
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
// 显示接收到的消息
System.out.println("Received Message : " + new String(body));
// 确认消费信息
channel.basicAck(envelope.getDeliveryTag(),false);
}
};
// 消费消息
channel.basicConsume(Constant.QUEUE_NAME,consumer);
// 关闭资源
RabbitMQConnectionUtil.close(connection,channel);
}
}
运行流程
1.首先运行 ProviderClient 然后可以看到
我们创建的队列中有一条非消费的消息
2.运行 消息接收者客户端 ConsumerClient
可以看到控制台页相应的打印输出了
Received message :Hello world!
查看页面
队列中的消息被成功消费掉了
看到这里,恭喜你已经成功的对rabbitmq 有了一个初步的了解,我们一起加油吧