2011-12-12 41 views
1

爲什麼在JMS中的Session接口上定義了createMessage,createTextMessage等方法?我可以理解爲什麼當你發送或接收到一條消息時,你需要這個會話,但不知道爲什麼你要創建你要從它發送的消息。爲什麼當JMS的設計人員爲它創建接口時,他們是否決定從會話中創建消息,而不是僅僅創建新消息?爲什麼JMS中的Session接口上的createMessage方法?

回答

1

(大API設計的問題。)

您在概念上混淆了 「JMS消息」 與您的郵件內容。

是的。通過會話來解決消息生命週期似乎有點混亂。但是,如果您考慮斷開連接的節點的情況,那麼設計決定並不奇怪。

要點是要注意「爲什麼客戶想要創建消息,如果沒有連接?」同時考慮問題「如果從JMS元數據中剝離」消息「是什麼」? (消息元數據示例:消息順序。)

所以,基本上,應該清楚的是,減去元數據(它非常適合會話和提供者)你的'用戶內容'真的沒有什麼關係與JMS。換句話說,在概念上你有元組:

{ [meta-data] : [user-content] } 

所以一個「消息」真的是上面的元組。 user-content實際上只是您的數據。也就是說,如果你提供了一個通用的(非綁定/斷開的)接口來一般地「創建消息」,所有獲得的是'一般''消息'(它實際上只是包裝你的內容)的(不必要的)創建,並缺乏使其成爲適當的「JMS消息」的所有必要'元數據'。在某個時刻,該通用帶外消息需要被「轉換」爲適當的JMS消息,例如,添加了訂購元數據,添加了時間戳等。

您從擁有這些「通用」「JMS」消息中獲得了什麼? (沒有,看起來。)

事實上,從會話中創建消息在概念上更清晰且更有效實施。

0

TextMessage和其他消息有標準接口,但不是標準實現。這意味着你有多個JMS提供者,你將爲這些類有不同的實現。

+0

對不起,我的問題可能不是很清楚,因爲這不是我想要問的。我爲這個問題添加了一些更多的嘗試,使其更加清晰。 – Chris

+0

因爲你不知道它們是什麼,所以你不能只是「新增」這些類。只有圖書館知道這一點。 –

0

這或多或少是一個​​構造消息。這允許實現決定消息的構造方式,它可能需要來自當前會話的大量信息,並允許預先填充信息,並且實現如何實現。正如文檔所說:

「每個JMS提供程序都提供一組消息工廠及其用於創建消息實例的Session對象,這允許提供者使用針對其特定需求定製的消息實現。

0

每個JMS提供程序都有其自己的特定實現,消息屬性等由消息工廠初始化。所以,無論如何你都需要某種消息工廠。

他們可能會將工廠方法放在Connection而不是Session上,但他們認爲同一個實體(在我們的例子中是會話)將負責創建和發送消息。

我認爲這些是主要原因。

相關問題