我的Websocket永远需要连接

时间:2015-05-22 22:30:04

标签: java websocket glassfish ipv6 tyrus

更新 看来在构造函数中的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

我真的迷失了,我觉得我是一个罕见的异常值,尝试使用带有Java客户端的websockets而不是带有Javascript的浏览器。

1 个答案:

答案 0 :(得分:1)

因此,麻烦的原因是Tyrus初始化InitialContext以便重新使用(预定的)执行服务(如果有的话)。通常,如果没有可用的话,这会快速失败(并将其记录为调试消息,请参阅下文),但在这种情况下,只有在尝试初始化无效的INITIAL_CONTEXT_FACTORY后才会失败。要覆盖此行为,请拨打DF <- structure(list(cand_nm = c("Obama Barack", "Obama Barack", "Obama Barack", "Obama Barack", "Obama Barack", "Obama Barack", "Obama Barack" ), party_id = c("D", "D", "D", "D", "D", "D", "D"), contbr_nm = c("AARONSON PAUL", "AARONSON PAUL", "AARONSON PAUL", "AARONSON PAUL", "AARONSON PAUL", "AARONSON PAUL", "AARONSON PAUL"), contb_receipt_amt = c(250L, 100L, 500L, 500L, 500L, 281L, 219L), election_tp = c("P2008", "G2008", "G2008", "G2008", "G2012", "G2012", "G2012")), .Names = c("cand_nm", "party_id", "contbr_nm", "contb_receipt_amt", "election_tp"), class = "data.frame", row.names = c(NA, -7L))
在创建客户之前。然后,初始的InitialContext将尝试创建接口的实例,这会快速失败。

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

至于源代码中的Android注释:这只是注意到与“JDK8 compact2 profile”不兼容的平台,并且通过不直接导入System.setProperty(javax.naming.InitialContext.INITIAL_CONTEXT_FACTORY, "javax.naming.spi.InitialContextFactory")类来解决它(因为它显然是不存在于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-client:1.10)。

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

相关问题