在STOMP客户端心跳加速

时间:2014-03-09 17:07:46

标签: java activemq socketexception stomp

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

  1. 打开stomp连接(发送CONNECT帧)
  2. 订阅供稿(发送SUBSCRIBE框架)
  3. 循环以持续接收Feed:
  4. 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秒发送换行符一次?

1 个答案:

答案 0 :(得分:6)

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

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

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