9. RabbitMQ - 点对点模式 案例代码
大约 2 分钟
1. 引言
代码已上传至Github,有兴趣的同学可以下载看看: https://github.com/ylw-github/RabbitMQ-Demo
上一篇博客主要讲解了RabbitMQ的五种队列形式《消息中间件系列教程 RabbitMQ -五种队列形式》,主要讲解一下五种队列的代码实现。
主要分为:
- 点对点队列模式(简单)
- 工作队列模式(公平性)
- 发布订阅模式
- 路由模式Routing
- 通配符模式Topics
本文主要讲解点对点队列模式。
2. 点对点队列模式
1.新建Maven项目RabbitMQ-Demo
2.添加Maven依赖:
<dependencies>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>3.6.5</version>
</dependency>
</dependencies>
3.连接工具类
package com.ylw.rabbitmq;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.io.IOException;
import java.util.concurrent.TimeoutException;
public class RabbitMQConnecUtils {
public static Connection newConnection() throws IOException, TimeoutException {
// 1.定义连接工厂
ConnectionFactory factory = new ConnectionFactory();
// 2.设置服务器地址
factory.setHost("127.0.0.1");
// 3.设置协议端口号
factory.setPort(5672);
// 4.设置vhost
factory.setVirtualHost("OrderHost");
// 5.设置用户名称
factory.setUsername("OrderAdmin");
// 6.设置用户密码
factory.setPassword("123456");
// 7.创建新的连接
Connection newConnection = factory.newConnection();
return newConnection;
}
}
2.1 生产者
public class Producer {
private static final String QUEUE_NAME = "add_order_queue";
public static void main(String[] args) throws IOException, TimeoutException {
// 1.获取连接
Connection newConnection = RabbitMQConnecUtils.newConnection();
// 2.创建通道
Channel channel = newConnection.createChannel();
// 3.创建队列声明
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
String msg = "{'ordername':'云南白药牙膏',‘price’:'39','weight':'480g'}";
System.out.println("生产者发送消息:" + msg);
// 4.发送消息
channel.basicPublish("", QUEUE_NAME, null, msg.getBytes());
channel.close();
newConnection.close();
}
}
运行之后,可以在RabbitMQ控制台看到:
2.2 消费者
public class Customer {
private static final String QUEUE_NAME = "add_order_queue";
public static void main(String[] args) throws IOException, TimeoutException {
// 1.获取连接
Connection newConnection = RabbitMQConnecUtils.newConnection();
// 2.获取通道
Channel channel = newConnection.createChannel();
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
DefaultConsumer defaultConsumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body)
throws IOException {
String msgString = new String(body, "UTF-8");
System.out.println("消费者获取消息->" + msgString);
}
};
// 3.监听队列
channel.basicConsume(QUEUE_NAME, true, defaultConsumer);
}
}
运行消费者,Console打印,说明消费者已经消费消息:
在RabbitMQ的控制台,也可以看到消息被消费掉了: