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/ 本文出自方志朋的博客 这 ...
随机推荐
- C# 木马功能的简单实现
1.首先解决开机启动木马.通过建立开机启动服务达到目的:2.伪装问题.通过c#反射性能,将正常的.net的exe文件添加监控盗传播取等其他功能,执行正常程序同时,后台悄悄释放windows服务,通过服 ...
- 摘选改善Python程序的91个建议
1.理解Pythonic概念 Pythonic Tim Peters 的 <The Zen of Python>相信学过 Python 的都耳熟能详,在交互式环境中输入import thi ...
- xx星空面试题
一面 1.什么是多态 实现原理? 2.什么是重载?class加载原理? 3.常用设计模式,简单介绍 4.看过哪些java的书?android的书? 5.动态注册静态注册 优缺点?静态注册函数如何被调用 ...
- 【转载】SQL Server中的Merge关键字
简介 原文地址 Merge关键字是一个神奇的DML关键字.它在SQL Server 2008被引入,它能将Insert,Update,Delete简单的并为一句.MSDN对于Merge的解释非常的短小 ...
- flask debug 模式开启
debug 模式开启 最近在写python flask 的Waf后台管理界面,想要启用调试模式,发现安装目前网上流行的两种方式均无法在我的Pycharm中打开调试模式. )直接在对象上设置 app.d ...
- 增加cookie和表单提交的安全
设置COOKIE setcookie ( string $name [, string $value = "" [, int $expire = 0 [, string $path ...
- java之servlet学习基础(二)
上一次写到Servlet的实现方法,主要还是通过继承HttpServlet来实现Servlet.下面主要是回顾一下HttpServletRequest和HttpServletResponse对象中的一 ...
- python基础 (初识函数&函数进阶)
函数基础部分 .什么是函数? 函数是组织好的,可重复使用的,用来实现单一,或相关联功能的代码段. 函数能提高应用的模块性,和代码的重复利用率. 2.定义函数 定义:def 关键词开头,空格之后接函数名 ...
- 使用iconfont图标
iconfont.cn基本使用 登录iconfont.cn网站,直接使用github账号即可登录 输入关键字搜索需要的图标,然后在需要的图标上点击'添加入库' 点击网站右上角的购物车图标,查看当前已入 ...
- redis相关运维命令
1. 查询redis里面的大key? 在redis实例上执行bgsave,然后我们对dump出来的rdb文件进行分析,找到其中的大KEY 有个不太推荐的命令,debug object xxx 可以看到 ...