[jms那點事兒] JMS 訊息傳送模式、訊息簽收以及spring jmsTemplate配置
Activemq支援兩種訊息傳送模式:PERSISTENT (持久訊息)和 NON_PERSISTENT(非持久訊息)
從字面意思就可以瞭解,這是兩種正好相反的模式。
1、PERSISTENT 持久訊息
是activemq預設的傳送方式,此方式下的訊息在配合activemq.xml中配置的訊息儲存方式,會被儲存在特定的地方,直到有消費者將訊息消費或者訊息過期進入DLQ佇列,訊息生命週期才會結束。
此模式下可以保證訊息只會被成功傳送一次和成功使用一次,訊息具有可靠性。在訊息傳遞到目標消費者,在消費者沒有成功應答前,訊息不會丟失。所以很自然的,需要一個地方來永續性儲存。
如果訊息消費者在進行消費過程發生失敗,則訊息會被再次投遞。
2、NON_PERSISTENT 非持久訊息
非持久的訊息適用於不重要的,可以接受訊息丟失的哪一類訊息,這種訊息只會被投遞一次,訊息不會在永續性儲存中儲存,也不會保證訊息丟失後的重新投遞。
在spring提供的JmsTemplate中,同樣提供了針對於當前功能的配置選項:
訊息的簽收模式:
客戶端成功接收一條訊息的標誌是一條訊息被簽收,成功應答。
訊息的簽收情形分兩種:
1、帶事務的session
如果session帶有事務,並且事務成功提交,則訊息被自動簽收。如果事務回滾,則訊息會被再次傳送。
2、不帶事務的session
不帶事務的session的簽收方式,取決於session的配置。
Activemq支援一下三種模式:
Session.AUTO_ACKNOWLEDGE 訊息自動簽收
Session.CLIENT_ACKNOWLEDGE 客戶端呼叫acknowledge方法手動簽收
Session.DUPS_OK_ACKNOWLEDGE 不必必須簽收,訊息可能會重複傳送。在第二次重新傳遞訊息的時候,訊息頭的JmsDelivered會被置為true標示當前訊息已經傳送過一次,客戶端需要進行訊息的重複處理控制。
spring提供的JmsTemplate中的配置方式: