2017-03-17 29 views
0

我有一個Spring Boot應用程序,並且使用Spring AMQP。我需要實現ApplicationContext關閉事件我自己的自定義邏輯,所以我在bean來實現DisposableBean,像這樣:如何在Spring AMQP bean後強制bean處理

public class ShutdownHandler implements DisposableBean { 

    @Override 
    public void destroy() throws Exception { 
     // I need access message listener containers here 
    } 
} 

的問題是,當我運行我的代碼,所有的AMQP豆已經被關閉,我收到以下異常:

The ApplicationContext is closed and the ConnectionFactory can no longer create connections. 

主要是,我需要一些隊列移動郵件給他人,爲了恢復處理時,我的應用程序再次啓動。 我發現問題歸因於AbstractMessageListenerContainer的階段設置爲Integer.MAX_VALUE,因此它將作爲第一個應用程序上下文bean之一處理。 我想什麼(沒有成功):

  1. @DependsOn("listenerContainer")註釋
  2. 實施SmartLifecycle和設置階段Integer.MAX_VALUE的

你知道其他方式在應用程序上下文停機狀態,迫使秩序和有訪問Spring AMQP bean?

回答

0

在上下文銷燬期間,您不應該與其他bean進行交互。

連接工廠(這是你所得到的錯誤是在階段Integer.MIN_VALUE + 1000,這意味着它是最後豆類之一是stopped()phase沒有爲豆破壞秩序的相關性)。

無需實現的DisposableBean,實現SmartLifecycle,而不是把你的豆腐比連接工廠大的階段。

如果需要,您還可以更改監聽器容器的階段。

所以,你的第二個選項應該有隻要你的bean的階段比連接工廠大,那麼這個消息只會在工廠停止後發出(這是一個很早的階段 - 很晚才停止)。

您可以通過爲org.springframework打開DEBUG日誌記錄來觀察bean的停止順序。如果您仍然無法弄清楚有什麼問題,請將DEBUG日誌發佈到某處並顯示您的監聽器和工廠配置。

0

我發現一個更簡單的解決方案,通過實施ApplicationListener<ContextClosedEvent>。該事件在應用程序上下文關閉的最初和處理bean之前被解僱,這正是我所需要的。