[英]Heart-beating in STOMP client
我當前的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會在某些時候提供較慢的信息(因為我通常會在周末,節假日或晚上時收到此錯誤)。
我一直在這里閱讀,我認為這將有助於解決我的問題。 但是,我不太確定如何將它與我的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.