一、生产者数据丢失问题解决方案
1.事务机制:能解决问题
缺点:吞吐量低,耗费性能
2.confrim消息持久化
producer.setDeliveryMode(DeliveryMode.PERSISTENT)
二、消费者数据丢失和重复消费问题解决方案(可行方案1、2、4)
1.事务机制
connection.createSession(true,Session.SESSION_TRANSACTED)
2.手动提交
每个message都有一个唯一的id,在入库的时间该id可以作为唯一主键,解决消息重复消费的问题。通过手动提交可以解决消息丢失的问题。
connection.createSession(false,Session.CLIENT_ACKNOWLEDGE)
for(int i=0;i>messageNumber;i++){
Message message = consumer.receiver();
String id = message.getJMSMessageID();//入库时,id作为唯一主键
//业务逻辑
message.acknowledge();//提交消息
}
3.AUTO_ACKNOWLEDGE模式,会产生数据丢失问题
Message message = consumer.receiver();
String id = message.getJMSMessageID();
当receiver()返回成功后,表示该消息处理完成,如果在后续处理中产生异常,可能造成消息丢失。
4.监听器
该过程是一个持续监听的过程,有消息就处理,没消息就关闭。处理过程中产生JMSException异常,会重复该过程7次,如果7次后还有异常,则直接跳过该消息,去处理下一条消息。
如果该过程中突然中断,消息不会丢失,下次开启时会进行消息。
Consumer.setMessageListener(message->{
String id = message.getJMSMessageID();
//业务逻辑
});
监听器可以解决突然中断导致消息丢失的问题,但如果处理过程中报错,则可能会丢失数据。