2015-11-04 26 views
1
  • 我們使用Spring-AMQP提供的ConnectionListener接口在底層連接上保留一個選項卡。通道創建時自動恢復,心跳設置爲10分鐘(用於某些產品需求)。我的觀察是即使底層rabbitMQ已經死亡,connectionListener.onClose()方法也不會被調用將近10分鐘。通知通道關閉到實現org.springframework.amqp.rabbit.connection.ConnectionListener的類

  • 我們還對API進行健康狀態檢查,並使用connectionListener.isOpen()方法確定連接的狀態。

  • 因爲SimpleConnection類

    @Override 
    public boolean isOpen() { 
        return delegate != null 
          && (delegate.isOpen() || this.delegate.getClass().getSimpleName().contains("AutorecoveringConnection")); 
    } 
    

這個代碼塊,並作爲連接是自動恢復總是返回true。因此,Health API在連接終止後不知道連接失敗10分鐘。

  • 是否有任何推薦的方法來通知ConnectionListener的通道關閉,因爲isOpen方法顯然不符合需要?

  • 正在實施ShutDownlistener的路要走嗎?由於我們無法訪問connectionListerner中的頻道,因此無法直接執行connection.addConnectionListerner(this)。從connectionFactory的shutdownCompleted方法可以調用connectionListener上的onClose或任何其他方法來通知它關閉?

還有其他想法嗎?

回答

1

首先,autoRecovery對Spring AMQP沒有必要;它一直有它自己的恢復機制,它早於(現在很長一段時間)現在由客戶端庫提供的機制。

無論如何,它在消費者方面被有效地禁用。

原因是,當代理恢復通道時,在該通道上監聽的代碼早已消失,並且消費者被孤立。爲了避免這個問題,我們在檢測到異常時關閉通道,以防止恢復通道的自動恢復。

所以,簡單的答案是禁用底層連接的自動恢復。

當使用SimpleMessageListenerContainer時,它將根據其recoveryIntervalrecoveryBackOff無限期地繼續嘗試重新連接。

您仍然可以使用心跳。

此外,容器在消費者遇到異常時發佈應用程序事件;您可以使用ApplicationListener來通知這些事件;有關更多信息,請參閱the documentation

0
  • 如上所述,刪除本地客戶端的自動恢復機制對我們來說是個竅門。
  • 現在Spring AMQP自動恢復在連接重置的情況下發生。
  • 而ConnectionListener的isOpen()方法每次都會返回正確的連接狀態,所以健康狀態API也是固定的。