發送可靠性
業務場景:使用MQ實現分佈式事務
// 進入confirm模式, 每次發送消息,rabbtiqm處理之後會返回一個對應的回執消息
AMQP.Confirm.SelectOk selectOk = channel.confirmSelect();
channel.addConfirmListener(new ConfirmListener() {
@Override
public void handleAck(long deliveryTag, boolean multiple) throws IOException {
// deliveryTag 同一個channel中此條消息的編號 。
// 業務..
System.out.println("受理成功 " + queues.get((int) deliveryTag) + " " + multiple);
}
@Override
public void handleNack(long deliveryTag, boolean multiple) throws IOException {
// 失敗重發
// queues.get((int) deliveryTag)
System.out.println("受理失敗 " + deliveryTag);
}
});
消息消費可靠性
// 監聽隊列
Channel finalChannel = channel;
channel.basicConsume(queueName, false, "消費者-手動回執",
new DefaultConsumer(finalChannel) {
@Override
public void handleDelivery(String consumerTag,
Envelope envelope,
AMQP.BasicProperties properties,
byte[] body)
throws IOException {
try {
System.out.println("收到消息: " + new String(body));
// TODO 業務處理
long deliveryTag = envelope.getDeliveryTag();
// 模擬業務處理耗時
Thread.sleep(1000L);
// 正常消費
// finalChannel.basicAck(deliveryTag, false);
// 異常消費
finalChannel.basicNack(envelope.getDeliveryTag(), false, false);
} catch (InterruptedException e) {
// 異常消費, requeue參數 true重發,false不重發(丟棄或者移到DLQ死信隊列)
// finalChannel.basicNack(envelope.getDeliveryTag(), false, false);
e.printStackTrace();
}
}
});