Activemq支持两种消息传送模式:PERSISTENT (持久消息)和 NON_PERSISTENT(非持久消息)
从字面意思就可以了解,这是两种正好相反的模式。
1、PERSISTENT 持久消息
是class="tags" href="/tags/ACTIVEMQ.html" title=activemq>activemq默认的传送方式,此方式下的消息在配合class="tags" href="/tags/ACTIVEMQ.html" title=activemq>activemq.xml中配置的消息class="tags" href="/tags/CunChu.html" title=存储>存储方式,会被class="tags" href="/tags/CunChu.html" title=存储>存储在特定的地方,直到有消费者将消息消费或者消息过期进入DLQ队列,消息生命周期才会结束。
此模式下可以保证消息只会被成功传送一次和成功使用一次,消息具有可靠性。在消息传递到目标消费者,在消费者没有成功应答前,消息不会丢失。所以很自然的,需要一个地方来持久性class="tags" href="/tags/CunChu.html" title=存储>存储。
如果消息消费者在进行消费过程发生失败,则消息会被再次投递。
2、NON_PERSISTENT 非持久消息
非持久的消息适用于不重要的,可以接受消息丢失的哪一类消息,这种消息只会被投递一次,消息不会在持久性class="tags" href="/tags/CunChu.html" title=存储>存储中class="tags" href="/tags/CunChu.html" title=存储>存储,也不会保证消息丢失后的重新投递。
在class="tags" href="/tags/SPRING.html" title=spring>spring提供的JmsTemplate中,同样提供了针对于当前功能的配置选项:
消息的签收模式:
客户端成功接收一条消息的标志是一条消息被签收,成功应答。
消息的签收情形分两种:
1、带事务的class="tags" href="/tags/SESSION.html" title=session>session
如果class="tags" href="/tags/SESSION.html" title=session>session带有事务,并且事务成功提交,则消息被自动签收。如果事务回滚,则消息会被再次传送。
2、不带事务的class="tags" href="/tags/SESSION.html" title=session>session
不带事务的class="tags" href="/tags/SESSION.html" title=session>session的签收方式,取决于class="tags" href="/tags/SESSION.html" title=session>session的配置。
Activemq支持一下三种模式:
Session.AUTO_ACKNOWLEDGE 消息自动签收
Session.CLIENT_ACKNOWLEDGE 客户端调用acknowledge方法手动签收
Session.DUPS_OK_ACKNOWLEDGE 不必必须签收,消息可能会重复发送。在第二次重新传递消息的时候,消息头的JmsDelivered会被置为true标示当前消息已经传送过一次,客户端需要进行消息的重复处理控制。
class="tags" href="/tags/SPRING.html" title=spring>spring提供的JmsTemplate中的配置方式: