我当前的stomp客户端进程的设计如下:
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会在某些时候提供较慢的信息(因为我通常会在周末,节假日或晚上时收到此错误)。
我一直在阅读here,我认为这有助于解决我的问题。但是,我不太确定如何将它与我的stomp客户端的当前布局相结合。我是否必须在步骤3中发送CONNECT标题?
我目前正在使用activemq来创建我的stomp客户端,如果有帮助的话。
在stomp spec我们有:
关于心跳本身,通过网络收到的任何新数据 网络连接表示远程端是活动的。在一个 给定方向,如果每毫秒预计心跳:
- 发送方必须至少每毫秒通过网络连接发送新数据
- 如果发送方没有要发送的真实STOMP帧,它必须发送一个换行字节(0x0A)
- 如果,在一个至少毫秒的时间窗口内,接收器没有收到任何新数据,它可以考虑 连接已死亡
- 由于时间不准确,接收方应该容忍并考虑到误差范围
这是否意味着我的客户需要每隔n秒发送换行符一次?
答案 0 :(得分:6)
您连接的stomp服务器由于无效而超时连接。
如果服务器支持Stomp 1.1或更高版本,则客户端最简单的解决方案是在CONNECT的标头中包含心跳指令,例如“0,10000”。这告诉服务器您无法发送心跳,但是您希望它每10秒发送一次。这样您就不需要实现它们了,服务器会通过发送给您来保持连接处于活动状态。
当然服务器对客户端有自己的要求。在您的评论中,它以“1000,0”响应您的请求。这表明它将每1000毫秒发送一次心跳,并且它希望你每0毫秒发送一个,0表示根本没有。所以你的工作很少。