1.声明
当前内容用于本人学习和使用RabbitMQ,当前来源为官方例子:官方的Hello World例子
2.官方的demo
通过前面的查看官方的ui界面发现了:Connections、Channels、Exchanges、Queues、Consumners这几个,所以查询的时候,首先应该创建Connection和Chanels,操作的时候需要指定Exchange和Queue
消息发送者
public static void main(String[] args) throws Exception {
// 1.创建连接工厂,并配置连接当前RabbitMQ的主要参数
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
// 2. 通过连接工厂创建连接,通过连接创建句柄
try (Connection connection = factory.newConnection(); Channel channel = connection.createChannel()) {
// 3. 通过句柄声明当前需要操作的Queue,需要使用名称和参数
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
String message = "Hello World!";
// 4.通过句柄开始推送消息,exchange为"",routingKey名称为hello,basicProperties为null,发送的二进制数据
channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
System.out.println(" [x] Sent '" + message + "'");
}
}
消息接收者
public static void main(String[] args) throws Exception {
// 1.创建连接工厂,并配置连接当前RabbitMQ的主要参数
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
// 2. 通过连接工厂创建连接,通过连接创建句柄
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
// 3. 通过句柄声明当前需要操作的Queue,需要使用名称和参数
channel.queueDeclare(QUEUE_NAME, false, false, false, null);
System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
// 4.创建消费者回调
DeliverCallback deliverCallback = (consumerTag, delivery) -> {
String message = new String(delivery.getBody(), "UTF-8");
System.out.println(" [x] Received '" + message + "'");
};
channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {
});
}
3.操作结果
4.分析上面的demo
通过上面代码发现,基本操作中具有
- 创建连接工厂(ConnectionFactory)
- 创建连接(Connection)
- 创建句柄 (Channel)
- 执行操作
其中执行操作分别为发送数据和接收数据(处理数据)
分析发现当前消息发送者和消息接收者中使用的内容刚好就是ui界面显示的内容
分析其实前面三个是重复的,所以可以将前面三个合并在一个创建一个工具类(需要注意消息接收者不能关闭连接和句柄)
5.工具类(初步)
ublic class RabbitMqUtils {
private final String host;
private final int port;
private final String username;
private final String password;
private final ConnectionFactory factory;
private static final String DEFAULT_USERNAME = "guest";
private static final String DEFAULT_PASSWORD = "guest";
private static final int DEFAULT_PORT = 5672;
private static final String DEFAULT_HOST = "localhost";
public RabbitMqUtils(String host, int port) {
this(host, port, DEFAULT_USERNAME, DEFAULT_PASSWORD);
}
public RabbitMqUtils() {
this(DEFAULT_HOST, DEFAULT_PORT);
}
public RabbitMqUtils(String host, int port, String username, String password) {
this.host = host;
this.port = port;
this.username = username;
this.password = password;
this.factory = new ConnectionFactory();
initConfig();
}
private void initConfig() {
factory.setHost(host);
factory.setPort(port);
factory.setUsername(username);
factory.setPassword(password);
}
public boolean send(final String exchange, final String queue, final String msg) {
try (Connection connection = factory.newConnection(); Channel channel = connection.createChannel()) {
channel.queueDeclare(queue, false, false, false, null);
channel.basicPublish(exchange, queue, null, msg.getBytes());
return true;
} catch (IOException | TimeoutException e) {
e.printStackTrace();
return false;
}
}
public void reciver(final String queue, DeliverCallback deliverCallback) throws Exception {
Connection connection = factory.newConnection();
Channel channel = connection.createChannel();
channel.queueDeclare(queue, false, false, false, null);
channel.basicConsume(queue, true, deliverCallback, consumerTag -> {
});
}
}
该工具类实际上并没有多少简化的操作
6.简化前面的操作
消息发送者
private final static String QUEUE_NAME = "hello";
@Test
public void testSender() {
RabbitMqUtils mqUtils = new RabbitMqUtils();
mqUtils.send("", QUEUE_NAME, "你好,世界!");
}
消息接收者
private final static String QUEUE_NAME = "hello";
public static void main(String[] args) throws Exception {
RabbitMqUtils mqUtils = new RabbitMqUtils();
mqUtils.reciver(QUEUE_NAME, (consumerTag, delivery) -> {
System.out.println(new String(delivery.getBody(), "utf-8"));
});
}
使用结果
7.分析当前的生产者消费者之间的路径
这个是官方的图片,我们通过这个图片发现了一个有趣的现象
- 生产者将消息推送到exchange这个交换机中
- 交换机将消息转发到queue这个队列中
- 然后客户端实际上是通过queue中获取数据信息的
通过这个发现前面中的生产者为什么需要exchange和queue(发送的时候需要通过exchange转发到queue)
这就是为什么消费者只需要queue就可以了,而并不需要exchange
8.总结
1.通过一个非常简单的HelloWorld的demo发现,在RabbitMQ中的操作基本上就是当前ui界面中的东西
2.发送消息需要使用basicPublish方式推送消息,消息接收者需要使用
basicConsume方式接收,并且消息接收者需要进行数据回调处理
以上纯属个人见解,如有问题请联系本人!