0

更新 似乎在构造函数中的 org.glassfish.tyrus.core.BaseContainer 中,这两行运行速度非常慢:

this.managedExecutorService = lookupManagedExecutorService();
this.managedScheduledExecutorService = lookupManagedScheduledExecutorService();

在这两种方法的评论中提到 Android 是怎么回事,我是否使用了针对桌面的错误 Java 代码?


我使用的代码与来自:

Tyrus Websocket 文档:1.1.2 客户端端点

不知何故,连接大约需要 10 秒,特别是在我运行 Eclipse 的调试器时的这一行:

ClientManager client = ClientManager.createClient();

会不会和这个有关?可能相似的堆栈溢出问题

我真的迷路了,我觉得我是一个罕见的异常值,试图将 websockets 与 Java 客户端一起使用,而不是使用 Javascript 的浏览器。

4

1 回答 1

1

所以问题的原因是 Tyrus 对InitialContext的初始化,以便在可用的情况下重新使用(预定的)执行器服务。通常,如果没有可用的,这会很快失败(并且这被记录为调试消息,请参见下文),但在这种情况下,它仅在尝试初始化无法工作的INITIAL_CONTEXT_FACTORY后才会失败。要覆盖此行为,请
System.setProperty(javax.naming.InitialContext.INITIAL_CONTEXT_FACTORY, "javax.naming.spi.InitialContextFactory")
在创建客户端之前调用。然后初始 InitialContext 将尝试创建接口的实例,这很快就会失败。

使用详细日志记录可能会更早发现问题。Tyrus 不会做很多(调试)日志记录,但在这种情况下,使用jul over logback的设置可能会显示出潜在问题的早期迹象。作为一般规则:始终确保在遇到奇怪问题时可以查看跟踪/调试日志记录。

至于源代码中的Android评论:这只是注意到与“JDK8 compact2配置文件”不兼容的平台,并且通过不javax.naming.InitialContext直接导入类来解决(因为它显然不存在于compact2配置文件中)但是改用反射(另见TYRUS-242)。

如果您要创建纯 Java Websocket 客户端,请考虑使用JDK 7 客户端。JDK 7 客户端包 (org.glassfish.tyrus:tyrus-container-jdk-client:1.10) 比默认的 (org.glassfish.tyrus.bundles:tyrus-standalone-client:1.10) 要小得多。

当我开始使用带有 Java 客户端的 websockets(我选择Jetty websocket 客户端 API实现)时,我也觉得自己是个异类。我也开始使用更多嵌入的 Tomcat(例如basic-jsp-embed)。当结合这些技术时,您将获得一个强大的(“全双工”)网络解决方案(更类似于对等而不是客户端-服务器)。希望它会流行起来。
需要记住的一个警告是,一些防火墙会在 30 分钟后断开连接(看起来像 http 连接)(即使连接正在使用中)。因此,为了获得稳定的连接,请确保客户端定期发送 ping 消息以确保连接健康,并在/每 30 分钟内创建一个新连接。

于 2015-05-28T17:25:32.650 回答