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
    评论
当您使用 RabbitMQ 时,主线程通常用于连接 RabbitMQ 服务器和生产者的生产消息。如果您的主线程中包含消费者,则消费者接收消息时会阻塞主线程。为了避免这种情况,您可以在主线程中创建一个新的子线程来启动消费者。 以下是一个示例代码,其中在主线程中创建了一个子线程来运行消费者: ```python import threading import pika # 定义消费者函数 def consume(channel, method, properties, body): print("Received message:", body) # 创建连接和通道 connection = pika.BlockingConnection(pika.ConnectionParameters('localhost')) channel = connection.channel() # 声明队列 channel.queue_declare(queue='test_queue') # 在子线程中启动消费者 def start_consumer(): channel.basic_consume(queue='test_queue', on_message_callback=consume, auto_ack=True) channel.start_consuming() consumer_thread = threading.Thread(target=start_consumer) consumer_thread.start() # 在主线程中发送消息 channel.basic_publish(exchange='', routing_key='test_queue', body='Hello World!') # 等待子线程结束 consumer_thread.join() # 关闭连接 channel.close() connection.close() ``` 在上面的代码中,我们使用 `threading.Thread` 创建了一个新的子线程,并在其中启动了消费者。主线程发送消息后,会立即继续执行后续代码,而子线程则会在后台持续运行,等待消息到达。当子线程接收到消息时,会调用 `consume` 函数进行处理。 需要注意的是,在主线程中创建连接和通道,但在子线程中使用它们。这是因为 RabbitMQ 的连接和通道对象不是线程安全的,应该在单独的线程中使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Jesse_Kyrie

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

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

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

打赏作者

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

抵扣说明:

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

余额充值