爲什麼在JMS中的Session接口上定義了createMessage,createTextMessage等方法?我可以理解爲什麼當你發送或接收到一條消息時,你需要這個會話,但不知道爲什麼你要創建你要從它發送的消息。爲什麼當JMS的設計人員爲它創建接口時,他們是否決定從會話中創建消息,而不是僅僅創建新消息?爲什麼JMS中的Session接口上的createMessage方法?
回答
(大API設計的問題。)
您在概念上混淆了 「JMS消息」 與您的郵件內容。
是的。通過會話來解決消息生命週期似乎有點混亂。但是,如果您考慮斷開連接的節點的情況,那麼設計決定並不奇怪。
要點是要注意「爲什麼客戶想要創建消息,如果沒有連接?」同時考慮問題「如果從JMS元數據中剝離」消息「是什麼」? (消息元數據示例:消息順序。)
所以,基本上,應該清楚的是,減去元數據(它非常適合會話和提供者)你的'用戶內容'真的沒有什麼關係與JMS。換句話說,在概念上你有元組:
{ [meta-data] : [user-content] }
所以一個「消息」真的是上面的元組。 user-content
實際上只是您的數據。也就是說,如果你提供了一個通用的(非綁定/斷開的)接口來一般地「創建消息」,所有獲得的是'一般''消息'(它實際上只是包裝你的內容)的(不必要的)創建,並缺乏使其成爲適當的「JMS消息」的所有必要'元數據'。在某個時刻,該通用帶外消息需要被「轉換」爲適當的JMS消息,例如,添加了訂購元數據,添加了時間戳等。
您從擁有這些「通用」「JMS」消息中獲得了什麼? (沒有,看起來。)
事實上,從會話中創建消息在概念上更清晰且更有效實施。
TextMessage和其他消息有標準接口,但不是標準實現。這意味着你有多個JMS提供者,你將爲這些類有不同的實現。
這或多或少是一個構造消息。這允許實現決定消息的構造方式,它可能需要來自當前會話的大量信息,並允許預先填充信息,並且實現如何實現。正如文檔所說:
「每個JMS提供程序都提供一組消息工廠及其用於創建消息實例的Session對象,這允許提供者使用針對其特定需求定製的消息實現。
每個JMS提供程序都有其自己的特定實現,消息屬性等由消息工廠初始化。所以,無論如何你都需要某種消息工廠。
他們可能會將工廠方法放在Connection而不是Session上,但他們認爲同一個實體(在我們的例子中是會話)將負責創建和發送消息。
我認爲這些是主要原因。
- 1. 爲什麼我無法使用PHP中的Session上傳文件?
- 2. 爲什麼在Java Stream接口中重載()的varargs方法?
- 3. 爲什麼要在每個接口方法上聲明org.apache.thrift.TException?
- 4. 爲什麼實現Serializable接口的類實現none接口的方法?
- 5. 靜態方法不能實現接口方法,爲什麼?
- 6. 爲什麼可以調用Java的接口方法的方法? [可比]
- 7. 爲什麼我們可以調用接口org.w3c.dom.Document的方法?
- 8. 爲什麼HashSet不會構建Set接口的所有方法
- 9. C++ 11已實現的接口方法不可用。爲什麼?
- 10. 爲什麼不能公開一個實現的接口方法?
- 11. 爲什麼Object類方法在接口中可用?
- 12. 什麼是MySQL中的SESSION?
- 13. 我的@implementation中有@接口 - 爲什麼?
- 14. 爲什麼Typescript中的抽象類實現和接口必須實現接口中的所有方法
- 15. Java Queue接口中的方法有什麼區別?
- 16. 什麼要放在接口方法的throws子句中?
- 17. 在子接口中覆蓋接口的方法/方法背後的原因是什麼?
- 18. 爲什麼有些接口方法被另一個接口覆蓋?
- 19. 爲什麼COM接口爲相同的調用方法返回不同的值?
- 20. 爲什麼不JMS MessageProducer方法setTimeToLive或send()工作?
- 21. 當使用MarshalAs時,接口方法的語法是什麼
- 22. 無法找到名爲prepare的org.apache.ibatis.executor.statement.StatementHandler接口上的方法
- 23. 接口中的方法數
- 24. 爲什麼我的接口類型對象不會執行未在接口中聲明的方法?
- 25. 擴展接口的方法爲什麼在實現擴展接口的類中不可見?
- 26. 爲什麼接口方法在實現接口的類中不能是靜態的?
- 27. 爲什麼Java接口有方法實現?
- 28. 爲什麼接口不能有靜態成員方法
- 29. 爲什麼java接口不能包含靜態方法實現?
- 30. 爲什麼我們必須命名接口方法參數?
對不起,我的問題可能不是很清楚,因爲這不是我想要問的。我爲這個問題添加了一些更多的嘗試,使其更加清晰。 – Chris
因爲你不知道它們是什麼,所以你不能只是「新增」這些類。只有圖書館知道這一點。 –