Web Socket 客户端在 Tomcat 中不起作用
Posted
技术标签:
【中文标题】Web Socket 客户端在 Tomcat 中不起作用【英文标题】:Web Socket Client not working in Tomcat 【发布时间】:2015-11-03 09:13:30 【问题描述】:我正在尝试在 Tomcat 的上下文中运行 Web 套接字客户端。所以场景是,我在 Tomcat 上部署了一个 Websocket 服务器端点,作为 App-1 的一部分。 App-2,它也部署在Tomcat上(显然在不同的上下文根下),想要发送消息。
App-2 中的类工作正常,如果我将它作为一个独立的主方法运行。但是当它在tomcat的上下文中运行时,它会给出以下错误。 (我使用 Tyrus 1.9 作为 JSR-356 impl)
java.util.ServiceConfigurationError: javax.websocket.ContainerProvider: Provider org.apache.tomcat.websocket.WsContainerProvider not a subtype
at java.util.ServiceLoader.fail(ServiceLoader.java:239)
at java.util.ServiceLoader.access$300(ServiceLoader.java:185)
at java.util.ServiceLoader$LazyIterator.nextService(ServiceLoader.java:376)
at java.util.ServiceLoader$LazyIterator.next(ServiceLoader.java:404)
at java.util.ServiceLoader$1.next(ServiceLoader.java:480)
at javax.websocket.ContainerProvider.getWebSocketContainer(ContainerProvider.java:66)
在这一行抛出了上述异常:
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
任何有关如何解决此问题的建议都会非常有帮助。
【问题讨论】:
【参考方案1】:知道了。问题是,我包括 tyrus 独立客户端来导入客户端包。 我替换了下面的
<dependency>
<groupId>org.glassfish.tyrus.bundles</groupId>
<artifactId>tyrus-standalone-client</artifactId>
<version>1.9</version>
</dependency>
有了这个
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
</dependency>
它解决了这个问题。
【讨论】:
【参考方案2】:仅供参考:
在运行 tomcat 7 的 Debian 或 Ubuntu 配置中,Websocket jar 未与 Tomcat 的标准安装一起打包。 (见https://bugs.launchpad.net/ubuntu/+source/tomcat7/+bug/1326687)
因此为了解决这个问题:
-
不在您的 web 应用程序中包含 websocket jar,这应该来自 tomcat 本身,否则它将无法工作。在你的 webapp lib 文件夹中有一个重复的 jar 会阻止 tomcat 正常启动。
复制并链接java/tomcat安装文件夹中的2个websocket jar
cp javax.websocket-api-1.1.jar /usr/share/java/
ln -s ../../java/javax.websocket-api-1.1.jar /usr/share/tomcat7/lib/javax.websocket-api-1.1.jar
cp tomcat7-websocket.jar /usr/share/java/
ln -s ../../java/tomcat7-websocket.jar /usr/share/tomcat7/lib/tomcat7-websocket.jar
您可以在以下位置找到 jar 文件:
https://mvnrepository.com/artifact/javax.websocket/javax.websocket-api
https://mvnrepository.com/artifact/org.apache.tomcat/tomcat7-websocket
【讨论】:
【参考方案3】:当我从 Tomcat 7 切换到 Tomcat 8 时,此问题已解决。
我在通过服务器选项卡在 Eclipse 中运行 Web 应用程序时遇到了这个问题。我在 Tomcat 7 上运行,在下载 Tomcat 8 并运行它之后,这个问题就消失了。
【讨论】:
以上是关于Web Socket 客户端在 Tomcat 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
java中开启tomcat同时开启socket,并且socket只建立一次,一次建立,终生受用,因为socket客户端是固定的
UrlRewriteFilter 在 Tomcat 中不生效