我正在尝试在tomcat(7.0.50)上部署cometd(3.0.1)。以前我在使用jettd(3.0.1)和jetty 9.2.2。
我可以看到cometd依赖于某些jetty库,如here所述,但这些依赖是什么?
此外,我正在关注this帖子,并且与#34;并发异步写入"混淆了。
据说" CometD 3已被修改以避免并发异步写入,这是规范允许的,但Tomcat拒绝。"
这是否意味着与此相关的事情" 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
答案 0 :(得分:1)
CometD 3可以在Servlet容器中完全移植,因此它可以在Tomcat和Jetty中工作,在任何一个容器中都可以模块化。
CometD依赖的Jetty库也是完全可移植的(只是实用程序库)。确切的依赖关系取决于你想要的CometD的哪些特性。 最小集合是:
jetty-util
jetty-util-ajax
但是,强烈建议您使用像Maven这样的依赖项工具,忘记手动满足项目的依赖项。
CometD提供了primer和tutorials来帮助您入门。
JSR 356 WebSocket标准提供了一种使用asynchronous APIs发送WebSocket消息的方法。
虽然JSR 356的Jetty实现允许并发使用这些API,但Tomcat实现却不允许。 由于这些API的并发使用在CometD中很常见,因此可以看出CometD在Jetty中运行良好,但在Tomcat中运行不正常。 因此,为了跨容器的可移植性,修改了CometD以避免并发写入,因为JSR 356规范对API的确切语义过于模糊。
更新:有两种方法可以处理WebSocket API的并发使用。
首先,WebSocket实现负责并发;像CometD这样的应用程序可以同时调用WebSocket API,并且内部实现具有synchronized
块,或排队或其他任何适用的解决方案以确保消息不被破坏。两个线程将能够同时调用WebSocket API,但最终消息处理将被序列化并且消息一个接一个地发送。
第二个是让应用程序(CometD)处理并发并在调用WebSocket API之前应用synchronized
块或排队等。
Jetty实施了第一个解决方案,Tomcat没有。 因此,CometD已经过修改以实现第二种解决方案。
这意味着您可以同时使用CometD API(最终将最终调用WebSocket API),因为CometD可以正确处理并发性,以便可以跨Servlet容器及其WebSocket实现进行移植
WebSocket异步写入与<async-supported>
中的web.xml
无关,您必须已启用{{1}}中的{{1}}。