接上一part<<RabbitMQ上手记录–part 2 - 安装RabbitMQ>>,这里我们来看看如何通过代码实现对RabbitMQ的调用。

RabbitMQ通常是安装在服务器端,那么要体现它的功能,当然还需要一个客户端来调用。这个客户端通常就是我们的业务系统,那么如何操作RabbitMQ呢?不可能让程序员写底层的传输代码或者局限于用erlang开发语言。RabbitMQ已经贴心的准备好了API Client,没错就是程序员喜闻乐见的API(或者说是调包)。

  RabbitMQ官方(http://www.rabbitmq.com/clients.html)提供了Java,.NET和erlang的API包,Java和.NET是开发业务系统的两大阵型,erlang是RabbitMQ的开发语言,所以官方主推了这三个语言的API包。那其他语言呢?没问题,RabbitMQ虽然没有提供实现,但是给出了”amqp”的URI规范(http://www.rabbitmq.com/uri-spec.html),也就是跟服务器通讯的一套协议,其他开发语言照着这个规范实现就可以了。有了官方的指引文档,加上活跃热心的社区群众,其他语言也有各自的API包,具体可参考http://www.rabbitmq.com/devtools.html

这里采用很火的Python作为示例代码,演示消费者如何订阅消息,生产者如何发布消息。

准备工作

1.已安装好RabbitMQ,并确保服务是在运行的()。

2.有可用的Python环境,并安装了RabbitMQ的API包pika。

开始编码

a.新建文件rabbitMQConfig.py,代码如下

import pika, sys

def getDefaultChannel():
credentials = pika.PlainCredentials("guest", "guest")
conn_params = pika.ConnectionParameters(
"localhost", credentials=credentials)
conn_broker = pika.BlockingConnection(conn_params)
channel = conn_broker.channel()
return channel

各行代码大致的意思

credentials = pika.PlainCredentials("guest", "guest")

guest是RabbitMQ默认的一个访客账号,只能用于连接本机localhost服务,密码默认也是guest。这里是创建明文的访问账号信息。

conn_params = pika.ConnectionParameters("localhost", credentials=credentials)

创建连接参数,有点类似于数据库的连接字符串信息

conn_broker = pika.BlockingConnection(conn_params)
channel = conn_broker.channel()

这里是创建一个连接,并且是一个阻塞的连接,会一直阻塞直到收到服务器的响应。然后创建一个通讯的channel,这个channel是进行后续操作的关键接口。

b.新建文件HelloWorldConsumer.py,代码如下

import rabbitMQConfig
import pika channel = rabbitMQConfig.getDefaultChannel() channel.exchange_declare(
exchange="hello-exchange",
exchange_type="direct",
passive=False,
durable=True,
auto_delete=False) channel.queue_declare(queue="hello-queue")
channel.queue_bind(
queue="hello-queue", exchange="hello-exchange", routing_key="hola") 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()

代码解释

在之前创建channel代码的基础上,我们依次完成了以下动作

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

创建exchange,名称为”hello-exchange”,类型是”direct”,也就是这个exchange是严格按照routing_key的值来匹配消息队列的。(具体相关的基本概念请参考《RabbitMQ 上手记录-part 1-基础概念》)

channel.queue_declare(queue="hello-queue")
channel.queue_bind(
     queue="hello-queue", exchange="hello-exchange", routing_key="hola")

创建queue,名称为”hello-queue“,并且绑定到”hello-exchange”,关联的routing_key是”hola”。这里的queue就是用于存放消息的消息队列。

def msg_consumer(channel, method, header, body):

这里定义了收到消息后的回调函数,这个函数会回确认消息已收到,同时会打印出收到的消息或者根据消息内容关闭连接。

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

最后的就是开始消费这个队列的消息,这是一个阻塞的操作,会一直等待有消息进入队列并推送到客户端。

到此消费者端的代码就完成了,接下来看看生产者端的代码。

c.新建文件HelloWorldProducer.py

import sys
import pika
import rabbitMQConfig channel = rabbitMQConfig.getDefaultChannel() channel.exchange_declare(
exchange="hello-exchange",
exchange_type="direct",
passive=False,
durable=True,
auto_delete=False) msg = sys.argv[1]
msg_props = pika.BasicProperties()
msg_props.content_type = "text/plain" channel.basic_publish(
body=msg,
exchange="hello-exchange",
properties=msg_props,
routing_key="hola")

这里的代码前面几行跟消费者的调用代码类似,都是通过配置拿到channel信息,然后声明一个exchange。可能比较奇怪,为什么之前消费者的代码里也调用了同样的代码声明同样的exchange。在声明exchange的时候,系统会判断是否已存在了相同名称的exchange,如果存在了直接返回。

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

这里定义了需要发送的消息内容,发送的文本从命令行获取,并且设置消息的content_type为”text/plain”

channel.basic_publish(
    body=msg,
     exchange="hello-exchange",
     properties=msg_props,
     routing_key="hola")

接下来是发布消息,关键的参数是指定发布到哪个exchange,消息内容,以及routing_key。

运行

python HelloWorldConsumer.py

然后另起一个bash/命令行

python HelloWorldProducer.py hello

运行之后在第一个命令行就能看到消息输出

以上就是最基本的发布消息和订阅消息的过程,后续我们来看看如何实现RabbitMQ集群。

RabbitMQ上手记录–part 3-发送消息的更多相关文章

  1. RabbitMQ上手记录–part 6-Shovel

    上一part<RabbitMQ上手记录–part 5-节点集群高可用(多服务器)>讲到了通过多个服务器来搭建RabbitMQ的节点集群,示例当中提到的服务器都是在同一个局域网中的(实际上是 ...

  2. RabbitMQ上手记录–part 5-节点集群高可用(多服务器)

    上一part<RabbitMQ上手记录–part 4-节点集群(单机多节点)>中介绍了RabbitMQ集群的一些概念以及实现了在单机上运行多个节点,并且将多个节点组成一个集群. 通常情况下 ...

  3. RabbitMQ上手记录–part 2 - 安装RabbitMQ

    上一篇<<RabbitMQ 上手记录-part 1>>介绍了一些基础知识,整理了一些基础概念.接下来整理一些安装步骤和遇到的问题. 我在CentOS7和Ubuntu16.4上都 ...

  4. RabbitMQ初学之二:直接发送消息到队列

    一. 背景 总前提:队列无论是在生产者声明还是在消费者声明,只有声明了,才能在RabbitMQ的管理界面看到该队列 生产者直接发送消息到队列,消费者直接消费队列中的消息,而不用指定exchange并绑 ...

  5. RabbitMQ 上手记录-part 1-基础概念

    RabbitMQ是什么,不用多介绍了,毕竟名声在那,江湖地位摆着,搜索引擎收录着.为什么突然去学习这个框架了,毕竟工作中没有用得上(说来也惭愧,工作中开发的项目没有使用这个框架).但是作为互联网分布式 ...

  6. RabbitMQ上手记录–part 4-节点集群(单机多节点)

    现在互联网应用动不动就说要HA,好像不搞个HA都不好意思说自己的应用能承载高并发,大用户量访问.RabbitMQ这个经典的消息组件,也必然逃不掉单点失效的尴尬局面.当然在RabbitMQ在被广泛应用于 ...

  7. RabbitMQ详解(二)------消息通信的概念

    PS:近期在南宁出差,工作比较忙,所以更新会比较慢. 说到消息通信,可能我们首先会想到的是邮箱,QQ,微信,短信等等这些通信方式,这些通信方式都有发送者,接收者,还有一个中间存储离线消息的容器.但是这 ...

  8. 【RabbitMQ学习记录】- 消息队列存储机制源码分析

    本文来自 网易云社区 . RabbitMQ在金融系统,OpenStack内部组件通信和通信领域应用广泛,它部署简单,管理界面内容丰富使用十分方便.笔者最近在研究RabbitMQ部署运维和代码架构,本篇 ...

  9. RabbitMQ学习系列二-C#代码发送消息

    RabbitMQ学习系列二:.net 环境下 C#代码使用 RabbitMQ 消息队列 http://www.80iter.com/blog/1437455520862503 上一篇已经讲了Rabbi ...

随机推荐

  1. Autofac创建实例的方法总结[转]

    1.InstancePerDependency 对每一个依赖或每一次调用创建一个新的唯一的实例.这也是默认的创建实例的方式. 官方文档解释:Configure the component so tha ...

  2. JS 中的数据类型

    简介 JavaScript 语言的每一个值,都属于某一种数据类型.JavaScript 的数据类型,共有七种 数值(number):整数和小数,比如1和3.14 字符串(string):文本 布尔值( ...

  3. day52 进程与守护进程

    http://www.cnblogs.com/Eva-J/articles/8253549.html 博客参考. 多进程聊天 守护进程. 多进程 1.Unix/Linux:fork()调用实现多进程. ...

  4. CRT和EXCRT简单学习笔记

    中国剩余定理CRT 中国剩余定理是要求我们解决这样的一类问题: \[\begin{cases}x\equiv a_1\pmod {b_1} \\x\equiv a_2 \pmod{b_2}\\...\ ...

  5. docker 搭建Mysql集群

    docker基本指令: 更新软件包 yum -y update 安装Docker虚拟机(centos 7) yum install -y docker 运行.重启.关闭Docker虚拟机 servic ...

  6. django url 路由设置技巧

    Django的url使用方法 利用Django开发站点.能够设计出很优美的url规则,假设url的匹配规则(包括正則表達式)组织得比較好,view的结构就会比較清晰.比較easy维护. 最简单的形式 ...

  7. Python小白学习之路(三)—【数字功能】【字符串功能】

    数字(int)常见功能 在网络课上,老师把这些功能称为神奇的魔法,想要揭开魔法神奇的面纱,想要看看有什么招数,在Pycharm里敲击三个字母(int),按住Ctrl,将鼠标点在int上,这时鼠标会变成 ...

  8. 【GDOI2018模拟8】 数学竞赛 三角函数性质+记忆化搜索

    数据范围:p,q≤20. 只能说我整个人傻逼了..... 我们考虑三角函数的部分性质: $sin(x)=\sqrt{ 1-cos^2(x)}$ $cos(x)=\sqrt{1-sin^2(x)}$ $ ...

  9. 【learning】微信跳一跳辅助c++详解 轻松上万 【下】

    如果你还没有看完本blog的上篇,建议您先看完上篇!! 第一代辅助如何死的? 我们先来看四张图      如上方最左图所示,前面是一个小圆柱子,看起来很人畜无害似不似?? 由于上一步跳出了偏差,并没有 ...

  10. HTTP协议及WWW服务应用

    一.用户访问网站的流程图 二.DNS解析的流程图 三.用户访问网站的基本流程原理阐述 ① 用户在浏览器中输入请求的地址回车 ② 先找本地的缓存和Hosts文件,有解析的对应IP直接返回个客户端IP地址 ...