JMS MQ,ActiveMQ,inforsuiteMQ解决消息丢失和重复消费问题

一、生产者数据丢失问题解决方案

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();
	//业务逻辑
	});

监听器可以解决突然中断导致消息丢失的问题,但如果处理过程中报错,则可能会丢失数据。

posted @ 2021-02-02 11:27  zhooke  阅读(108)  评论(0)    收藏  举报