多线程WebSockets

时间:2016-01-07 03:58:27

标签: java multithreading websocket

背景

我使用RPC协议实现了一个适配器接口,但最近我们的任务是使用WebSocket监听器实现接口。使用RPC,我可以轻松地启动一个RPC侦听器线程来监听单独线程上的事件,但是当涉及到JSR356时,我发现它并不那么简单。

问题

我试图实现连接到订阅URI的Java WebSocket ClientEndpoint,但我希望以利用多线程的方式实现。从客户端端点的角度来看,我一直很难找到需要多线程的示例。这甚至可能吗?

我需要WebSocket消息处理程序来处理消息而不阻塞主线程。我还没有实现消息处理程序,因为我不确定如何以实现我想要的方式创建消息处理程序。任何人都可以帮我指点一个更好的方向吗?这就是我到目前为止所拥有的:

EventHandler.java

@ClientEndpoint
public class EventHandler {

    private URI subscriptionURI;
    private Session clientSession;

    public EventHandler(URI subscriptionURI) throws URISyntaxException {
        this.subscriptionURI = subscriptionURI;
    }

    /**
     * Attempts to connect to the CADI WebSocket server.
     * @throws Exception
     */
    public void connect() throws Exception {

        // Grab the WebSocket container and attempt to connect to the subscription URI
        WebSocketContainer container =  ContainerProvider.getWebSocketContainer();
        container.connectToServer(this, subscriptionURI);

    }

    /**
     * Closes the CADI WebSocket client session.
     */
    public void close() {

        try {

            // Close the client session if it is open
            if(clientSession != null && clientSession.isOpen())
                clientSession.close();

        }
        catch(Exception e) {
            LogMaster.getErrorLogger().error("Could not close the WebSocket client session. It may have been closed already.", e);
        }

    }

    @OnOpen
    public void socketOpened(Session session) {
        this.clientSession = session;
    }

}

以下是我如何开始连接WebSocket的新线程。但是这有什么意义呢?在WebSocket上收到的后续消息是否会阻止主线程?

EventHandler eventHandler = new EventHandler(new URI("wss://localhost/Example"));
new Thread()
{
    @Override
    public void run() {
        try {
            eventHandler.connect();
        } 
        catch (Exception e) {
            LogMaster.getErrorLogger().error("Could not start EventHandler.", e);
        }
    }
}.start();

0 个答案:

没有答案