我当前的踩踏客户端进程设计如下:
- 打开stomp连接(发送CONNECT帧)
- 订阅一个feed(发送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)...
我认为这主要是因为我订阅的信息源在某些时候(例如周末、节假日或晚上)发布信息较慢所致。
我已经在这里阅读了相关内容,我认为这可以解决我的问题。但是,我不确定如何将其与当前的stomp客户端布局相结合。我是否需要在第三步中发送一个CONNECT标头?
如果有帮助的话,我目前正在使用activemq创建我的stomp客户端。
在stomp 规范中,我们有:
关于心跳本身,通过网络连接接收到的任何新数据都表示远程端点是活动的。在某个方向上,如果每毫秒都期望有心跳信号:
- 发送者必须每隔至少n毫秒通过网络连接发送新数据
- 如果发送者没有真正的STOMP帧要发送,则必须发送单个换行符字节(0x0A)
- 如果在至少n毫秒的时间窗口内,接收器没有接收到任何新数据,则可以将连接视为死亡
- 由于定时不准确,接收器应该具有容错性并考虑误差范围
这是否意味着我的客户端需要每n秒发送一个换行符?
heart-beat 0,2000
,但我不知道接下来该去哪里。 - obsessiveCookieCONNECT heart-beat:0,1000 client-id:<client-id> passcode:<passcode> login:<login>
,我会收到回复CONNECTED heart-beat:1000,0 version:1.0 session:<login> server:ActiveMQ/5.8.0
。如果我只在连接时执行此操作,我不知道如何监听心跳。 - obsessiveCookie