2015-10-06 44 views
0

我使用websocket客戶端的python和java實現。但是,由於onMessage是異步的,即使正在執行另一個函數,它也會立即開始執行。我如何確保在處理下一條消息之前每個onMessage函數將完全完成。謝謝!Websocket onMessage Lock

編輯: 我訂閱了多個頻道,無論哪個頻道發送消息,我的onMessage處理程序將處理該消息。我需要我的onMessage處理程序在它開始處理下一條消息之前全面處理它收到的每條消息,但我不能丟失任何消息。我希望這有助於澄清一點。

+0

.websocket','session.getBasicRemote()。sendText(message,isLast);'按照[link](https://tyrus.java.net/documentation/1.12/index/lifecycle.html# d0e1022)和[this](https://blogs.oracle.com/PavelBucek/entry/is_websocket_session_really_thread) – kakajan

+0

發送消息不是問題,它正在接收我需要同步的消息。所以如果我連續得到2條消息,在消息2開始處理之前需要完全處理消息1,如果這有意義的話 – holtc

回答

0

這聽起來只是一個併發問題。這個怎麼樣?

private final Object onMessageLock = new Object(); 

@OnMessage 
public void onMessage(String message, Session session) 
{ 
    synchronized (onMessageLock) 
    { 
     // Handle the message here. 
    } 
} 
+0

是的,絕對是一個併發問題。我會失去在鎖期間收到的任何消息嗎? – holtc

+0

您不會丟失任何消息。在處理消息時到達的其他消息將等待同步塊完成。同步塊完成後,其中一條等待消息將獲取同步塊,其他等待消息將再次等待同步塊完成。 –

+0

真棒,謝謝!我會試一試,讓你知道它是否有效。 – holtc

0

我測試了Takahiko提出的解決方案。它只能基於一個客戶端運行。來自不同客戶端的消息仍然會並行處理。

如果你想之前已經完全處理的消息後(無論發送郵件的客戶端),你必須做出鎖定對象的靜態待處理的所有消息:如果你正在使用`的javax

private static final Object onMessageLock = new Object(); 
+0

會試試這個,謝謝! – holtc

相關問題