轉載自:http://blog.csdn.net/quzishen/article/details/6131222
Activemq支持兩種消息傳送模式:PERSISTENT (持久消息)和 NON_PERSISTENT(非持久消息)
從字面意思就可以了解,這是兩種正好相反的模式。
1、PERSISTENT 持久消息
是activemq默認的傳送方式,此方式下的消息在配合activemq.xml中配置的消息存儲方式,會被存儲在特定的地方,直到有消費者將消息消費或者消息過期進入DLQ隊列,消息生命周期才會結束。
此模式下可以保證消息只會被成功傳送一次和成功使用一次,消息具有可靠性。在消息傳遞到目標消費者,在消費者沒有成功應答前,消息不會丟失。所以很自然的,需要一個地方來持久性存儲。
如果消息消費者在進行消費過程發生失敗,則消息會被再次投遞。
2、NON_PERSISTENT 非持久消息
非持久的消息適用於不重要的,可以接受消息丟失的哪一類消息,這種消息只會被投遞一次,消息不會在持久性存儲中存儲,也不會保證消息丟失后的重新投遞。
在spring提供的JmsTemplate中,同樣提供了針對於當前功能的配置選項:
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory" ref="cachingConnectionFactory"></property> <property name="defaultDestination" ref="dest" /> <property name="messageConverter" ref="messageConverter" /> <property name="pubSubDomain" value="false" /> <property name="explicitQosEnabled" value="true" /> <!-- deliveryMode, priority, timeToLive 的開關,要生效,必須配置為true,默認false--> <property name="deliveryMode" value="1" /> <!-- 發送模式 DeliveryMode.NON_PERSISTENT=1:非持久 ; DeliveryMode.PERSISTENT=2:持久--> </bean>
消息的簽收模式:
客戶端成功接收一條消息的標志是一條消息被簽收,成功應答。
消息的簽收情形分兩種:
1、帶事務的session
如果session帶有事務,並且事務成功提交,則消息被自動簽收。如果事務回滾,則消息會被再次傳送。
2、不帶事務的session
不帶事務的session的簽收方式,取決於session的配置。
Activemq支持一下三種模式:
Session.AUTO_ACKNOWLEDGE 消息自動簽收
Session.CLIENT_ACKNOWLEDGE 客戶端調用acknowledge方法手動簽收
Session.DUPS_OK_ACKNOWLEDGE 不必必須簽收,消息可能會重復發送。在第二次重新傳遞消息的時候,消息頭的JmsDelivered會被置為true標示當前消息已經傳送過一次,客戶端需要進行消息的重復處理控制。
spring提供的JmsTemplate中的配置方式:
<!-- PTP jms模板 --> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory" ref="cachingConnectionFactory"></property> <property name="defaultDestination" ref="dest" /> <property name="messageConverter" ref="messageConverter" /> <property name="pubSubDomain" value="false" /> <property name="sessionAcknowledgeMode" value="1" /> <!-- 消息應答方式 Session.AUTO_ACKNOWLEDGE 消息自動簽收 Session.CLIENT_ACKNOWLEDGE 客戶端調用acknowledge方法手動簽收 Session.DUPS_OK_ACKNOWLEDGE 不必必須簽收,消息可能會重復發送 --> </bean>