有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java多线程WebSocket

背景

我已经使用RPC协议实现了一个适配器接口,但最近我的任务是使用WebSocket侦听器实现该接口。有了RPC,我可以很容易地启动一个RPC侦听器线程来侦听另一个线程上的事件,但对于JSR356,我发现它并不是那么简单

问题是

我试图实现一个连接到订阅URI的JavaWebSocket客户端端点,但我想以一种利用多线程的方式来实现。我一直很难从客户端端点的角度找到需要多线程的例子。这可能吗

我需要WebSocket消息处理程序在不阻塞主线程的情况下处理消息。我还没有实现消息处理程序,因为我不知道如何创建它来实现我想要的。有人能帮我指出一个更好的方向吗?以下是我目前掌握的情况:

事件处理程序。爪哇

@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) 个答案