在STOMP客户端心跳加速

 ___周麗 发布于 2023-01-19 10:21

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

    打开stomp连接(发送CONNECT帧)

    订阅源(发送SUBSCRIBE帧)

    循环以持续接收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秒发送一个换行符?

1 个回答
  • 您连接的stomp服务器由于无效而超时连接.

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

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

    2023-01-19 10:22 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有