我使用RPC协议实现了一个适配器接口,但最近我们的任务是使用WebSocket监听器实现接口。使用RPC,我可以轻松地启动一个RPC侦听器线程来监听单独线程上的事件,但是当涉及到JSR356时,我发现它并不那么简单。
我试图实现连接到订阅URI的Java WebSocket ClientEndpoint,但我希望以利用多线程的方式实现。从客户端端点的角度来看,我一直很难找到需要多线程的示例。这甚至可能吗?
我需要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();