簡體   English   中英

在STOMP客戶端心跳加速

[英]Heart-beating in STOMP client

我當前的stomp客戶端進程的設計如下:

  1. 打開stomp連接(發送CONNECT幀)
  2. 訂閱源(發送SUBSCRIBE幀)
  3. 循環以持續接收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秒發送一個換行符?

您連接的stomp服務器由於無效而超時連接。

如果服務器支持Stomp 1.1或更高版本,則客戶端最簡單的解決方案是在CONNECT的標頭中包含心跳指令,例如“0,10000”。 這告訴服務器您無法發送心跳,但是您希望它每10秒發送一次。 這樣您就不需要實現它們了,服務器會通過發送給您來保持連接處於活動狀態。

當然服務器將有自己的客戶端要求。 在您的評論中,它以“1000,0”響應您的請求。 這表明它將每1000毫秒發送一次心跳,並且它希望你每0毫秒發送一個,0表示根本沒有。 所以你的工作將是最小的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM