1:消息持化化:防止消息丢失要首先要保证消息的持久化 。
2:生产者开启事务或者confirm模式
事务:
try {
channel.txSelect(); //开启事务
channel.basicPublish(EXCHANGE_NAME, DIRECT, MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());
channel.txCommit(); //提交事务
}catch (Exception e){
System.out.println("回滚事务处理你的发送失败逻辑");
channel.txRollback(); //回滚事务
}
confirm:
// 开启confirm 模式 单个模式
channel.confirmSelect();
channel.basicPublish(EXCHANGE_NAME, "debug", MessageProperties.PERSISTENT_TEXT_PLAIN, message.getBytes());
if (!channel.waitForConfirms()) {
System.out.println("发送消息失败 此处要处理发送消息失败后的逻辑.");
}
// 开启confirm 模式结束
3:消费者开启手动ack模式
// 创建队列消费者
final 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");
System.out.println("客户端收到消息'" + message + "'");
// 这里接受到消息手动ack
channel.basicAck(envelope.getDeliveryTag(), false);
}
};
boolean autoAck = false;
channel.basicConsume(queueName, autoAck, consumer);