生产者代码

# -*- coding: utf-8 -*-
# pylint: disable=C0111,C0103,R0205 import json
import pika
from pika.exchange_type import ExchangeType print('pika version: %s' % pika.__version__) def main():
credentials = pika.PlainCredentials('root', 'root')
parameters = pika.ConnectionParameters('192.168.133.11', credentials=credentials)
connection = pika.BlockingConnection(parameters)
channel = connection.channel()
channel.exchange_declare( # 创建交换机
exchange='test_exchange',
exchange_type=ExchangeType.direct,
passive=False,
durable=True,
auto_delete=False)
channel.queue_declare(queue='standard') # 创建队列
channel.queue_bind( # 队列绑定
queue='standard', exchange='test_exchange', routing_key='standard_key')
# 发布消息
channel.basic_publish(
exchange='test_exchange',
routing_key='standard_key',
body=json.dumps("hello world"),
properties=pika.BasicProperties(content_type='application/json')) connection.close() if __name__ == '__main__':
main()

消费者

import functools
import logging
import time import pika
from pika.exchange_type import ExchangeType LOG_FORMAT = ('%(levelname) -10s %(asctime)s %(name) -30s %(funcName) '
'-35s %(lineno) -5d: %(message)s')
LOGGER = logging.getLogger(__name__) logging.basicConfig(level=logging.INFO, format=LOG_FORMAT) MAX_RETRY_COUNT = 3
retry_count = 0 def on_message(chan, method_frame, header_frame, body, userdata=None):
"""Called when a message is received. Log message and ack it."""
LOGGER.info('Delivery properties: %s, message metadata: %s', method_frame, header_frame)
LOGGER.info('Userdata: %s, message body: %s', userdata, json.loads(body))
LOGGER.info("chan>>>>>>>>>>>>>>>>>>{0}, type:{1}".format(chan, type(chan))) # BlockingChannel
# 1.关闭自动回执,当auto_ack为false(默认就为false),需要自己手动回执即调用chan.basic_ack()方法
# chan.basic_ack(delivery_tag=method_frame.delivery_tag)
# 2.自动回执,当auto_ack为true时,自动回执,不需要再调用chan.basic_ack()方法 # 设置nack回执,即拒绝消费,然后重入到队列,requeue=True为默认值, 会一直重试,requeue=False时,丢弃消息
# chan.basic_nack(delivery_tag=method_frame.delivery_tag, requeue=True) # 本地重试机制,最大3次
try:
# 模拟错误
print(1/0)
except Exception as e:
global retry_count
if retry_count < MAX_RETRY_COUNT:
# 处理失败,重新放回队列
chan.basic_recover(requeue=True)
retry_count += 1
print(f"重试次数:{retry_count}")
time.sleep(5) # 模拟延迟
else:
# 超过最大重试次数,不再消费
print("超过最大重试次数")
# 发送拒绝消费回执,同时设置requeue为False,将消息丢弃
chan.basic_nack(delivery_tag=method_frame.delivery_tag, requeue=False)
# 将该消息发送到其他队列处理
chan.basic_publish(exchange='test_exchange',
routing_key='handle_err',
body=body,
properties=pika.BasicProperties(content_type='application/json'))
chan.stop_consuming() # 停止消费 def main():
"""Main method."""
credentials = pika.PlainCredentials('root', 'root')
parameters = pika.ConnectionParameters('192.168.133.11', credentials=credentials)
connection = pika.BlockingConnection(parameters) channel = connection.channel() # 创建信道
channel.exchange_declare( # 创建交换机
exchange='test_exchange',
exchange_type=ExchangeType.direct,
passive=False,
durable=True,
auto_delete=False)
channel.queue_declare(queue='dur_standard', durable=True) # 创建队列
channel.queue_bind( # 队列绑定
queue='dur_standard', exchange='test_exchange', routing_key='standard_key')
channel.queue_bind( # 队列绑定
queue='handle_err_queue', exchange='test_exchange', routing_key='handle_err')
channel.basic_qos(prefetch_count=1) on_message_callback = functools.partial(
on_message, userdata='on_message_userdata')
# 消费者消费消息后的回调函数on_message_callback
# basic_consume中有auto_ack字段,默认为false,即不自动ack。
channel.basic_consume('dur_standard', on_message_callback) try:
# 开始消费
channel.start_consuming()
except KeyboardInterrupt:
# 停止消费
channel.stop_consuming() connection.close() if __name__ == '__main__':
main()

pika的更多相关文章

  1. 360开源的类Redis存储系统:Pika

    Pika 是 360 DBA 和基础架构组联合开发的类 Redis 存储系统,完全支持 Redis 协议,用户不需要修改任何代码,就可以将服务迁移至 Pika.有维护 Redis 经验的 DBA 维护 ...

  2. rabbitmq pika connection closed

    You are here: Home / rabbitmq pika connection closed rabbitmq pika connection closed By lijiejie on  ...

  3. rabbitMQ实战(一)---------使用pika库实现hello world

    rabbitMQ实战(一)---------使用pika库实现hello world 2016-05-18 23:29 本站整理 浏览(267)     pika是RabbitMQ团队编写的官方Pyt ...

  4. python的pika模块操作rabbitmq

    上一篇博文rabbitmq的构架和原理,了解了rabbitmq的使用原理,接下来使用python的pika模块实现使用rabbitmq. 环境搭建 安装python,不会的请参考Linux安装配置py ...

  5. 关于python中pika模块的问题

    工作中经常用到rabbitmq,而用的语言主要是python,所以也就经常会用到python中的pika模块,但是这个模块的使用,也给我带了很多问题,这里整理一下关于这个模块我在使用过程的改变历程已经 ...

  6. python rabbitmq的库,rabbitpy代替pika

    之前看网上都是清一色pika包的例子,就用的pika包,最大问题是非多线程安全,改为使用rabbitpy.大幅改善了pika多线程需要加锁,和外网推送延迟又不能开多线程导致推送慢的问题. rabbit ...

  7. RabbitMQ python模块pika生产者消费者轮询模型。

    完整代码如下: 生产者,producer import pika connection = pika.BlockingConnection( pika.ConnectionParameters('lo ...

  8. week06 12 后端utils cloudAMQP_client.py 安装pika

    我们回到后端 pika是专门处理RabitAMQP的包 或者你可以直接一步到位 我们不能一直让我们的网络爬虫一直爬信息 一是网络消耗很大(cpu) 二是容易被网站发现被禁ip self.connect ...

  9. pika的阻塞式使用

    [root@cloudplatform ELK]# cat startIncHouTai.py import os # 杀掉内存中的进程 cmd='pgrep -f PutDataToKafkaInc ...

  10. CentOS6.8安装360 pika

    1.安装依赖包 yum install snappy-devel bz2 libzip-dev libsnappy-dev libprotobuf-dev libevent-dev protobuf- ...

随机推荐

  1. [转帖]Mars II - Microarchitectures - Phytium

    https://en.wikichip.org/wiki/phytium/microarchitectures/mars_ii Edit Values Mars II µarch General In ...

  2. reposync与createrepo创建离线yum源的方法

    背景 昨天晚上进行了在线升级银河麒麟V10SP2的audit和mate-indicator的rpm包 今天想了下,如果机器无法上网. 必须得在公司内部搭建一套离线的rpm源进行处理 想了下还是使用re ...

  3. SAP Gateway Trace

    最近在SAP PE项目上遇到一个需求要求记录所有的ODATA(含S4/CLOUD API)的报文. Below T-codes recording logging and tracing: /IWFN ...

  4. AI-WEB-1.0靶机

    AI-WEB-1.0靶机 情报收集 扫描靶机,打开网站提示 Not even Google search my contents! dirb http://192.168.218.139 扫描网站 进 ...

  5. 京东云开发者|深入JDK中的Optional

    概述:Optional最早是Google公司Guava中的概念,代表的是可选值.Optional类从Java8版本开始加入豪华套餐,主要为了解决程序中的NPE问题,从而使得更少的显式判空,防止代码污染 ...

  6. JAVA多线程并发编程-避坑指南

    作者:京东零售 肖朋伟 一.前言 开发过程中,多线程的应用场景可谓十分广泛,可以充分利用服务器资源,提高程序处理速度.我们通常也会使用池化技术,去避免频繁创建和销毁线程. 本篇旨在基于编码规范.工作中 ...

  7. TienChin 渠道管理-渠道类型

    在上一篇文章当中,表里面有一个渠道类型,我们这节主要是将这个渠道类型创建好,首先我们来看看字典表. sys_dict_type 表: 字段名 数据类型 注释 dict_id bigint 字典主键 d ...

  8. 强化学习从基础到进阶-案例与实践[5.1]:Policy Gradient策略梯度-Cart pole游戏展示

    强化学习从基础到进阶-案例与实践[5.1]:Policy Gradient策略梯度-Cart pole游戏展示 强化学习(Reinforcement learning,简称RL)是机器学习中的一个领域 ...

  9. C++ Qt开发:数据库与TableView多组件联动

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍TableVi ...

  10. C# 实现对网站Get与Post请求

    C# 是一种面向对象的编程语言,提供了强大的Web请求库和API来执行 HTTP GET 和 POST 请求.在C#中,我们可以使用 System.Net 命名空间下的 WebRequest 和 We ...