public void listen1(String msg, Message message, Channel channel) throws Exception

参数名

类型

作用

msg

String

直接解析后的消息内容(如果使用的是 String 消息格式)

message

Message

Spring AMQP 封装的消息对象,包含完整的消息信息(如 headers, properties, body)

channel

Channel

RabbitMQ 的 底层通道对象,用于手动 ACK/NACK 消息

throws Exception

方法可能抛出异常,通常是处理消息时的错误

Message message(完整的消息对象)

  • Spring AMQP 封装的消息,包含:

    • message.getBody():获取消息体(字节数组)

    • message.getMessageProperties():获取消息的属性,如 messageId, headers, deliveryMode

  • 适用于 获取消息元数据,如:

String contentType = message.getMessageProperties().getContentType();

Channel channel(RabbitMQ 通道)

  • 手动 ACK/NACK 消息 时使用

  • @RabbitListener(ackMode = "MANUAL") 手动确认消息 时,需要用 channelACKNACK

  • 示例:

long deliveryTag = message.getMessageProperties().getDeliveryTag();
try {
    // 处理消息
    log.info("处理消息: {}", msg);
    // 手动ACK确认
    channel.basicAck(deliveryTag, false);
} catch (Exception e) {
    // 处理失败,NACK并重新入队
    channel.basicNack(deliveryTag, false, true);
}

deliveryTag 作用

在 RabbitMQ 中,每个消费者接收到的消息 都会附带一个 deliveryTag,这个 deliveryTag 由 RabbitMQ 为每个信道(channel)维护,用于唯一标识该信道上的消息。

作用:消费者处理完消息后,必须使用 deliveryTag 来告诉 RabbitMQ 该消息的状态:

  • 成功消费basicAck(deliveryTag, false) 确认(ACK)

  • 消费失败basicNack(deliveryTag, false, true) 拒绝(NACK)

  • 丢弃消息basicReject(deliveryTag, false)

image-4k1u.png

image-rgyy.png

image-ljlc.png

image-3m5s.png