1. 程式人生 > >[jms那點事兒] JMS 訊息傳送模式、訊息簽收以及spring jmsTemplate配置

[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中的配置方式: