RabbitMQ “Hello world!”
本文将使用Python(pika 0.9.8)实现从Producer到Consumer传递数据”Hello, World“。
首先复习一下上篇所学:RabbitMQ实现了AMQP定义的消息队列。它实现的功能”非常简单“:从Producer接收数据然后传递到Consumer。它能保证多并发,数据安全传递,可扩展。
和任何的Hello world一样,它们都不复杂。我们将会设计两个程序,一个发送Hello world,另一个接收这个数据并且打印到屏幕。
整体的设计如下图:
1. 环境配置
RabbitMQ 实现了AMQP。因此,我们需要安装AMPQ的library。幸运的是对于多种编程语言都有实现。我们可以使用以下lib的任何一个:
在这里我们将使用pika. 可以通过 pip 包管理工具来安装:
这个安装依赖于pip和git-core。
- On Ubuntu:
$ sudo apt-get install python-pip git-core
- On Debian:
$ sudo apt-get install python-setuptools git-core
$ sudo easy_install pip
- On Windows:To install easy_install, run the MS Windows Installer for setuptools
> easy_install pip
> pip install pika==0.9.8
2. Sending

第一个program send.py:发送Hello world 到queue。正如我们在上篇文章提到的,你程序的第一句话就是建立连接,第二句话就是创建channel:
创建连接传入的参数就是RabbitMQ Server的ip或者name。
关于谁创建queue,上篇文章也讨论过:Producer和Consumer都应该去创建。
接下来我们创建名字为hello的queue:
创建了channel,我们可以通过相应的命令来list queue:
- $ sudo rabbitmqctl list_queues
- Listing queues ...
- hello 0
- ...done.
$ sudo rabbitmqctl list_queues
Listing queues ...
hello 0
...done.
现在我们已经准备好了发送了。
从架构图可以看出,Producer只能发送到exchange,它是不能直接发送到queue的。现在我们使用默认的exchange(名字是空字符)。这个默认的exchange允许我们发送给指定的queue。routing_key就是指定的queue名字。
- channel.basic_publish(exchange='',
- routing_key='hello',
- body='Hello World!')
- print " [x] Sent 'Hello World!'"
channel.basic_publish(exchange='',
routing_key='hello',
body='Hello World!')
print " [x] Sent 'Hello World!'"
退出前别忘了关闭connection。
- connection.close()
connection.close()
3. Receiving

第二个program receive.py 将从queue中获取Message并且打印到屏幕。
第一步还是创建connection。第二步创建channel。第三步创建queue,name = hello:
- channel.queue_declare(queue='hello')
channel.queue_declare(queue='hello')
接下来要subscribe了。在这之前,需要声明一个回调函数来处理接收到的数据。
- def callback(ch, method, properties, body):
- print " [x] Received %r" % (body,)
def callback(ch, method, properties, body):
print " [x] Received %r" % (body,)
subscribe:
- channel.basic_consume(callback,
- queue='hello',
- no_ack=True)
channel.basic_consume(callback,
queue='hello',
no_ack=True)
最后,准备好无限循环监听吧:
- print ' [*] Waiting for messages. To exit press CTRL+C'
- channel.start_consuming()
print ' [*] Waiting for messages. To exit press CTRL+C'
channel.start_consuming()
4. 最终版本
send.py:
- #!/usr/bin/env python
- import pika
- connection = pika.BlockingConnection(pika.ConnectionParameters(
- host='localhost'))
- channel = connection.channel()
- channel.queue_declare(queue='hello')
- channel.basic_publish(exchange='',
- routing_key='hello',
- body='Hello World!')
- print " [x] Sent 'Hello World!'"
- connection.close()
#!/usr/bin/env python
import pika connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'))
channel = connection.channel() channel.queue_declare(queue='hello') channel.basic_publish(exchange='',
routing_key='hello',
body='Hello World!')
print " [x] Sent 'Hello World!'"
connection.close()
receive.py:
- #!/usr/bin/env python
- import pika
- connection = pika.BlockingConnection(pika.ConnectionParameters(
- host='localhost'))
- channel = connection.channel()
- channel.queue_declare(queue='hello')
- print ' [*] Waiting for messages. To exit press CTRL+C'
- def callback(ch, method, properties, body):
- print " [x] Received %r" % (body,)
- channel.basic_consume(callback,
- queue='hello',
- no_ack=True)
- channel.start_consuming()
#!/usr/bin/env python
import pika connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'))
channel = connection.channel() channel.queue_declare(queue='hello') print ' [*] Waiting for messages. To exit press CTRL+C' def callback(ch, method, properties, body):
print " [x] Received %r" % (body,) channel.basic_consume(callback,
queue='hello',
no_ack=True) channel.start_consuming()
5. 最终运行
先运行 send.py program:
- $ python send.py
- [x] Sent 'Hello World!'
$ python send.py
[x] Sent 'Hello World!'
send.py 每次运行完都会停止。注意:现在数据已经存到queue里了。接收它:
- $ python receive.py
- [*] Waiting for messages. To exit press CTRL+C
- [x] Received 'Hello World!'
$ python receive.py
[*] Waiting for messages. To exit press CTRL+C
[x] Received 'Hello World!'
接下来,就要奉上更接近实际环境的例子。取决与我的课余时间啊。。。
转载自: anzhsoft: http://blog.csdn.net/anzhsoft/article/details/19570187
参考文献:
1. http://www.rabbitmq.com/tutorials/tutorial-one-python.html
RabbitMQ “Hello world!”的更多相关文章
- RabbitMQ 使用demo
1.新建一个控制台应用程序:如图 2.代码如下: using RabbitMQ.Client;using RabbitMQ.Client.Events;using System;using Syste ...
- python中RabbitMQ的使用(安装和简单教程)
1,简介 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现的产品,RabbitMQ是一个消息代理,从"生产者"接收消息 ...
- RabbitMQ一个简单可靠的方案(.Net Core实现)
前言 最近需要使用到消息队列相关技术,于是重新接触RabbitMQ.其中遇到了不少可靠性方面的问题,归纳了一下,大概有以下几种: 1. 临时异常,如数据库网络闪断.http请求临时失效等: 2. 时序 ...
- 带着新人学springboot的应用05(springboot+RabbitMQ 上)
这次就来说说RabbitMQ,这个应该不陌生了,随便一查就知道这个是用来做消息队列的.(注意:这一节很多都是概念的东西,需要操作的比较少) 至于AMQP协议(Advanced Message Queu ...
- RabbitMQ实战经验分享
前言 最近在忙一个高考项目,看着系统顺利完成了这次高考,终于可以松口气了.看到那些即将参加高考的学生,也想起当年高三的自己. 下面分享下RabbitMQ实战经验,希望对大家有所帮助: 一.生产消息 关 ...
- 安装最新版RabbitMQ v3.7.13 以及基本配置
之前用的老版本,新项目新气象,RabbitMQ也用最新版吧 首先打开官网:http://www.rabbitmq.com/install-rpm.html 先到右侧导航栏来看一下 : 第一个红框是指的 ...
- Wireshark分析RabbitMQ
消费者Code: using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...
- Rabbitmq消息服务器通讯异常: name must not be blank
前人挖坑,后人填! 倒霉的遇到一个破项目,该 项目使用了 RabbitMQ 消息队列向服务器发送消息, 但在发送中老是报 RabbitMQ 服务器异常! 呃,查看了服务器,服务器好好的,日志中却是这样 ...
- SpringBoot非官方教程 | 第十五篇:Springboot整合RabbitMQ
转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springboot15-rabbitmq/ 本文出自方志朋的博客 这 ...
随机推荐
- Java第二周作业
Java第二周作业 本周作业: 参考http://www.cnblogs.com/rocedu/p/7911138.html 学习第二三章视频 参考http://www.cnblogs.com/roc ...
- python中sort命令介绍以及list结构中统计各元素出现的个数的方法
- hive上传下载数据
------------------------------------------read me--方式1:适用于工具传输--方式2:适用于手动临时性传输---------------------- ...
- Intellij Idea15 快捷键设置大全
一:菜单快捷键 快捷键 设置Bar快捷键,参考文章 进入(Enter Full Screen) Alt+S /(Status Bar) Alt+T /(Toolbar) Alt+B ...
- etcd-v3
参考:https://www.kancloud.cn/wjx0912/opensource/434745
- tomcat中如何禁止列目录下的文件
tomcat中如何禁止列目录下的文件在{tomcat_home}/conf/web.xml中,把listings参数设置成false即可,如下: <servlet> <servlet ...
- python学习——用dictionary实现通过地区查询邮编
刚刚学习了python的基本语法,对自己学习的内容进行实践下. dictionary字典(类似map) 总结:1.dictionary比list读取速度快,但是占用内存大,适合存放不需修改,经常查询的 ...
- oracle 索引提升查询速度, in 和 exist 效率
做记录: 今天有一个有153万条数据的表,发现查询很慢: select count(y) as transfereeNum,x from t_ast_subject_invest_order GROU ...
- 修改pudb颜色
2019-02-19,18点20vim调整颜色vim ~/.vimrc 这个pudb的配色用上的方法改不了.调试状态时候按o和回车能切换console和调试界面. 成功了.通过修改pudb源代码来实现 ...
- Python之PIL库
Python PIL PIL (Python Image Library) 库是Python 语言的一个第三方库,PIL库支持图像存储.显示和处理,能够处理几乎所有格式的图片. 一.PIL库简介 1. ...