玩转RabbitMQ之四:第一个小程序Hello World

一、准备工作

1、安装easy_install

  easy_install是python包setuptools的一部分,它能帮我们安装需要的python包,这里我们使用pika库来编写小程序,安装参考:easy_install的安装与使用

2、安装pika
$ easy_install pika

PS.《玩转RabbitMQ》系列文章的实例都是在centos7+python+pika+RabbitMQ的环境上完成的,如果你的环境是windows,请自行搜索搭建环境教程。


二、安装IDE

  你可以选择使用编辑器,但是我还是更喜欢装个IDE,这样还能自动补全还有报错提示,提高写程序的效率,pycharm是一个比较不错的python IDE,安装教程可以参考: CentOS 7安装Pycharm 简记,如果你需要注册码,可以点击链接IntelliJ IDEA 注册码


三、开始小程序

  终于要动手写代码了,心情还有点小激动,你可以专门创建一个目录来放置代码,并且为每个章节创建一个目录,这样到后面当你需要回顾前面的章节和例子时,方便查找。



1、生产者

代码如下:

#coding=utf-8
import pika, sys

# 1. Built connect to proxy server
credentials = pika.PlainCredentials("guest", "guest")
connection = pika.BlockingConnection(pika.ConnectionParameters("localhost", credentials = credentials))

# 2. Get channel
channel = connection.channel()

# 3. Declare exchanger
channel.exchange_declare(exchange="hello-exchange",
                        exchange_type="direct",
                        passive=False,
                        durable=True,
                        auto_delete=False)

# 4. Create message
msg = sys.argv[1]
msg_props = pika.BasicProperties()
msg_props.content_type = "text/plain"

# 5. Release message
channel.basic_publish(exchange='hello-exchange',
                      routing_key='hola',
                      body=msg,
                      properties=msg_props)

下面逐行解读代码:

  第一行声明了编码为UTF-8,如果不加则打印中文时可能会出现乱码。

#coding=utf-8

  第二行引入了需要的包。

import pika, sys

  RabbitMQ默认有一个用户名为guest,密码为guest的用户,我们使用这个用户来连接本地的MQ代理服务器。

# 1. Built connect to proxy server
credentials = pika.PlainCredentials("guest", "guest")
connection = pika.BlockingConnection(pika.ConnectionParameters("localhost", credentials = credentials))

  成功连接上后就会创建一个AMQP的TCP连接,通过这个连接来获取信道。

# 2. Get channel
channel = connection.channel()

  接下来声明一个交换器,交换器名称是hello-exchange,交换器类型是direct,这里要注意一下,RabbitMQ 3.0之前的版本声明交换器类型用的属性是type(即type="direct"),3.0之后的版本的属性值改为exchange_type,需要根据使用MQ版本来调整代码,否则程序运行会报错;passive属性如果设为true,那么会去检测交换器是否已创建,有则成功返回,无则失败报错,这里我们是想创建交换器,所以设为false;durable属性设为True则会创建一个持久化的交换器;auto_delete属性设为False则交换器不会被自动删除,一般跟durable配合使用。这样就创建了一个交换器名为hello-exchange,类型为direct,可持久化不会自动删除的交换器。

# 3. Declare exchanger
channel.exchange_declare(exchange="hello-exchange",
                        exchange_type="direct",
                        passive=False,
                        durable=True,
                        auto_delete=False)

  生产者会发布消息,这里从输入获取消息内容,输入就是执行py文件时传入的参数,并且设置了消息内容类型是text/plain。

# 4. Create message
msg = sys.argv[1]
msg_props = pika.BasicProperties()
msg_props.content_type = "text/plain"

  最后一步,将消息发布到交换器上,并声明绑定规则(或者称路由键)为“hola”,消息内容和属性分别通过body和properties设置。

# 5. Release message
channel.basic_publish(exchange='hello-exchange',
                      routing_key='hola',
                      body=msg,
                      properties=msg_props)


2、消费者
import pika

# 1. Build connect to proxy server
credentials = pika.PlainCredentials("guest", "guest")
conn_params = pika.ConnectionParameters("localhost", credentials=credentials)
conn_broker = pika.BlockingConnection(conn_params)

# 2. Get channel
channel = conn_broker.channel()

# 3. Declare exchanger
channel.exchange_declare(exchange="hello-exchange",
                         exchange_type="direct",
                         passive=False,
                         durable=True,
                         auto_delete=False)

# 4. Declare queue and Bind queue with exchanger by routing_key
channel.queue_declare(queue="hello-queue")
channel.queue_bind(queue="hello-queue",
                   exchange="hello-exchange",
                   routing_key="hola")

# 5. Declare function to deal with info
def msg_consumer(channel, method, header, body):
    channel.basic_ack(delivery_tag=method.delivery_tag)
    if body == "quit":
        channel.basic_cancel(consumer_tag="hello-consumer")
        channel.stop_consuming()
    else:
        print body
    return
channel.basic_consume(msg_consumer,
                      queue="hello-queue",
                      consumer_tag="hello-consumer")
channel.start_consuming()

  连接代理服务器,获取信道,声明交换器,前面三步的代码跟生产者完全一样,第四步声明名字叫hello-queue的队列,并将队列绑定到交换器hello-exchange,路由键是"hola",这样上面生产者发布的消息就能到达消费者了,如果生产者发布的消息到达交换器时找不到匹配路由键的队列,那消息将进入“黑洞”。

# 4. Declare queue and Bind queue with exchanger by routing_key
channel.queue_declare(queue="hello-queue")
channel.queue_bind(queue="hello-queue",
                   exchange="hello-exchange",
                   routing_key="hola")

  来到最后一步,前面定义了一个函数,当消息到达消费者时,函数会被消费者调用,函数被调用时,先通过信道向MQ确认收到了消息,接着输出消息内容,为了能让生产者控制消费者关闭信道停止消费,假如消息内容为"quit",则消费者关闭信道停止消费;将消费者连接到信道上并开启消费,这样就开始监听信道里的消息了。

channel.basic_consume(msg_consumer,
                      queue="hello-queue",
                      consumer_tag="hello-consumer")
channel.start_consuming()


四、执行小程序

1、进入执行目录,启动RabbitMQ服务
[root@localhost sbin]# rabbitmq-server -detached
Warning: PID file not written; -detached was passed.

PS.如果consumer启动失败报错,如下图所示:

[root@localhost chapter-2]# python hello_world_consumer.py 
Traceback (most recent call last):
  File "hello_world_consumer.py", line 35, in <module>
    consumer_tag="hello-consumer")
TypeError: basic_consume() got multiple values for keyword argument 'queue'

证明安装的pika版本可能太新了,可覆盖安装一个低版本的pika

[root@localhost ~]# pip install pika==0.12
Collecting pika==0.12
  Downloading https://files.pythonhosted.org/packages/bf/48/72de47f63ba353bacd74b76bb65bc63620b0706d8b0471798087cd5a4916/pika-0.12.0-py2.py3-none-any.whl (108kB)
    100% |████████████████████████████████| 112kB 46kB/s 
Installing collected packages: pika
  Found existing installation: pika 1.0.1
    Uninstalling pika-1.0.1:
      Successfully uninstalled pika-1.0.1
Successfully installed pika-0.12.0

还有另外一种方式是按照新版本pika的语法改代码,参考:
https://cloud.tencent.com/developer/article/1445712


2、启动消费者
[root@localhost chapter-2]# ll
总用量 12
-rwxrwxrwx. 1 root root 1251 8月  25 14:17 hello_world_confirm_producer.py
-rwxrwxrwx. 1 root root 1221 8月  19 22:56 hello_world_consumer.py
-rwxrwxrwx. 1 root root  823 8月  20 00:24 hello_world_producer.py
[root@localhost chapter-2]# python hello_world_consumer.py 


3、生产者发布消息
[root@localhost chapter-2]# python hello_world_producer.py hello-world


4、查看消费者终端输出
[root@localhost chapter-2]# ll
总用量 12
-rwxrwxrwx. 1 root root 1251 8月  25 14:17 hello_world_confirm_producer.py
-rwxrwxrwx. 1 root root 1221 8月  19 22:56 hello_world_consumer.py
-rwxrwxrwx. 1 root root  823 8月  20 00:24 hello_world_producer.py
[root@localhost chapter-2]# python hello_world_consumer.py 
hello-world


5、让消费者停止消费退出

(1)生产者发布消息

[root@localhost chapter-2]# python hello_world_producer.py quit

(2)消费者收到消息后退出

[root@localhost chapter-2]# ll
总用量 12
-rwxrwxrwx. 1 root root 1251 8月  25 14:17 hello_world_confirm_producer.py
-rwxrwxrwx. 1 root root 1221 8月  19 22:56 hello_world_consumer.py
-rwxrwxrwx. 1 root root  823 8月  20 00:24 hello_world_producer.py
[root@localhost chapter-2]# python hello_world_consumer.py 
hello-world
[root@localhost chapter-2]# 

  第一个hello-world的小程序成功了!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,647评论 18 139
  • http://liuxing.info/2017/06/30/Spring%20AMQP%E4%B8%AD%E6%...
    sherlock_6981阅读 15,904评论 2 11
  • 什么叫消息队列 消息(Message)是指在应用间传送的数据。消息可以非常简单,比如只包含文本字符串,也可以更复杂...
    lijun_m阅读 1,343评论 0 1
  • 来源 RabbitMQ是用Erlang实现的一个高并发高可靠AMQP消息队列服务器。支持消息的持久化、事务、拥塞控...
    jiangmo阅读 10,353评论 2 34
  • 注:这份文档是我和几个朋友学习后一起完成的。 目录 RabbitMQ 概念 exchange交换机机制什么是交换机...
    Mooner_guo阅读 33,038评论 8 97