在純技術層面上,這可能是一個好點開始:http://java.sun.com/products/jms/tutorial/
你也絕對應該拿到書的副本,「企業集成模式」這解釋了所有可以使用的排隊系統中的各種方式。
從你的描述,我設想了以下模式是有用的(對不起,不知道在書中所使用的術語,因爲我沒有它現在製作了我自己。):
發佈訂閱:服務器將發佈消息(例如更新價格信息),該消息被傳遞給訂閱該類信息的所有客戶端。您需要覆蓋的一個重要案例是,在您的客戶端在此類廣播期間斷開連接時,會發生什麼情況。你必須確保它不會錯過任何信息,或有辦法再次趕上。
失火和遺忘:一個通信夥伴(例如客戶端)會發送一條消息,而不會期待任何形式的響應。排隊系統將負責最終交付。這可以用於提交訂單等。
回電:這就像兩個或更多的火災和忘記消息在相反的方向。隨後的呼叫將有一個ID,以便將該消息標記爲對之前收到的特定消息的響應。提交訂單時這很有用,但需要某種答案。當然,答案可能會在一天後到達,因此您需要一份未完成訂單列表,這些列表可能應該對用戶可見,或者列表支持個人。發送多個回覆時,您必須處理不按順序到達的郵件的情況。如果可能,處理這個問題的好方法是在每條消息中包含早期消息的所有信息。這樣你可以簡單地丟棄舊信息。
所以通信會像這樣工作: - 服務器偶爾更新發送到所有客戶端。消息可能應該包含某種版本信息,因此客戶端可以確保它們具有所有消息。 - 定期(或aftger從服務器接收一段時間沒有更新或...)客戶端請求來自服務器的特殊更新,以確保它具有所有當前信息。上面提到的版本信息可用於識別缺失的信息 - 客戶端收到消息並將內容存儲在本地數據庫中 - 客戶端從數據庫中讀取信息以向用戶提供信息 - 客戶端提交訂單或任何時間服務器,可能接收不同步的回答
一些普遍性的建議:
隨着排隊你在地獄併發的中間。所以,對所有可能出現「錯誤」的東西進行創意。例子是 - 郵件到達不按順序 - 發送時接收器不可用(這也是首先使用郵件的原因) - 接收器不可用並且不會返回在線狀態。消息傳遞服務器有保證傳遞的選項。這意味着他們必須存儲消息直到實際發送消息。如果客戶永遠不會回到在線狀態,則郵件將永遠保留,填滿存儲空間
確保所有郵件處理與應用程序的其餘部分完全分離,以便於測試。
思考升級服務器和客戶端的過程,特別是當消息格式發生變化時。您或者必須在相同的時間點升級所有時間,或者您的服務器必須能夠處理一段時間的新舊消息格式。
我不擅長這個來制定答案。您可能想看看「企業集成模式」(Hohpe,Woolf,Addison-Wesley)。然而,這個要求聽起來很可怕:「即使網絡連接或服務器出現故障,客戶端也應該能夠工作,但只需幾天左右」,「服務器用於分發[...]爲客戶提供價格。「你能保證價格不會改變,即你知道價格預先變化的日期嗎? 「 – mnemosyn 2010-04-06 15:51:09
」我的想法是,應用程序從數據庫中讀取數據,但寫入消息代理,消息代理寫入數據庫並與服務器通信。或者這是一個壞主意?...「 這不是一個壞主意的想法,但你至少應該決定你期望使用哪個消息代理。有些人可能有預製件與數據庫直接對話,否則你也應該在另一邊編碼... – 2010-04-06 16:04:17
@mnemosyn:不,價格變化時沒有日期。價格可以改變,你也可以改變客戶的價格。但是,直到連接重新啓動後,纔會將其分發給其他客戶端。 – Jonas 2010-04-06 16:19:53