【RabbitMQ】HelloWorld
初识RabbitMQ
RabbitMQ是一个消息代理人。它的主要目的很简单:接受并推送消息。我们可以将它理解为一个邮局:当你邮寄一封邮件到邮箱里,可以非常确定邮递员会将它送到收件人手中。打这种比方来将RabbitMQ看做一个邮局,邮箱,邮递员。
RabbitMQ和邮局的主要区别在于它不需要纸,它所接收的,存贮的以及推送的是二进制数据----消息。
下面介绍一些术语:
生产(Producing)就是发送数据,一个发送消息的程序被称为生产者(Producer)。
队列(queue)代表着邮箱。它依附在RabbitMQ内部。尽管消息在RabbitMQ和你的应用程序之间传输,它们也只能被保存在队列中。一个队列没有被绑定任何限制,它可以存放任意多的消息----它本质上就是一个无限大小的缓冲区。多个生产者可以发送消息到同一个队列中,多个消费者也可以从同一个队列中消费消息。
消费(Consuming)即接收。一个等待接收消息的程序被称为消费者(Consumer)。
注意:生产者,消费者,代理人不需要在同一台机器上。
"HelloWorld"
这部分我们将使用Java写两个小程序:一个生产者发送一条消息,一个消费者接收并打印该条消息(先决条件:要在本地启动RabbitMQ服务器http://www.rabbitmq.com/install-debian.html)。流程如下图所示:
导入maven依赖:
- <dependency>
- <groupId>com.rabbitmq</groupId>
- <artifactId>amqp-client</artifactId>
- <version>4.0.1</version>
- </dependency>
Sending
我们将会调用Send和接收端Recv。发送端将会连接到RabbitMQ服务,发送一条消息后退出。
在Send.java,导入下列包:
- import com.rabbitmq.client.ConnectionFactory;
- import com.rabbitmq.client.Connection;
- import com.rabbitmq.client.Channel;
初始化类和队列名:
- public class Send {
- private final static String QUEUE_NAME = "hello";
- public static void main(String[] argv)
- throws java.io.IOException {
- ...
- }
- }
然后创建到RabbitMQ服务的连接:
- ConnectionFactory factory = new ConnectionFactory();
- factory.setHost("localhost");
- Connection connection = factory.newConnection();
- Channel channel = connection.createChannel();
这个connection抽象了socket连接,并且为我们管理好了协议版本和安全认证等。这里我们连接的是在本机的代理人----因为127.0.0.1.如果你想连接到其它的机器上,只需要更改IP地址就可以。
下面创建一个channel,大多数API在它里面驻留来获取数据。
我们必须声明一个队列来向其中发送消息:
- 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();
Receiving
接收方负责推送从RabbitMQ得到的消息,不像发送方只发送单条消息,我们需要让接收方保持运行状态,不断监听消息并打印。
导入的包与发送时基本相同:
- import com.rabbitmq.client.ConnectionFactory;
- import com.rabbitmq.client.Connection;
- import com.rabbitmq.client.Channel;
- import com.rabbitmq.client.Consumer;
- import com.rabbitmq.client.DefaultConsumer;
额外的DefaultConsumer是Consumer接口的实现类,我们将用它来缓冲服务器推送给我们的消息。
初始化和sender一样,打开一个connection和一个channel,声明我们要消费消息的队列。注意它需要与发送消息的队列相匹配。
- 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");
- ...
- }
- }
注意我们在这里也声明了队列,这是因为可能receiever运行在sender之前,我们要确保在监听消息时这个队列是存在的。
现在我们要告诉服务器准备从队列中发送消息。由于服务器是异步的推送给我们消息,我们以对象的形式提供一个回调,它将缓冲消息,直到我们准备好使用它。这就是DefaultConsumer的作用。
- 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);
最后运行Recv.java,他会开始监听消息,此时我们运行一次Send.java,就会发送一条消息,同时Recv会接收一条消息。
【RabbitMQ】HelloWorld的更多相关文章
- 【RabbitMQ】 WorkQueues
消息分发 在[RabbitMQ] HelloWorld中我们写了发送/接收消息的程序.这次我们将创建一个Work Queue用来在多个消费者之间分配耗时任务. Work Queues(又称为:Task ...
- 【rabbitmq】rabbitmq集群环境搭建
安装rabbitmq-server 总共有3台虚拟机,都安装有rabbitmq服务,安装过程可参考: [rabbitmq]Centos7 下安装rabbitmq 创建用户和vhost 说明: 此步骤不 ...
- 【RabbitMQ】 Java简单的实现RabbitMQ
准备工作 1.安装RabbitMQ,参考[RabbitMQ] RabbitMQ安装 2.新建Java项目,引入RabbitMQ的Maven依赖 <dependency> <group ...
- 【RabbitMQ】 RabbitMQ配置开机启动
环境 系统:Linux(CentOS 7.2) Erlang环境:21.1(安装参考[Erlang]源码安装) RabbitMQ:3.7.9(安装参考[RabbitMQ] RabbitMQ安装) 配置 ...
- 【RabbitMQ】显示耗时处理进度
[RabbitMQ]显示耗时处理进度 通过网页提交一个耗时的请求,然后启动处理线程,请求返回.处理线程每完成一部分就给前台推送完成的数量,前端显示进度. 依赖jar <?xml version= ...
- 【RabbitMQ】使用学习
[RabbitMQ]使用学习 转载: ============================================================= =================== ...
- 【RabbitMQ】 RabbitMQ安装
MQ全称为Message Queue, 消息队列(MQ)是一种应用程序对应用程序的通信方法.应用程序通过读写出入队列的消息(针对应用程序的数据)来通信,而无需专用连接来链接它们.消息传递指的是程序之间 ...
- 【RabbitMQ】一文带你搞定RabbitMQ延迟队列
本文口味:鱼香肉丝 预计阅读:10分钟 一.说明 在上一篇中,介绍了RabbitMQ中的死信队列是什么,何时使用以及如何使用RabbitMQ的死信队列.相信通过上一篇的学习,对于死信队列已经有了更 ...
- 【RabbitMQ】一文带你搞定RabbitMQ死信队列
本文口味:爆炒鱿鱼 预计阅读:15分钟 一.说明 RabbitMQ是流行的开源消息队列系统,使用erlang语言开发,由于其社区活跃度高,维护更新较快,性能稳定,深得很多企业的欢心(当然,也包括我 ...
随机推荐
- PROJ4初探(转并整理格式)
PROJ4初探(转并整理格式) Proj4是一个免费的GIS工具,软件还称不上. 它专注于地图投影的表达,以及转换.采用一种非常简单明了的投影表达--PROJ4,比其它的投影定义简单,但很明显.很容易 ...
- JavaScript方法——call和apply
1.相同点: a) 产生的效果或作用完全相同: b) 至少有一个参数: c) 第一个参数必须有且是一个对象(Object),因为就是这个家伙偷懒. 2.不同点: 传递参数的方式. 前提: 1.有两个对 ...
- Effective C++阅读笔记_条款2:尽量以const,enum,inline替换#define
1.#define缺点1 #define NUM 1.2 记号NUM可能没有进入记号表,在调试或者错误信息中,无法知道1.2的含义. 改善:通过const int NUM = 1.2; 2.#dein ...
- 整合Spring、SpringMVC、MyBatis
spring+springmvc+mybatis集成 一个核心:将对象交给spring管理. 1新建web项目 2添加项目jar包 spring包见上一篇博客 3建立项目的目录结构 4完成Mapper ...
- php接口
如果要继承多个类的方法规范,用接口,因为抽象类只能继承一个: 如果要共享一个方法体内容,用抽象类: <?php //接口是为了规范实现它的子类,以达到统一的目的 //接口不能被实例化 inter ...
- 线性回归、梯度下降(Linear Regression、Gradient Descent)
转载请注明出自BYRans博客:http://www.cnblogs.com/BYRans/ 实例 首先举个例子,假设我们有一个二手房交易记录的数据集,已知房屋面积.卧室数量和房屋的交易价格,如下表: ...
- 支付宝通知页面notify_url、返回页面return_url
返回页面(return_url文件)工作原理 即:商户系统请求/支付宝响应交互模式 1. 构造请求数据 商户通过提供的接口代码示例,通过代码示例的规则,程序构造与运算得到sign加密结果以及构造后的 ...
- 给Jquery动态添加的元素添加事件
给Jquery动态添加的元素添加事件 来源:[http://wangqixia.diandian.com/post/2011-05-10/6597866] 我想很多人都会向我一样曾经 被新元素的事件绑 ...
- [生活日记]参与unity非游戏行业开发者大会小结
今天下午花了半天时间公司全体都去人民广场参与了一个unity非游戏行业开发者大会,主要了解到unity这款全球顶尖之一的游戏引擎的一个发展史,从05年三个美国人技术研发开始,一直到12年开始引进中国, ...
- csc.rsp Nuget MVC/WebAPI 5.0、SignalR 2.0、Rx、Json、Azure、EntityFramework、OAuth、Spatial
# This file contains command-line options that the C# # command line compiler (CSC) will process as ...