我的 Websocket 需要永远连接
My Websocket takes forever to connect
更新
好像在org.glassfish.tyrus.core.BaseContainer构造函数里,这两行运行超级慢:
this.managedExecutorService = lookupManagedExecutorService();
this.managedScheduledExecutorService = lookupManagedScheduledExecutorService();
两种方法的注释中提到 Android 有什么关系,我是否使用了针对桌面的错误代码 Java?
我使用的代码与来源完全相同:
Tyrus Websocket Documentation: 1.1.2 Client Endpoint
连接需要大约 10 秒,特别是当我 运行 Eclipse 的调试器时在这一行:
ClientManager client = ClientManager.createClient();
会不会跟这个有关? Potentially similar Stack Overflow Question
我真的迷路了,我觉得我是一个罕见的异常者,尝试将 websockets 与 Java 客户端一起使用,而不是与带有 Javascript 的浏览器。
所以问题的原因是 InitialContext by Tyrus in order to re-use a (scheduled) executor service if one is available. Normally this fails fast if none is available (and this is logged as a debug-message, see further on), but in this case it failed only after trying to initialize a INITIAL_CONTEXT_FACTORY 的初始化无法工作。要覆盖此行为,请调用
System.setProperty(javax.naming.InitialContext.INITIAL_CONTEXT_FACTORY, "javax.naming.spi.InitialContextFactory")
在创建客户端之前。然后,初始 InitialContext 将尝试创建接口实例,但很快就会失败。
使用详细日志记录可能会更早地发现问题。 Tyrus 不会做很多(调试)日志记录,但在这种情况下,使用 jul over logback 的设置可能会显示潜在问题的早期迹象。作为一般规则:始终确保在 运行 出现奇怪问题时可以查看 trace/debug 日志记录。
至于源代码中的 Android 注释:这只是注意到与 "JDK8 compact2 profile" 不兼容的平台,并通过不导入 javax.naming.InitialContext
class 直接(因为显然它不存在于 compact2 配置文件中)而是使用反射(另请参见 TYRUS-242)。
如果您正在创建纯粹的 Java Websocket 客户端,请考虑使用 JDK 7 client。 JDK 7 客户端包 (org.glassfish.tyrus:tyrus-container-jdk-client:1.10) 比默认包 (org.glassfish.tyrus.bundles:tyrus-standalone-客户端:1.10).
当我开始将 websockets 与 Java 客户端一起使用时,我也觉得自己是个异类(我选择了 Jetty websocket client API implementation). I also started using Tomcat embedded more (for example basic-jsp-embed)。当结合这些技术时,您将获得一个强大的 ("full duplex") 网络解决方案(更类似于点对点而不是客户端-服务器)。希望它会流行起来。
需要记住的一个警告是,某些防火墙会在 30 分钟后(即使连接正在使用中)断开连接(看起来像 http 连接)。因此,为了稳定连接,请确保客户端定期发送 ping 消息以确保连接正常并创建新连接 within/every 30 分钟。
更新 好像在org.glassfish.tyrus.core.BaseContainer构造函数里,这两行运行超级慢:
this.managedExecutorService = lookupManagedExecutorService();
this.managedScheduledExecutorService = lookupManagedScheduledExecutorService();
两种方法的注释中提到 Android 有什么关系,我是否使用了针对桌面的错误代码 Java?
我使用的代码与来源完全相同:
Tyrus Websocket Documentation: 1.1.2 Client Endpoint
连接需要大约 10 秒,特别是当我 运行 Eclipse 的调试器时在这一行:
ClientManager client = ClientManager.createClient();
会不会跟这个有关? Potentially similar Stack Overflow Question
我真的迷路了,我觉得我是一个罕见的异常者,尝试将 websockets 与 Java 客户端一起使用,而不是与带有 Javascript 的浏览器。
所以问题的原因是 InitialContext by Tyrus in order to re-use a (scheduled) executor service if one is available. Normally this fails fast if none is available (and this is logged as a debug-message, see further on), but in this case it failed only after trying to initialize a INITIAL_CONTEXT_FACTORY 的初始化无法工作。要覆盖此行为,请调用 System.setProperty(javax.naming.InitialContext.INITIAL_CONTEXT_FACTORY, "javax.naming.spi.InitialContextFactory")
在创建客户端之前。然后,初始 InitialContext 将尝试创建接口实例,但很快就会失败。
使用详细日志记录可能会更早地发现问题。 Tyrus 不会做很多(调试)日志记录,但在这种情况下,使用 jul over logback 的设置可能会显示潜在问题的早期迹象。作为一般规则:始终确保在 运行 出现奇怪问题时可以查看 trace/debug 日志记录。
至于源代码中的 Android 注释:这只是注意到与 "JDK8 compact2 profile" 不兼容的平台,并通过不导入 javax.naming.InitialContext
class 直接(因为显然它不存在于 compact2 配置文件中)而是使用反射(另请参见 TYRUS-242)。
如果您正在创建纯粹的 Java Websocket 客户端,请考虑使用 JDK 7 client。 JDK 7 客户端包 (org.glassfish.tyrus:tyrus-container-jdk-client:1.10) 比默认包 (org.glassfish.tyrus.bundles:tyrus-standalone-客户端:1.10).
当我开始将 websockets 与 Java 客户端一起使用时,我也觉得自己是个异类(我选择了 Jetty websocket client API implementation). I also started using Tomcat embedded more (for example basic-jsp-embed)。当结合这些技术时,您将获得一个强大的 ("full duplex") 网络解决方案(更类似于点对点而不是客户端-服务器)。希望它会流行起来。
需要记住的一个警告是,某些防火墙会在 30 分钟后(即使连接正在使用中)断开连接(看起来像 http 连接)。因此,为了稳定连接,请确保客户端定期发送 ping 消息以确保连接正常并创建新连接 within/every 30 分钟。