本文将使用Java语言,实现从Producer到Consumer传递数据”Hello, World“。
首先复习一下上篇所学:RabbitMQ实现了AMQP定义的消息队列。它实现的功能”非常简单“:从Producer接收数据然后传递到Consumer。它能保证多并发,数据安全传递,可扩展。
和任何的Hello world一样,它们都不复杂。我们将会设计两个程序,一个发送Hello world,另一个接收这个数据并且打印到屏幕。
整体的设计如下图:
1. 建立maven项目
pom.xml配置
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.wb.rabbitmq</groupId> <artifactId>rabbitmq</artifactId> <version>0.0.1-SNAPSHOT</version> <dependencies> <dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>3.0.4</version> </dependency> <dependency> <groupId>commons-lang</groupId> <artifactId>commons-lang</artifactId> <version>2.6</version> </dependency> </dependencies> </project>
2. Sending
第一个程序 Send.java:发送Hello world 到queue。正如我们在上篇文章提到的,你程序的第一句话就是建立连接,第二句话就是创建channel:
package com.wb.rabbitmq.demo2; import com.rabbitmq.client.Channel; import com.rabbitmq.client.Connection; import com.rabbitmq.client.ConnectionFactory; public class Send { private static final String QUEUE_NAME = "hello";// 消息队列名称 public static void main(String[] argv) throws java.io.IOException { ConnectionFactory factory = new ConnectionFactory();// 创建RabbitMQ连接工厂 factory.setHost("localhost");// RabbitMQ服务器IP地址,若在本地安装,则为localhost Connection connection = factory.newConnection();// 创建RabbitMQ连接 Channel channel = connection.createChannel();// 创建RabbitMQ连接channel channel.queueDeclare(QUEUE_NAME, false, false, false, null); String message = "Hello World!";// 传送的消息 channel.basicPublish("", QUEUE_NAME, null, message.getBytes()); System.out.println(" [x] Sent '" + message + "'"); // 调用完毕,别忘记关闭channel、connection channel.close(); connection.close(); } }
3. Receiving
第二个程序 receive.py 将从queue中获取Message并且打印到屏幕。
第一步还是创建connection。第二步创建channel。第三步创建queue,name = hello:
package com.wb.rabbitmq.demo2; import java.io.IOException; import com.rabbitmq.client.AMQP; 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 Recv { private final static String QUEUE_NAME = "hello";// 队列名称,与发送方保持一致 public static void main(String[] argv) throws java.io.IOException, java.lang.InterruptedException { ConnectionFactory factory = new ConnectionFactory(); factory.setHost("localhost"); Connection connection = factory.newConnection(); Channel channel = connection.createChannel(); channel.queueDeclare(QUEUE_NAME, false, false, false, null); System.out.println(" [*] Waiting for messages. To exit press CTRL+C"); Consumer consumer = new DefaultConsumer(channel) { @Override public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException { String message = new String(body, "UTF-8"); System.out.println(" [x] Received '" + message + "'"); } }; channel.basicConsume(QUEUE_NAME, true, consumer); } }
4. 验证
1、先运行Send.java,生产消息
2、登录http://localhost:15672/ 默认账号密码:guest,查看是否发到消息队列中
3、运行Rec.java,消费消息
参考文献:
1. http://www.rabbitmq.com/tutorials/tutorial-one-java.html
2. http://blog.csdn.net/anzhsoft/article/details/19570187