我正在使用嵌入式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);
答案 0 :(得分:1)
在servlet中,对同一个servlet的所有请求都有1个实例。
在websocket服务器中,您有很长时间的连接,而通常的技术是每个连接都有一个新的websocket端点实例。在websocket客户端,您不必担心这一点。你只是一个实例开始。如果您想要多个连接,则您拥有自己创建的websocket端点的多个实例。
ServerContainer
是javax.websocket.server.ServerContainer
(又名JSR-356)。
它有2个addEndpoint()
机制:
addEndpoint(Class<?> endpointClass)
假设该课程从Endpoint
延伸或使用@ServerEndpoint
进行注释(是的,您可以让服务器通过注释扫描进行初始化,但仍然使用注释和这个addEndpoint机制以编程方式添加端点)。它假定服务器将在每个传入的websocket升级请求上实例化一个新的端点。
addEndpoint(ServerEndpointConfig serverConfig)
使用ServerEndpointConfig
声明您希望端点绑定的方式。它也假设服务器将在每个传入的websocket升级请求上实例化一个新的端点。但是,有使用这种技术的方法。定义您自己的Configurator
对象,该对象覆盖getEndpointInstance(Class<?> endpointClass)
方法,一遍又一遍地返回相同的对象。请注意,您返回的实例必须是传递给该方法的类类型(否则会出错)。
如果您选择使用jetty native websocket implementation,那么您还可以使用WebSocketCreator
来处理websocket实例的创建,甚至是单例。