我确信这是非常简单的事情,但我不记得遇到过它的文档,API和版本之间存在更多差异的库。 (虽然公平地说,我确信它们存在!)据我所看到的资源,我认为这非常接近“当前”,但我收到了一个错误(No AtmosphereHandler地图)请求/ path / to / service / point)并需要一些关于我接下来应该尝试的指导。
我可以重新发布详细版本,但简而言之......
1)web.xml有这个servlet条目(来自最新的?git chat示例):
<servlet>
<description>AtmosphereServlet</description>
<servlet-name>AtmosphereServlet</servlet-name>
<servlet-class>org.atmosphere.cpr.AtmosphereServlet</servlet-class>
<async-supported>true</async-supported>
<init-param>
<param-name>org.atmosphere.cpr.Broadcaster.supportOutOfOrderBroadcast</param-name>
<param-value>false</param-value>
</init-param>
<!--<init-param>-->
<!--<param-name>org.atmosphere.cpr.broadcasterClass</param-name>-->
<!--<param-value>org.atmosphere.util.SimpleBroadcaster</param-value>-->
<!--</init-param>-->
<load-on-startup>0</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>AtmosphereServlet</servlet-name>
<url-pattern>/path/to/service/point</url-pattern>
</servlet-mapping>
2)web-app具有此类定义(在Scala中):
@AtmosphereHandlerService(path = "/path/to/service/point")
class MyCustomAtmoHandler extends AtmosphereHandler with Logging with OtherStuff {
override def onRequest {...}
override def onStateChange {...}
override def destroy {...}
注意:我作为指南使用的文档不包含注释参数“path” - 我必须添加它才能使其编译。
编辑: 这是使用Jetty版本9.0.4.v20130625
答案 0 :(得分:1)
在回答我自己的问题时(如果其他一些游荡的鞋底发现自己处于同一位置),我必须做两件事才能解决问题:
1)删除AtmosphereHandlerService注释,或者至少删除“path”参数。 (可能可以使用其余参数来操作注释;不确定。)
2)将名为atmosphere.xml的文件添加到META-INF文件夹中,其中包含以下内容:
<atmosphere-handlers>
<atmosphere-handler support-session="false"
context-root="/websocket/path/to/processorA"
class-name="com.some.className">
</atmosphere-handler>
<atmosphere-handler support-session="true"
context-root="/websocket/optional/path/to/processorB"
class-name="com.some.other.className">
</atmosphere-handler>
</atmosphere-handlers>
所以...... web.xml(或servlet容器使用的任何部署文件/体系结构)为所有处理程序创建“整体”上下文路径,而特定路由使用atmosphere.xml标记绑定到每个单独的Handler。 (像“/ websocket / *”这样的东西应该允许路由到这两个假设的处理程序。
从技术角度来看,可能有更好的方法来陈述这个解决方案,但希望外行人的总结能指出你正确的方向。