【发布时间】:2017-01-19 07:12:03
【问题描述】:
我正在编写一个与容器无关的 Websocket 服务器。我的开发环境使用带有嵌入式 Jetty 版本的 IntelliJ IDEA 9.3.11.v20160721(嵌入代码如下)。
然而,我的代码使用 Tomcat Websocket 库,tomcat-websocket-api 和 tomcat-websocket,版本 8.5.4。
我想用ServletContextListener 注册Websocket EndPoint。根据Tyrus project 的一些示例,以及关于SO 和Joakim Erdfelt (@joakim-erdfelt) 的Jetty 邮件列表中的一些答案,我编写了以下实现并通过listener 中的listener 添加它。
代码进入contextInitialized()方法,所以该部分似乎工作正常,但不幸的是ServletContext不包含属性javax.websocket.server.ServerContainer,因此它返回null。
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
final ServerContainer serverContainer = (ServerContainer) servletContextEvent
.getServletContext()
.getAttribute("javax.websocket.server.ServerContainer");
// *** serverContainer is null ***
try {
serverContainer.addEndpoint(ChatAnnotation.class);
}
catch (DeploymentException e) { e.printStackTrace(); }
}
唯一可用的属性是javax.servlet.context.tempdir、org.eclipse.jetty.util.DecoratedObjectFactory、org.eclipse.jetty.tlds、org.eclipse.jetty.resources、org.eclipse.jetty.server.Executor、org.eclipse.jetty.webFragments
我做错了什么?这严格来说是一个嵌入问题吗?它会在标准 Jetty 中正常运行(即未嵌入)吗?
嵌入代码如下:
WebAppContext webapp = new WebAppContext();
webapp.setContextPath("/");
webapp.setResourceBase(webroot);
webapp.setDescriptor(webroot + "/WEB-INF/web.xml");
Server server = new Server();
ServerConnector connector = new ServerConnector(server);
connector.setPort(8080);
server.setConnectors(new ServerConnector[] { connector });
server.setHandler(webapp);
server.start();
server.join();
【问题讨论】:
标签: servlets websocket jetty embedded-jetty java-websocket