190225RabbitMQ
一、简单的RabbitMQ示例
- 生产者
# Author:Li Dongfei
import pika
connection = pika.BlockingConnection(
pika.ConnectionParameters('localhost')
) #建立一个连接
channel = connection.channel() #声明一个管道
channel.queue_declare(queue='hello') #生成一个queue
channel.basic_publish(exchange='',
routing_key='hello', #queue名字
body='Hello World!')
print(" [x] Sent 'Hello World!'")
connection.close()
- 消费者
# Author:Li Dongfei
import pika
connection = pika.BlockingConnection(
pika.ConnectionParameters('localhost')
)
channel = connection.channel()
channel.queue_declare(queue='hello')
def callback(ch, method, properties, body):
print("-->", ch, method, properties)
print(" [x] Received %r" %body)
channel.basic_consume(callback, #开始消费消息,如果收到消息就调用callback函数来处理消息
queue='hello',
no_ack=True
)
print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming() #开始收消息
二、RabbitMQ命令行工具
C:\>cd C:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.12\sbin
C:\Program Files\RabbitMQ Server\rabbitmq_server-3.7.12\sbin>rabbitmqctl.bat list_queues #列出当前的queue
三、rabbitmq持久化
- 队列持久化
channel.queue_declare(queue='hello', durable=True) #durable=True声明队列持久化
- 消息持久化
channel.basic_publish(exchange='',
routing_key='hello', #queue名字
body='Hello World!',
properties=pika.BasicProperties(
delivery_mode=2 #消息持久化
))
四、消息调度
- 在消费者中定义
channel.basic_qos(prefetch_count=1) #只要当前有一条消息在处理则不要给我发消息
五、广播模式
- fanout:所有bind到此exchange的queue都可以接受消息
- 订阅/发布
生成者
# Author:Li Dongfei
import pika
connection = pika.BlockingConnection(
pika.ConnectionParameters('localhost')
)
channel = connection.channel()
channel.exchange_declare(exchange='logs',
exchange_type='fanout')
message = "info: Hello World!"
channel.basic_publish(exchange='logs',
routing_key='',
body=message)
print(" [x] Sent %r" %message)
connection.close()
消费者
# Author:Li Dongfei
import pika
connection = pika.BlockingConnection(
pika.ConnectionParameters('localhost')
)
channel = connection.channel()
channel.exchange_declare(exchange='logs',
exchange_type='fanout')
result = channel.queue_declare(exclusive=True) #exclusive 唯一的
queue_name = result.method.queue
channel.queue_bind(exchange='logs',
queue=queue_name)
print(' [*] Waiting for logs. To exit press CTRL+C')
def callback(ch, method, properties, body):
print(" [x] %r" %body)
channel.basic_consume(callback,
queue=queue_name,
no_ack=True)
channel.start_consuming()
- direct:通过routingKey和exchange决定的哪个唯一的queue可以接受消息
生产者
# Author:Li Dongfei
import pika, sys
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'
))
channel = connection.channel()
channel.exchange_declare(exchange='direct_logs',
exchange_type='direct')
serverity = sys.argv[1] if len(sys.argv) > 1 else 'info'
message = ' '.join(sys.argv[2:]) or 'Hello World!'
channel.basic_publish(exchange='direct_logs',
routing_key=serverity,
body=message)
print(" [x] Sent %r:%r" %(serverity, message))
connection.close()
消费者
# Author:Li Dongfei
import pika, sys
connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
channel = connection.channel()
channel.exchange_declare(exchange='direct_logs',
exchange_type='direct')
result = channel.queue_declare(exclusive=True)
queue_name = result.method.queue
serverities = sys.argv[1:]
if not serverities:
sys.stderr.write("Usage: %s [info] [warning] [error]\n" %sys.argv[0])
sys.exit(1)
for serverity in serverities:
channel.queue_bind(exchange='direct_logs',
queue=queue_name,
routing_key=serverity)
print(' [*] Wating for logs. To exit press CTRL+C')
def callback(ch, method, properties, body):
print(" [x] %r:%r" %(method.routing_key, body))
channel.basic_consume(callback,
queue=queue_name,
no_ack=True)
channel.start_consuming()
topic:所有符合routingKey的routingKey所bind的queue可以接受消息
六、rabbitMQ rpc
- client
# Author:Li Dongfei
import pika, uuid
class FibonacciTpcClient(object):
def __init__(self):
self.connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'
))
self.channel = self.connection.channel()
result = self.channel.queue_declare(exclusive=True)
self.callback_queue = result.method.queue
self.channel.basic_consume(self.on_response, no_ack=True,
queue=self.callback_queue)
def on_response(self, ch, method, props, body):
if self.corr_id == props.correlation_id:
self.response = body
def call(self, n):
self.response = None
self.corr_id = str(uuid.uuid4())
self.channel.basic_publish(exchange='',
routing_key='rpc_queue',
properties=pika.BasicProperties(
reply_to=self.callback_queue,
correlation_id=self.corr_id,
),
body=str(n))
while self.response is None:
self.connection.process_data_events()
return int(self.response)
fibonacci_rpc = FibonacciTpcClient()
print(" [x] Requesting fib(30)")
response = fibonacci_rpc.call(30)
print(" [.] Got %r" %response)
- server
# Author:Li Dongfei
import pika, time
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'
))
channel = connection.channel()
channel.queue_declare(queue='rpc_queue')
def fib(n):
if n == 0:
return 0
elif n == 1:
return 1
else:
return fib(n-1) + fib(n-2)
def on_request(ch, method, props, body):
n = int(body)
print(" [.] fib(%s)" %n)
response = fib(n)
ch.basic_publish(exchange='',
routing_key=props.reply_to,
properties=pika.BasicProperties(correlation_id=props.correlation_id),
body=str(response))
ch.basic_ack(delivery_tag=method.delivery_tag)
channel.basic_qos(prefetch_count=1)
channel.basic_consume(on_request, queue='rpc_queue')
print(" [x] Awatiing RPC requests")
channel.start_consuming()
190225RabbitMQ的更多相关文章
随机推荐
- PHP框架 Laravel
PHP框架 CI(CodeIgniter) http://www.codeigniter.com/ http://codeigniter.org.cn/ Laravel PHP Laravel htt ...
- 用sysbench压测MySQL,通过orzdba监控MySQL
1.1 安装sysbench wget https://codeload.github.com/akopytov/sysbench/zip/0.5 unzip 0.5 cd sysbench-0.5/ ...
- ssh免密连接远程服务器
ssh免密连接远程服务器 借助ssky-keygen和ssh-copy-id工具,通过4个简单的步骤实现无需输入密码登录远程Linux主机 1 生成密钥 通过内置的工具生成RSA算法加密的密钥 ssh ...
- OSCache安装
OSCache是一个基于web应用的组件,他的安装工作主要是对web应用进行配置,大概的步骤如下: 1. 下载.解压缩OSCachehttps://java.net/downloads/oscache ...
- 对象序列化中transient关键字的用途
- xcode中的预定义宏
[xcode中的预定义宏] 1.SRCROOT,是定义本target的proj的路径. 2.OBJROOT,对象文件根路径,对象文件(即obj文件)就是中间的临时文件.中间文件输出目录的名字以“pro ...
- laravel 验证表单信息
1控制器验证 $this->validate($request,[ 'Student.name'=>'required|min:2|max:20', 'Student.age'=>' ...
- 使用Layered Window遇到的一些问题及解决方法
1. 使用Layered Window需要设置 WS_EX_LAYERED 属性 2. Layered Window不能作为Child Window 3. 它也不能包含子窗口,为什么呢,因为它收不到 ...
- 基于jquery 的插件,让IE支持placeholder属性
开发一个项目的时候为了美观和用户体验用到了input标签的placeholder属性,但是这个属性是html5中的,所以低版本的IE浏览器不支持.于是在百度找了一些解决方法,找了好几个都不是那么完美, ...
- ubuntu16.04 安装openpose
安装 Anaconda3 Tensorflow-cpu python3tensorflow 1.4.1+opencv3, protobuf, python3-tk ================== ...