本文将使用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:

  1. $ sudo rabbitmqctl list_queues
  2. Listing queues ...
  3. hello    0
  4. ...done.
$ sudo rabbitmqctl list_queues
Listing queues ...
hello 0
...done.

现在我们已经准备好了发送了。
从架构图可以看出,Producer只能发送到exchange,它是不能直接发送到queue的。现在我们使用默认的exchange(名字是空字符)。这个默认的exchange允许我们发送给指定的queue。routing_key就是指定的queue名字。

  1. channel.basic_publish(exchange='',
  2. routing_key='hello',
  3. body='Hello World!')
  4. print " [x] Sent 'Hello World!'"
channel.basic_publish(exchange='',
routing_key='hello',
body='Hello World!')
print " [x] Sent 'Hello World!'"

退出前别忘了关闭connection。

  1. connection.close()
connection.close()

3. Receiving

第二个program receive.py 将从queue中获取Message并且打印到屏幕。

第一步还是创建connection。第二步创建channel。第三步创建queue,name = hello:

  1. channel.queue_declare(queue='hello')
channel.queue_declare(queue='hello')

接下来要subscribe了。在这之前,需要声明一个回调函数来处理接收到的数据。

  1. def callback(ch, method, properties, body):
  2. print " [x] Received %r" % (body,)
def callback(ch, method, properties, body):
print " [x] Received %r" % (body,)

subscribe:

  1. channel.basic_consume(callback,
  2. queue='hello',
  3. no_ack=True)
channel.basic_consume(callback,
queue='hello',
no_ack=True)

最后,准备好无限循环监听吧:

  1. print ' [*] Waiting for messages. To exit press CTRL+C'
  2. channel.start_consuming()
print ' [*] Waiting for messages. To exit press CTRL+C'
channel.start_consuming()

4. 最终版本

send.py:

  1. #!/usr/bin/env python
  2. import pika
  3. connection = pika.BlockingConnection(pika.ConnectionParameters(
  4. host='localhost'))
  5. channel = connection.channel()
  6. channel.queue_declare(queue='hello')
  7. channel.basic_publish(exchange='',
  8. routing_key='hello',
  9. body='Hello World!')
  10. print " [x] Sent 'Hello World!'"
  11. 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:

  1. #!/usr/bin/env python
  2. import pika
  3. connection = pika.BlockingConnection(pika.ConnectionParameters(
  4. host='localhost'))
  5. channel = connection.channel()
  6. channel.queue_declare(queue='hello')
  7. print ' [*] Waiting for messages. To exit press CTRL+C'
  8. def callback(ch, method, properties, body):
  9. print " [x] Received %r" % (body,)
  10. channel.basic_consume(callback,
  11. queue='hello',
  12. no_ack=True)
  13. 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:

  1. $ python send.py
  2. [x] Sent 'Hello World!'
 $ python send.py
[x] Sent 'Hello World!'

send.py 每次运行完都会停止。注意:现在数据已经存到queue里了。接收它:

  1. $ python receive.py
  2. [*] Waiting for messages. To exit press CTRL+C
  3. [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!”的更多相关文章

  1. RabbitMQ 使用demo

    1.新建一个控制台应用程序:如图 2.代码如下: using RabbitMQ.Client;using RabbitMQ.Client.Events;using System;using Syste ...

  2. python中RabbitMQ的使用(安装和简单教程)

    1,简介 RabbitMQ是一个由erlang开发的AMQP(Advanced Message Queue )的开源实现的产品,RabbitMQ是一个消息代理,从"生产者"接收消息 ...

  3. RabbitMQ一个简单可靠的方案(.Net Core实现)

    前言 最近需要使用到消息队列相关技术,于是重新接触RabbitMQ.其中遇到了不少可靠性方面的问题,归纳了一下,大概有以下几种: 1. 临时异常,如数据库网络闪断.http请求临时失效等: 2. 时序 ...

  4. 带着新人学springboot的应用05(springboot+RabbitMQ 上)

    这次就来说说RabbitMQ,这个应该不陌生了,随便一查就知道这个是用来做消息队列的.(注意:这一节很多都是概念的东西,需要操作的比较少) 至于AMQP协议(Advanced Message Queu ...

  5. RabbitMQ实战经验分享

    前言 最近在忙一个高考项目,看着系统顺利完成了这次高考,终于可以松口气了.看到那些即将参加高考的学生,也想起当年高三的自己. 下面分享下RabbitMQ实战经验,希望对大家有所帮助: 一.生产消息 关 ...

  6. 安装最新版RabbitMQ v3.7.13 以及基本配置

    之前用的老版本,新项目新气象,RabbitMQ也用最新版吧 首先打开官网:http://www.rabbitmq.com/install-rpm.html 先到右侧导航栏来看一下 : 第一个红框是指的 ...

  7. Wireshark分析RabbitMQ

    消费者Code: using System; using System.Collections.Generic; using System.Linq; using System.Text; using ...

  8. Rabbitmq消息服务器通讯异常: name must not be blank

    前人挖坑,后人填! 倒霉的遇到一个破项目,该 项目使用了 RabbitMQ 消息队列向服务器发送消息, 但在发送中老是报 RabbitMQ 服务器异常! 呃,查看了服务器,服务器好好的,日志中却是这样 ...

  9. SpringBoot非官方教程 | 第十五篇:Springboot整合RabbitMQ

    转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springboot/2017/07/11/springboot15-rabbitmq/ 本文出自方志朋的博客 这 ...

随机推荐

  1. 第三周博客总结 <西北师范大学| 周安伟>

    一,本周助教小结 工作稳步推进,时间分配合理,点评效率有所提高,主要进行了评分工作,工作情况都汇总到了Excel中. 二,助教本人博客       https://home.cnblogs.com/u ...

  2. Unity Awards 2018最佳资源

    好的工具与资源,将帮助你的开发,达到事办功倍,今天我们将为大家介绍荣获Unity Awards 2018最佳资源的获奖作品. 最佳艺术工具:Aura - Volumetric Lighting Aur ...

  3. 记一次win10+oracle11.2安装

    下载安装文件,地址:链接:https://pan.baidu.com/s/1gObmWv5_w2Y4Jlf2-RkBYA 密码:1rx9 安装手册参考:链接:https://pan.baidu.com ...

  4. 控制台 console.write 中文为问号

    原因: 因为你当前环境代码页是437,是美国英语的字符编码 解决方式: 你把你环境设置成936就是简体中文字符编码环境了 Console.OutputEncoding = Encoding.GetEn ...

  5. setTimeout与Promise的区别

    1,4,3,2 Promise是一个micro task  主线程是一个task  micro task queue会在task后面执行 setTimeout返回的函数是一个新的task macro ...

  6. 2018-2019-2 20175234 实验二《Java面向对象程序设计》实验报告

    目录 实验内容 实验要求 实验步骤 实验收获 参考资料 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 解设计模式 实验 ...

  7. JS练习第三课

    用typeof查看数据类型 <pre> <script type="text/javascript"> alert(typeof 12345); <s ...

  8. slot-scope

    插槽,也就是slot,是组件的一块HTML模板,这块模板显示不显示.以及怎样显示由父组件来决定. 实际上,一个slot最核心的两个问题在这里就点出来了,是显示不显示和怎样显示. 由于插槽是一块模板,所 ...

  9. Oracle通过SCN做增量备份修复DG

    DG由于网络原因或者bug原因经常不同步,有时隔得时间久了,就会丢失归档日志,或者长时间的归档恢复较慢,有一种可以基于scn的方式来恢复DG库,使用基于scn的增量备份来恢复standby库可以节省大 ...

  10. [Battle]Battle章1 Presto VS Impala

    Round One: 平局:共同点就是吃内存; Round Two: Impala胜 Impala查询性能稍领先于presto Round Three: presto胜 presto在数据源支持上非常 ...