如何传递Web套接字处理程序实例而不是类

时间:2014-09-29 16:20:25

标签: websocket jetty

我正在使用嵌入式Jetty websockets,我在示例中看到的是将处理程序的Class传递给容器而不是实例。我想知道是否可以传递一个实例而不是一个类,以及它是如何工作的。

ServerContainer wscontainer = webSocketServerContainerInitializer.configureContext(context);

// Add WebSocket endpoint to javax.websocket layer
wscontainer.addEndpoint(EventSocket.class);

我希望能够做到

wscontainer.addEndpoint(new EventSocket());

当然不支持此方法。

我在客户端看到你可以提供一个处理程序实例

Session session = container.connectToServer(new ClientSocket(), uri);

我很好奇为什么api被设计为接受一个类而不是一个实例,这与servlet的工作方式不同。

更新

以下解决方案有效:

        // contains ServerEndpoint annotation and onMessage, onOpen etc
        final EventSocket eventSocket = new EventSocket();

        ServerEndpointConfig config = ServerEndpointConfig.Builder.create(eventSocket.getClass(), eventSocket.getClass().getAnnotation(ServerEndpoint.class).value())
                        .configurator(new Configurator() {
                            @Override
                            public <T> T getEndpointInstance(Class<T> endpointClass) throws InstantiationException {
                                return (T) eventSocket;
                            }                                 
                        })
                        .build();
        wscontainer.addEndpoint(config);

1 个答案:

答案 0 :(得分:1)

在servlet中,对同一个servlet的所有请求都有1个实例。

在websocket服务器中,您有很长时间的连接,而通常的技术是每个连接都有一个新的websocket端点实例。在websocket客户端,您不必担心这一点。你只是一个实例开始。如果您想要多个连接,则您拥有自己创建的websocket端点的多个实例。

ServerContainerjavax.websocket.server.ServerContainer(又名JSR-356)。

它有2个addEndpoint()机制:

如果您选择使用jetty native websocket implementation,那么您还可以使用WebSocketCreator来处理websocket实例的创建,甚至是单例。