Cometd Tomcat

Cometd on Tomcat

我正在尝试在 tomcat (7.0.50) 上部署 cometd (3.0.1)。以前我使用 cometd (3.0.1) 和 jetty 9.2.2.

我可以看到 cometd 依赖于提到的一些码头库 here,但是这些依赖项是什么?

我也关注了 this post,并与 "concurrent async writes" 混淆了。

据说"CometD 3 has been modified to avoid concurrent async writes, which are allowed by the specification but that Tomcat rejects."

是不是和这个有关系"true"。我应该把它弄错吗? Cometd FAQ's

有人可以帮忙吗?

谢谢

编辑
对于码头,我正在使用以下罐子。如果我正在使用 tomcat.

,我可以删除其中的哪一个
jetty-client.jar,
jetty-continuation.jar,
jetty-http.jar,
jetty-io.jar,
jetty-jmx.jar,
jetty-security.jar,
jetty-servlet.jar,
jetty-servlets.jar,
jetty-server.jar,
jetty-util.jar,
jetty-util-ajax.jar,
jetty-webapp.jar,
jetty-deploy.jar,
jetty-xml.jar,
jetty-annotations.jar

CometD 3 可以跨 Servlet 容器完全移植,因此它可以在 Tomcat 和 Jetty 中工作,在任一容器中都存在 modulo 错误。

CometD 所依赖的 Jetty 库也是完全可移植的(只是实用程序库)。确切的依赖关系取决于您想要 CometD 的什么功能。 最小集合是:

  • jetty-util
  • jetty-util-ajax

但是,强烈建议您使用像 Maven 这样的依赖工具,而不必手动满足项目的依赖关系。

CometD 提供 primer and tutorials 让您入门。

JSR 356 WebSocket 标准提供了一种使用 asynchronous APIs.

发送 WebSocket 消息的方法

虽然 JSR 356 的 Jetty 实现允许并发使用那些 API,但 Tomcat 实现不允许。 由于并发使用那些 APIs 在 CometD 中很常见,事实证明 CometD 在 Jetty 中工作正常,但在 Tomcat 中却不行。 因此,为了跨容器的可移植性,CometD 被修改以避免并发写入,因为 JSR 356 规范对 API 的确切语义过于模糊。

更新:有两种方法可以处理 WebSocket API 的并发使用。

首先是 WebSocket 实现负责并发;像 CometD 这样的应用程序可以同时调用 WebSocket APIs,并且在内部实现有 synchronized 块,或排队或任何其他适用的解决方案,以确保消息不被破坏。两个线程将能够并发调用 WebSocket APIs,但最终消息处理将被序列化,消息一个接一个地发送。

第二种是让应用程序 (CometD) 处理并发并应用 synchronized 块或排队等 调用 WebSocket APIs.

Jetty 实施了第一个解决方案,Tomcat 没有。 因此,CometD 已被修改以实现第二种解决方案。

这意味着您可以并发使用 CometD API(最终将调用 WebSocket APIs)而不必担心,因为 CometD 妥善处理了并发性,在为了跨 Servlet 容器及其 ​​WebSocket 实现可移植。

WebSocket 异步写入与 web.xml 中的 <async-supported> 无关,您必须按照 documentation.

中指定的方式启用它