如何解决activeMQ数据提交不成功的问题

(1)问题分析

MQ作用:1)异步消息 2)应用解耦 3)流量削峰
JMS规范:两种消息模型 点对点 发布订阅
点对点:一个生产者生产的消息只能让一个消费者消费,消息一旦被消费后马上消失。
发布订阅:一个生产者生产的消息可以让多个消费者消费,消息被消费后消息不消失
此题考得是activemq的消息传递机制以及传递失败我们应该怎么处理
如果消息没有被成功消费?

(2)核心问题讲解

Activemq有两种通信方式,点到点形式和发布订阅模式。如果是点到点模式的话,如果消息发送不成功此消息默认会保存到activemq服务端直到有消费者将其消费,所以此时消息是不会丢失的。

如果是发布订阅模式的通信方式,默认情况下只通知一次,如果接收不到此消息就没有了。这种场景只适用于对消息送达率要求不高的情况。如果要求消息必须送达不可以丢失的话,需要配置持久订阅。每个订阅端定义一个id,在订阅是向activemq注册。发布消息和接收消息时需要配置发送模式为持久化。此时如果客户端接收不到消息,消息会持久化到服务端,直到客户端正常接收后为止

(3)问题拓展

事物4种应答模式
connection.createSession(true, Session.AUTO_ACKNOWLEDGE);

1)AUTO_ACKNOWLEDGE:自动确认,这就意味着消息的确认时机将有consumer择机确认."择机确认"似乎充满了不确定性,这也意味着,开发者必须明确知道"择机确认"的具体时机,否则将有可能导致消息的丢失,或者消息的重复接受
2)CLIENT_ACKNOWLEDGE :客户端手动确认,这就意味着AcitveMQ将不会“自作主张”的为你ACK任何消息,开发者需要自己择机确认。在此模式下,开发者需要需要关注几个方法:
1)message.acknowledge(),
2)ActiveMQMessageConsumer.acknowledege(),
3)ActiveMQSession.acknowledge();
其1)和3)是等效的,将当前session中所有consumer中尚未ACK的消息都一起确认,2)只会对当前consumer中那些尚未确认的消息进行确认。开发者可以在合适的时机必须调用一次上述方法。你认为消息很重要,只有当消息被正确处理之后才能确认时。
3)DUPS_OK_ACKNOWLEDGE:"消息可重复"确认,意思是此模式下,可能会出现重复消息,并不是一条消息需要发送多次ACK才行
4)INDIVIDUAL_ACKNOWLEDGE:单条消息确认,这种确认模式,我们很少使用,它的确认时机和CLIENT_ACKNOWLEDGE几乎一样,当消息消费成功之后,需要调用message.acknowledege来确认此消息(单条),而CLIENT_ACKNOWLEDGE模式先message.acknowledge()方法将导致整个session中所有消息被确认(批量确认)

(4)项目中的使用

项目中使用的是自动确认事务,确保数据不丢失的方案是自己写业务逻辑确保消息正常执行成功。

点击此处
隐藏目录