博客
关于我
RabbitMQ(三):Work Queues
阅读量:684 次
发布时间:2019-03-17

本文共 2399 字,大约阅读时间需要 7 分钟。

1. 参考链接:

2. 代码实现

定义生产者,其中有下列参数需要留意:

  • durable = True,此参数表示消息的持久化,如果生产者宕机了,设置为 True,可以保证即使宕机,消息会保存在硬盘里面(硬盘在RabbitMQ的管理界面可以指定);
  • delivery_mode = 2,此参数和durable一同使用,可以确保消息在RabbitMQ服务重启也不会丢失;
  • auto_ack = True, 应答参数,此参数默认打开,保证即使消费者宕机或无反馈,生产者不会重新发送这个消息;eg. 如果我们设置为False 并中断一个消费者consumer,生产者producer会重新发送一次消息;
    • 同时需要修改一串代码
    • ch.basic_asc(delivery_tag = method.delivery_tag)

 

import pikaimport datetimeif __name__ == "__main__":    connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))    channel3 = connection.channel()    channel3.queue_declare(queue='tom', durable=True)    # message = ''.join(sys.argv[1:]) or "tom and jerry"    message = str(datetime.datetime.now())    channel3.basic_publish(        exchange='',        routing_key='tom',        body=message,        properties=pika.BasicProperties(            delivery_mode=2        )    )    print("[x] sent %r"%message)    connection.close()

定义消费者

import pikaimport timedef call_back(ch, method, properties, body):    print('[*] recieved %r'%body.decode())    time.sleep(body.count(b'.'))    print('[*] done')    ch.basic_ack(delivery_tag = method.delivery_tag)if __name__ == '__main__':    connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))    channel = connection.channel()    channel.queue_declare(queue='tom', durable=True)    print('[*] waiting for message, to exit use ctrl + c')    channel.basic_qos(prefetch_count=1)    channel.basic_consume(queue='tom', on_message_callback=call_back)    channel.start_consuming()

3. 代码运行结果:

定义一个生产者:

两个消费者的接受消息:

4. Windows查看未处理的消息队列信息

因为如果消息一直未处理,将不断的存入内容,消息的消费速度赶不上生者的生产速度,将会导致消息内容不断增加,使用如下命令查看相关消息

rabbitmqctl.bat list_queues name messages_ready messages_unacknowledged

 

5. 疑问

1. 如果想要生产者不断的发送消息,应该怎么处理,同第二篇文章问题

import pikaimport datetimeimport timeif __name__ == "__main__":    connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))    channel3 = connection.channel()    channel3.queue_declare(queue='tom', durable=True)    # message = ''.join(sys.argv[1:]) or "tom and jerry"    while True:        message = str(datetime.datetime.now())        channel3.basic_publish(            exchange='',            routing_key='tom',            body=message,            properties=pika.BasicProperties(                delivery_mode=2            )        )        time.sleep(1)        print("[x] sent %r"%message)    connection.close()

输出如下

 

转载地址:http://kmkhz.baihongyu.com/

你可能感兴趣的文章
mysql中json_extract的使用方法
查看>>
mysql中kill掉所有锁表的进程
查看>>
mysql中like % %模糊查询
查看>>
MySql中mvcc学习记录
查看>>
mysql中null和空字符串的区别与问题!
查看>>
MySQL中ON DUPLICATE KEY UPDATE的介绍与使用、批量更新、存在即更新不存在则插入
查看>>
MYSQL中TINYINT的取值范围
查看>>
MySQL中UPDATE语句的神奇技巧,让你操作数据库如虎添翼!
查看>>
Mysql中varchar类型数字排序不对踩坑记录
查看>>
MySQL中一条SQL语句到底是如何执行的呢?
查看>>
MySQL中你必须知道的10件事,1.5万字!
查看>>
MySQL中使用IN()查询到底走不走索引?
查看>>
Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
查看>>
MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
查看>>
mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
查看>>
mysql中出现Unit mysql.service could not be found 的解决方法
查看>>
mysql中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
查看>>
Mysql中各类锁的机制图文详细解析(全)
查看>>
MySQL中地理位置数据扩展geometry的使用心得
查看>>
Mysql中存储引擎简介、修改、查询、选择
查看>>