producer:
import pika
# ############################## 生产者 ##############################
import json
if __name__ == '__main__':
cred = pika.PlainCredentials("user", "password")
connection = pika.BlockingConnection(pika.ConnectionParameters(host='127.0.0.1', virtual_host="/", port=5672, credentials=cred))
channel = connection.channel()
message = {
"no": "20181212",
"reccount": 300,
"producer": "计划发布人",
"pushtime": "2018-12-10 15:03:44",
}
channel.exchange_declare(exchange='test-exchange', exchange_type='direct',durable=True) # durable为true表示server停掉后数据任然在
channel.queue_declare(queue='test-queue', durable=True)
channel.queue_bind(exchange='test-exchange', queue='test-queue', routing_key='test-routing-key')
channel.basic_publish(exchange='test-exchange', routing_key='test-routing-key', body=json.dumps(message))
print(" [x] Sent %r" % message)
connection.close()
consumer:
import pika
import time
# ########################### 消费者 ###########################
def callback(ch, method, properties, body):
print(" [x] %r" % body)
time.sleep(5)
ch.basic_ack(delivery_tag=method.delivery_tag) # 手动确认消息处理完成
def test_consum():
cred = pika.PlainCredentials("user", "password")
connection = pika.BlockingConnection(pika.ConnectionParameters(host='127.0.0.1', virtual_host="/", port=5672, credentials=cred))
channel = connection.channel()
channel.exchange_declare(exchange='test-exchange', exchange_type='direct', durable=True)
channel.queue_declare(queue='test_queue', durable=True)
channel.queue_bind(exchange='test-exchange',
queue='test_queue',
routing_key='test-routing-key')
channel.basic_consume(callback,
queue='test_queue',
no_ack=False) # no_ack为false需要手动确认,队列才会删除
channel.start_consuming()
test_consum()
说明:
1、direct模式下,不同的消费者,订阅了相同的exchange、routing-key,绑定不同的queue的话,就会同时发送到不同的queue中
2、如果多个消费者所有订阅类容一样(订阅同一个queue),则会平均分配消息给消费者,每个消费者轮循一条一条的发送,可以在channel.basic_consume之前添加
channel.basic_qos(prefetch_count=1)
来设置每一个消费者的分配权重,某个消费者可多分配几条