存在一个问题:当生产者将消息发送出去之后,如何去确认消息到底有没有到达服务器。
- 通过事务机制实现:
- 通过发送方确认(publisher confirm )机制实现。
这边先介绍事务机制。
- 相关的方法有三个: channel.txSelect;channel.txCommit和channel.txRollback
- 在发送消息前开启事务:channel.txSelect;
- 消息发送之后提交事务:channel.txCommit;
- 发生异常组要回滚:channel.txRollback
模型图:
- 客户端发送Tx.Select. 将信道置为事务模式;
- Broker 回复Tx. Select-Ok. 确认己将信道置为事务模式:
- 在发送完消息之后,客户端发送Tx.Commit 提交事务;
- Broker 回复Tx. Commi t-Ok. 确认事务提交
代码:
try {
channel.txSelect();
channel.basicPublish(EXCHANGE_NAME,ROUTING_KEY,false, properties, message.getBytes());
channel.txCommit();
} catch (Exception e) {
e.printStackTrace();
channel . txRollback();
}
事务回滚:当发生异常未能执行channel.txCommit();执行channel . txRollback();即可回滚
模型图:
try {
channel.txSelect();
channel.basicPublish(EXCHANGE_NAME,ROUTING_KEY,false, properties, message.getBytes());
int i = 1/0;
channel.txCommit();
} catch (Exception e) {
e.printStackTrace();
channel . txRollback();
}
1.发送多条消息时,只要用channel.txSelect();channel.txCommit();将发送消息包裹起来即可
2.只有消息成功被RabbitMQ 接收,事务才能提交成功,否则便可在捕获异常之后进行事务回滚,与此同时可以进行消息重发。
3.但是使用事务机制会"吸干" RabbitMQ所以RabbitMQ提供了一个改进方案,即发送方确认机制。