2011-10-05 30 views
0

我想寫一個方法來處理XMPP上的通信流。我想要做的事情的順序是:Servlets之間的通信

  1. 發送消息。
  2. 等待回覆。
  3. 處理響應。

既然我們能比30歲的響應(步驟2)我會發球了一個任務來照顧這等待更長的時間。此任務需要發送消息,然後等待處理傳入消息的XMPP servlet上的響應。我的問題是:如何在任務servlet線程中等待響應到達XMPP Servlet?

我通常會使用偵聽器模式,其中偵聽器將消息存儲在Task對象的某個字段中,然後觸發一個Semaphore來指示消息已到達。像這樣:

  1. 在靜態字段中將偵聽器安裝在XMPP servlet中。
  2. 發送信息。
  3. 等待信號量。 ........ 同時,在XMPP servlet線程中,響應將到達,它將調用監聽器的回調方法,該方法存儲消息並釋放信號量。
  4. 從現場和過程中獲取消息。

我試過了,它在開發服務器上工作正常。然而,當我上傳到雲中時,我發現我將監聽器安裝在XMPP servlet上(步驟1),但是當消息進入時,將會實例化一個新的servlet實例,並且不再有對監聽器來調用,通過監聽器的事件是一個靜態字段。我的結論是XMPPServlet運行在一個完全不同的VM中,這意味着靜態字段不會在該servlet和任務之間共享。它是否正確?

一般來說,這些servlet之間通信的最佳實踐是什麼?如何共享數據(通常我會將它存儲在對象的字段中)以及當事件發生時(通常我會使用信號量),如何從一個信號發送到另一個信號?

對不起,關於冗長的問題。告訴我,如果不清楚,我會稍微改進一下。

回答

2

轉貼我的回答對你問的郵件列表上的同一個問題:

你不能[等待在發送過程中響應。相反,您應使用異步模式:發送消息,併爲傳入的XMPP消息註冊一個 處理程序。該處理程序應匹配 對相應請求的響應(存儲在數據存儲中,如果需要 )並對其執行適當的處​​理。

App Engine應用程序可以在任意數量的機器上運行; 爲線程 之間的通信而設計的同步原語將不起作用。

+0

感謝您的回覆。當你說「處理程序應該匹配相應的請求(必要時存儲在數據存儲區中)」時,除數據存儲庫外還有其他方法嗎?瞭解人們是如何做到這一點的,以及最佳做法是什麼...... –

+0

@MarkSilberbauer取決於你的信息是什麼,以及你需要什麼背景。您可以在請求中發送ID或其他信息,並在回覆中要求回傳。如果您需要帶外上下文,Datastore就是這樣。 –