新来个技术总监,把 RabbitMQ 讲得那叫一个透彻,佩服( 九 )


但是,我们不想丢失任何任务,如果有一个消费者挂掉了,那么我们应该将分发给它的任务交付给另一个消费者去处理 。
为了确保消息不会丢失,RabbitMQ支持消息应答 。消费者发送一个消息应答,告诉RabbitMQ这个消息已经接收并且处理完毕了 。RabbitMQ就可以删除它了 。
因此手动ACK的常见手段:
// 接收消息之后,主动ack/nak
Consumer consumer = new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
byte[] body) throws IOException {
String message = new String(body, "UTF-8");
try {
System.out.println(" [ " + queue + " ] Received '" + message);
channel.basicAck(envelope.getDeliveryTag(), false);
} catch (Exception e) {
channel.basicNack(envelope.getDeliveryTag(), false, true);
}
}
};
// 取消自动ack
channel.basicConsume(queue, false, consumer);




推荐阅读