我想寫一個方法來處理XMPP上的通信流。我想要做的事情的順序是:Servlets之間的通信
- 發送消息。
- 等待回覆。
- 處理響應。
既然我們能比30歲的響應(步驟2)我會發球了一個任務來照顧這等待更長的時間。此任務需要發送消息,然後等待處理傳入消息的XMPP servlet上的響應。我的問題是:如何在任務servlet線程中等待響應到達XMPP Servlet?
我通常會使用偵聽器模式,其中偵聽器將消息存儲在Task對象的某個字段中,然後觸發一個Semaphore來指示消息已到達。像這樣:
- 在靜態字段中將偵聽器安裝在XMPP servlet中。
- 發送信息。
- 等待信號量。 ........ 同時,在XMPP servlet線程中,響應將到達,它將調用監聽器的回調方法,該方法存儲消息並釋放信號量。
- 從現場和過程中獲取消息。
我試過了,它在開發服務器上工作正常。然而,當我上傳到雲中時,我發現我將監聽器安裝在XMPP servlet上(步驟1),但是當消息進入時,將會實例化一個新的servlet實例,並且不再有對監聽器來調用,通過監聽器的事件是一個靜態字段。我的結論是XMPPServlet運行在一個完全不同的VM中,這意味着靜態字段不會在該servlet和任務之間共享。它是否正確?
一般來說,這些servlet之間通信的最佳實踐是什麼?如何共享數據(通常我會將它存儲在對象的字段中)以及當事件發生時(通常我會使用信號量),如何從一個信號發送到另一個信號?
對不起,關於冗長的問題。告訴我,如果不清楚,我會稍微改進一下。
感謝您的回覆。當你說「處理程序應該匹配相應的請求(必要時存儲在數據存儲區中)」時,除數據存儲庫外還有其他方法嗎?瞭解人們是如何做到這一點的,以及最佳做法是什麼...... –
@MarkSilberbauer取決於你的信息是什麼,以及你需要什麼背景。您可以在請求中發送ID或其他信息,並在回覆中要求回傳。如果您需要帶外上下文,Datastore就是這樣。 –