2017-06-12 51 views
1

我正在閱讀JMS 2.0規範,並且提到(如下相關摘錄),如果客戶端嘗試修改Message對象,那麼JMS提供者可能會拋出異常。JMS 2.0規範 - JMS提供程序如何通過JMS客戶端檢測Message對象中的更改?

我的問題是JMS提供程序如何知道客戶端是否嘗試修改Message對象,因爲Message對象將通過線路傳輸,並且在JMS提供者端它不是同一個堆對象,所以即使客戶端修改了消息對象,JMS提供者無法檢測到更改。

我錯過了什麼嗎?

7.3.9。關於使用消息對象的限制

應用其中執行一個異步發送必須考慮 限制,即在消息對象被設計成通過控制的一個 邏輯線程在一個時間訪問,並且不支持併發的使用 。參見2.14節「多線程」。

發送方法 返回後,應用程序不能嘗試讀取頭, 屬性或Message對象的身體,直到 CompletionListener的onCompletion或onException的方法已經 調用。這是因爲在此期間JMS提供程序可能正在修改另一個線程中的消息 對象。如果應用程序試圖訪問或修改 Message對象發送方法返回之後並已調用 CompletionListener之前

JMS提供可能拋出 的JMSException。如果JMS提供程序不 引發異常,則行爲未定義。

回答

2

這段摘錄是指JMS客戶端實現作爲JMS提供程序,它告訴你,一旦使用異步API調用發送,您將不再控制消息,直到通知異步完成時成功或失敗的事件。

客戶端通常會在發送調用中使用一個內部「只讀」標記來標記該消息現在不會被客戶端代碼觸及並將只讀狀態重置爲讀/寫在發送呼叫以這種或那種方式完成之後。

1

本文是對您的提供者的JMS Message對象的實現的引用。從JMS消費者處收到此消息後,此消息通常會打開只讀標誌,還可以提高性能,在使用修改消息的方法時,將在執行「消息」時檢查該消息。例如TextMessage.setText()會拋出一個不可修改的異常

+0

謝謝你的時間來回答。 – pjj