python操作rabbitmq的consumer,并强制关闭特定consumer的连接

引入

python获取指定队列的consumer

python可以使用rabbitmq_management的api获取所有consumer的信息。【队列需要安装rabbitmq_management,在大部分情况下,我们安装队列的同时,都会安装管理界面,以方便一些简单的手动操作与简单监控】

获取consumer详情

以下代码就可以输出指定队列的consumer详情

import requests
from requests.auth import HTTPBasicAuth

rabbitmq_host = '10.139.1.124'
# RabbitMQ管理API的URL
url = f'http://{rabbitmq_host}:15672/api/consumers'

# RabbitMQ的用户名和密码
username = 'guest'
password = 'guest'

response = requests.get(url, auth=HTTPBasicAuth(username, password))

# 检查请求是否成功
if response.status_code == 200:
    consumers = response.json()
    for consumer in consumers:
        print(consumer)

**f’http://{rabbitmq_host}:15672/api/consumers’**这个api是我们常用与consumer操作的接口
运行这个代码之后,一般会输出多行的consumer信息,每条信息如下:

{'arguments': {}, 'ack_required': True, 'active': True, 'activity_status': 'up', 'channel_details': {'connection_name': '10.139.1.124:60440 -> 172.17.0.4:5672', 'name': '10.139.1.124:60440 -> 172.17.0.4:5672 (1)', 'node': 'rabbit@31ae4d091d79', 'number': 1, 'peer_host': '10.139.1.124', 'peer_port': 60440, 'user': 'guest'}, 'consumer_tag': 'ctag1.c48bbeb0d7d241519fd54553bc73c1b8', 'exclusive': False, 'prefetch_count': 1, 'queue': {'name': 'amap_work_error', 'vhost': '/'}}

这些信息包含了消费者的状态,消费者id,消费的队列信息,确认消费信息等。详细的字段解释如下:

consumer详情字段解释

{
    'arguments': {},  # 消费者的额外参数
    'ack_required': True,  # 是否需要确认消息
    'active': True,  # 消费者是否活跃
    'activity_status': 'up',  # 消费者的活动状态
    'channel_details': {  # 消费者的通道详情
        'connection_name': '10.139.1.124:60440 -> 172.17.0.4:5672',  # 连接名称
        'name': '10.139.1.124:60440 -> 172.17.0.4:5672 (1)',  # 通道名称
        'node': 'rabbit@31ae4d091d79',  # RabbitMQ节点名称
        'number': 1,  # 通道编号
        'peer_host': '10.139.1.124',  # 连接的主机
        'peer_port': 60440,  # 连接的端口
        'user': 'guest'  # 用户名
    },
    'consumer_tag': 'ctag1.c48bbeb0d7d241519fd54553bc73c1b8',  # 消费者标签
    'exclusive': False,  # 消费者是否为独占
    'prefetch_count': 1,  # 预取消息数量
    'queue': {
        'name': 'amap_work_error',  # 队列名称
        'vhost': '/'  # 虚拟主机
    }
}

这也我们只需要对consumer信息内略加过滤就可以满足自己的大部分需求

强制关闭consumer【通过关闭rabbitmq的通道实现】

cookies = {
    '_ga': 'GA1.1.1271813516.1712559218',
    '_ga_4NJG4BH26D': 'GS1.1.1713228409.2.0.1713228409.0.0.0',
    'Hm_lvt_bd78bc908e66174e7dde385bf37cb4c1': '1714963778,1715568623,1715824211,1716187398',
    'Hm_lpvt_bd78bc908e66174e7dde385bf37cb4c1': '1716519695',
    'm': '2258:Z3Vlc3Q6Z3Vlc3Q%253D',
}

headers = {
    'Accept': '*/*',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8',
    'Cache-Control': 'no-cache',
    'Origin': 'http://10.139.1.132:15672',
    'Pragma': 'no-cache',
    'Proxy-Connection': 'keep-alive',
    'Referer': 'http://10.139.1.132:15672/',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36',
    'X-Reason': 'Closed via management plugin',
    'authorization': 'Basic Z3Vlc3Q6Z3Vlc3Q=',
    'content-type': 'application/json',
}

source = "10.139.1.127:53199 -> 172.17.0.3:5672"
encoded_url = quote(source, safe='')

close_demo_url = f'http://10.139.1.132:15672/api/connections/{encoded_url}'
print(close_demo_url)
json_data = {
    "name": "10.139.1.127:53199 -> 172.17.0.3:5672",
    "reason": "Closed via management plugin"
}
response = requests.delete(url,
                           cookies=cookies,
                           headers=headers,
                           json=json_data,
                           verify=False, auth=HTTPBasicAuth(username, password))
print(response.status_code)

无法关闭

暂时只能使用管理页面的close关闭或consumer内channel.close方法关闭

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
PythonRabbitMQ的集成通常通过`pika`库来实现,这是一个Python客户端库,用于与RabbitMQ进行交互。以下是一个简单的使用示例: 首先,确保安装了`pika`库,可以通过pip安装: ```shell pip install pika ``` 然后,你可以创建一个生产者(Publisher)和一个消费者(Consumer)来发送和接收消息: **生产者(Producer):** ```python import pika def send_message(): connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() # 声明交换器(Exchange) channel.exchange_declare(exchange='direct_logs', exchange_type='direct') # 发送消息 routing_key = 'info' message = 'Hello World!' channel.basic_publish(exchange='direct_logs', routing_key=routing_key, body=message) print(f" [x] Sent {message} to {routing_key}") connection.close() send_message() ``` **消费者(Consumer):** ```python import pika def callback(ch, method, properties, body): print(" [x] Received %r" % body) def consume_messages(): connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() # 声明队列并自动绑定到交换器 channel.queue_declare(queue='hello') channel.queue_bind(exchange='direct_logs', queue='hello', routing_key='info') channel.basic_consume(queue='hello', on_message_callback=callback, auto_ack=True) print(' [*] Waiting for messages. To exit press CTRL+C') channel.start_consuming() consume_messages() ``` 在这个例子中,生产者向名为'direct_logs'的交换器发送消息,使用路由键'info'。消费者会从队列'hello'中接收这些消息。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jesse_Kyrie

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值