RabbitMQ消息队列中间件——“Hello World”入门
前面已经介绍过rabbitMQ环境的配置及安装了,这节就简单介绍一个demo,“Hello World”。
本文只是对官网给出的demo进行了中文翻译,大家也可以参考官网,不过全是英文的。
前言介绍
相关术语
生产者 Producer 扮演角色:向消息队列(消息缓冲区,也就是我们前面举例的邮局)中发送数据
消费者 Consumer 扮演角色:从消息队列(消息缓冲区,也就是我们前面举例的邮局)中获取数据
消息队列 rabbitmq 扮演角色:缓存消息,其本质是一消息缓冲区,其缓冲区的大小受主机内存和磁盘大小的限制,它可以缓存生产者发送来的消息,并且消费者可以从中获取消息。
“Hello World”简单案例
实现目的:生产者向队列中发送一条消息,消费者从队列中获取消息并打印出来。
pom依赖Maven坐标:
<dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> </dependency>
先来一个生产者,用于向队列中发送数据,Send.java。
public class Send { private final static String QUEUE_NAME = "hello"; // 声明一个队列名称 private static String message = "Hello World!"; // 发送的消息 public static void main(String[] args) throws IOException, TimeoutException { ConnectionFactory factory = new ConnectionFactory(); // 创建连接工厂 factory.setHost("localhost"); // 连接的主机地址 Connection connection = factory.newConnection(); // 实例化一个连接对象 Channel channel = connection.createChannel(); // 创建一个通道 channel.queueDeclare(QUEUE_NAME, false, false, false, null); // 声明一个队列 channel.basicPublish("",QUEUE_NAME, null, message.getBytes()); // 将消息发送到hello队列 System.out.println("Send successfully : " + message); } }
再来一个消费者,从队列中获取数据,Receive.java。
注意,因为队列会异步的向消费者发送数据,所以代码中以DeliverCallback对象作了回调,该对象将缓冲队列发来的消息。
public class Receive { private static final String QUEUE_NAME = "hello"; public static void main(String[] args) throws IOException, TimeoutException { ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.queueDeclare(QUEUE_NAME, false, false, false, null); DeliverCallback deliverCallback = new DeliverCallback() { @Override public void handle(String s, Delivery delivery) throws IOException { String message = new String(delivery.getBody(), "UTF-8"); System.out.println("Receive " + message +" from queue!"); } }; /*DeliverCallback deliverCallback = (consumerTag, delivery) ->{ String message = new String(delivery.getBody(), "UTF-8"); System.out.println("Receive " + message +" from queue!"); };*/ channel.basicConsume(QUEUE_NAME, true, deliverCallback, consumerTag -> {}); } }
分别运行两个程序,输出结果如下:
Receive Hello World! from queue!