📜  rabbitmq 删除消息 (1)

📅  最后修改于: 2023-12-03 14:46:53.617000             🧑  作者: Mango

RabbitMQ 删除消息

当我们使用 RabbitMQ 作为消息队列时,无论是发布者还是消费者,都会有删除消息的需求。本文将介绍如何使用 RabbitMQ 删除消息。

方法

RabbitMQ 允许我们使用以下两种方法删除消息:

1. 使用消费者确认机制

当消费者处理完消息后,可以向 RabbitMQ 服务器发送确认信息,告诉服务器该消息已被成功消费。在确认消息的同时,我们可以选择将其从队列中删除。

代码片段:

# 创建连接
connection = pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel = connection.channel()

# 订阅队列
channel.queue_declare(queue='hello')

# 回调函数,用于处理消息
def callback(ch, method, properties, body):
    print("Received %r" % body)
    ch.basic_ack(delivery_tag = method.delivery_tag)
    
# 消费消息
channel.basic_consume(queue='hello', on_message_callback=callback, auto_ack=False)

# 启动消费者
channel.start_consuming()

basic_ack 方法中,我们可以将 delivery_tag 参数设置为需要删除的消息的标记。

2. 使用 Management HTTP API

RabbitMQ 还提供了一组 HTTP API 用于管理服务器和应用程序。我们可以使用其中的删除消息 API 删除消息。

代码片段:

import requests

# 构造 API 地址
api = "http://localhost:15672/api/queues/%2F/myqueue/get"

# 构造请求头
auth = ('guest', 'guest')
headers = {'Content-Type': 'application/json'}

# 发送请求
response = requests.get(api, auth=auth, headers=headers)

# 获取消息标记
delivery_tag = response.json()[0]['delivery_tag']

# 删除消息
api = f"http://localhost:15672/api/queues/%2F/myqueue/ack/{delivery_tag}"
requests.post(api, auth=auth, headers=headers)

以上代码通过 GET 请求获取首条消息,并从响应中获取 delivery_tag。随后通过 POST 请求将该消息从队列中删除。

注意事项
  1. 删除消息只能在消费者那一端进行,无法在发布者那一端删除已发送的消息。
  2. 在使用消费者确认机制时,务必要记得手动确认消息,否则会导致消息一直在队列中积压。
  3. 在使用 Management HTTP API 时,需要提前开启 RabbitMQ 的 Web 站点管理插件。