繁体   English   中英

在STOMP客户端心跳加速

[英]Heart-beating in STOMP client

我当前的stomp客户端进程的设计如下:

  1. 打开stomp连接(发送CONNECT帧)
  2. 订阅源(发送SUBSCRIBE帧)
  3. 循环以持续接收Feed:
 while (true) { connection.begin("txt1"); StompFrame message = connection.receive(); System.out.println("message get header"+message.toString()); LOG.info(message.getBody()); connection.ack(message, "txt1"); connection.commit("txt1"); } 

这个过程的问题在于我得到了

java.net.SocketTimeoutException: Read timed out
 at java.net.SocketInputStream.socketRead0(Native Method)...

我认为造成这种情况的原因主要是因为我订阅的Feed会在某些时候提供较慢的信息(因为我通常会在周末,节假日或晚上时收到此错误)。

我一直在这里阅读,我认为这将有助于解决我的问题。 但是,我不太确定如何将它与我的stomp客户端的当前布局相结合。 我是否必须在步骤3中发送CONNECT标头?

我目前正在使用activemq创建我的stomp客户端,如果这有帮助。

在stomp 规范中,我们有:

关于心跳本身,通过网络连接接收的任何新数据都表明远程端是活着的。 在给定的方向上,如果每毫秒都有心跳:

  • 发送方必须至少每毫秒通过网络连接发送新数据
  • 如果发送方没有要发送的真实STOMP帧,它必须发送一个换行字节(0x0A)
  • 如果在一个至少毫秒的时间窗口内,接收器没有收到任何新数据,它可以认为连接已经死了
  • 由于时序不准确,接收器应该容忍并考虑误差范围

这是否意味着我的客户需要每n秒发送一个换行符?

您连接的stomp服务器由于无效而超时连接。

如果服务器支持Stomp 1.1或更高版本,则客户端最简单的解决方案是在CONNECT的标头中包含心跳指令,例如“0,10000”。 这告诉服务器您无法发送心跳,但是您希望它每10秒发送一次。 这样您就不需要实现它们了,服务器会通过发送给您来保持连接处于活动状态。

当然服务器将有自己的客户端要求。 在您的评论中,它以“1000,0”响应您的请求。 这表明它将每1000毫秒发送一次心跳,并且它希望你每0毫秒发送一个,0表示根本没有。 所以你的工作将是最小的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM