rabbitmq学习(二) —— helloword!

rabbitmq学习固然是跟着官网走最好了,官网的教程写的很好,跟着官网教程走一遍就会有个初步了解了java

下面的教程转自http://cmsblogs.com/?p=2768,该博客对官网的翻译还不错python

介绍

RabbitMQ 是一个消息代理:它接受并转发消息。你能够将其视为邮局:当你将要发布的邮件放在邮箱中时,您能够确信 Postman 先生最终会将邮件发送给收件人。在这个比喻中,RabbitMQ 是一个邮箱,邮局和邮递员。git

RabbitMQ 和邮局之间的主要区别在于它不处理纸张,而是接受,存储和转发二进制数据块的消息。github

常见术语

RabbitMQ 使用一些术语:生产者、队列、消费者。数组

生产者

一个发送消息的程序是一个生产者。ide

队列

队列相似于邮箱。虽然消息经过 RabbitMQ 在你的应用中传递,可是它们只能存储在队列中。队列只受主机的内存和磁盘限制的限制,它本质上是一个大的消息缓冲区。不一样的生产者能够经过同一个队列发送消息,此外,不一样的消费者也能够从同一个队列上接收消息。学习

消费者

一个等待接收消息的程序是一个消费者。spa

整个过程很是简单,生产者建立消息,消费者接收这些消息。你的应用程序既能够做为生产者向其余应用程序发送消息,也能够做为消费者,等待接收其余应用程序的消息。其中,存储消息的是消息队列,它相似于邮箱,消息经过消息队列进行投递。翻译

案例实战 – 使用 Java 客户端实现 “Hello World!”

在本教程的这一部分,咱们将用 Java 编写一个 “Hello World” 的消息传递案例,它涉及两个程序:发送单个消息的生产者,以及接收消息并将其打印出来的消费者。代理

在下图中,“P”是咱们的生产者,“C”是咱们的消费者。中间的框是队列 – RabbitMQ 表明消费者的消息缓冲区。

准备工做

使用 Maven 进行依赖管理。

<dependency> <groupId>com.rabbitmq</groupId> <artifactId>amqp-client</artifactId> <version>5.6.0</version> </dependency>

发送端

咱们会调用生产者发送消息给消费者。生产者链接到 RabbitMQ,发送一条数据,而后退出

public class Send { private final static String QUEUE_NAME = "hello"; public static void main(String[] args) throws IOException, TimeoutException { // 建立链接 ConnectionFactory factory = new ConnectionFactory(); // 设置 RabbitMQ 的主机名 factory.setHost("localhost"); // 建立一个链接 Connection connection = factory.newConnection(); // 建立一个通道 Channel channel = connection.createChannel(); // 指定一个队列 // queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments) // 参数1 queue :队列名 // 参数2 durable :是否持久化 默认false // 参数3 exclusive :仅建立者能够使用的私有队列,断开后自动删除 // 参数4 autoDelete : 当全部消费客户端链接断开后,是否自动删除队列 // 参数5 arguments channel.queueDeclare(QUEUE_NAME, false, false, false, null); // 发送消息 String message = "Hello World!"; // basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body) // 参数1 exchange :交换器 // 参数2 routingKey : 路由键 // 参数3 props : 消息的其余参数 // 参数4 body : 消息体 channel.basicPublish("", QUEUE_NAME, null, message.getBytes()); System.out.println(" [x] Sent '" + message + "'"); // 关闭频道和链接   channel.close(); connection.close(); } }

 

声明队列是幂等的, 队列只会在它不存在时才会被建立,屡次声明并不会重复建立。消息内容是一个字节数组,也就意味着能够传递任何数据。

接受端

这就是咱们的消费者。它不断等待消息队列推送消息,而后在控制台输出。

public class Recv { private final static String QUEUE_NAME = "hello"; public static void main(String[] args) throws IOException, TimeoutException { // 建立链接 ConnectionFactory factory = new ConnectionFactory(); // 设置 RabbitMQ 的主机名 factory.setHost("localhost"); // 建立一个链接 Connection connection = factory.newConnection(); // 建立一个通道 Channel channel = connection.createChannel(); // 指定一个队列 // queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments) // 参数1 queue :队列名 // 参数2 durable :是否持久化 // 参数3 exclusive :仅建立者能够使用的私有队列,断开后自动删除 // 参数4 autoDelete : 当全部消费客户端链接断开后,是否自动删除队列 // 参数5 arguments 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 + "'"); } }; // basicConsume(String queue, boolean autoAck, Consumer callback) // 参数1 queue :队列名 // 参数2 autoAck : 是否自动ACK // 参数3 callback : 消费者对象的一个接口,用来配置回调 channel.basicConsume(QUEUE_NAME, true, consumer); } }

 

源代码

相关示例完整代码: https://github.com/lianggzone/rabbitmq-action

相关文章
相关标签/搜索