2015-10-06 41 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

相关问题