我正在尝试在tomcat(7.0.50)上部署cometd(3.0.1)。以前,我在码头9.2.2上使用cometd(3.0.1)。
我可以看到cometd依赖于here提到的某些码头图书馆,但是这些依赖关系是什么?
我也在关注this帖子,并与“并发异步写入”混淆。
据说“ CometD 3已被修改,以避免并发异步写入,这是规范所允许的,但Tomcat拒绝了。”
这是否意味着与此“真实”相关的东西。我应该把它弄错吗?彗星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中工作,并且可以对两个容器中的模块错误进行模化。
Jetty库CometD所依赖的也是完全可移植的(仅仅是实用程序库)。确切的依赖性取决于所需的CometD功能。
最小设置是:jetty-util
jetty-util-ajax
但是,强烈建议您使用Maven之类的依赖工具,而不必手动满足项目的依赖。
CometD提供primer和tutorials来帮助您入门。
JSR 356 WebSocket标准提供了一种使用asynchronous APIs发送WebSocket消息的方法。
尽管JSR 356的Jetty实现允许并发使用这些API,但Tomcat实现却不允许。
由于在CometD中并发使用这些API是很常见的,因此事实证明CometD在Jetty中运行良好,但在Tomcat中却无法正常工作。
因此,由于JSR 356规范对于API的确切语义过于含糊,因此对CometD进行了修改,以避免在容器之间进行可移植性并发写入。
更新:有两种方法可以同时使用WebSocket API。
第一个是WebSocket实现负责并发性。诸如CometD之类的应用程序可以并发调用WebSocket API,并且内部实现具有synchronized
块,排队或采用任何其他解决方案来确保消息没有损坏。两个线程将能够同时调用WebSocket API,但是最终将对消息处理进行序列化,并依次发送消息。
第二个方法是在调用WebSocket API之前让应用程序(CometD)照顾并发性并应用synchronized
块或排队等。
Jetty实现了第一个解决方案,而Tomcat没有实现。
因此,CometD已被修改以实现第二个解决方案。
这意味着您可以并发使用CometD API(最终将最终调用WebSocket API),因为CometD适当地处理了并发性,以便可以跨Servlet容器及其WebSocket实现进行移植。
WebSocket异步写入与<async-supported>
中的web.xml
无关,您必须根据documentation中的说明启用该功能。
关于tomcat - Tomcat上的Cometd,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29675728/