2013-11-21 61 views
1

是否有可能以編程方式創建/拆除Spring集成渠道,而不是在Spring配置中靜態聲明它們?春季集成 - 以編程方式創建/拆除渠道

我的情況是這樣的:

我有需要推送通知web應用程序,所以我用長輪詢。這些長輪詢呼叫需要在服務器上阻塞,直到他們得到一個事件。

我在設想的(當然是開放的選擇),它是一個Spring集成隊列通道,用於每個會話,每個會話都監聽單個pubsub頻道。所以,當一個服務器事件發生時,它將被髮布到pubsub,然後它將被傳送到單個會話隊列,並在那裏被彈出併發送到正在輪詢的客戶端。

爲了做到這一點,創建會話時,我必須在pubsub頻道上註冊新的隊列頻道列表。當會話被銷燬時,新的隊列也將被銷燬。

是這樣的可能嗎?

我不想讓會話直接監聽pubsub,因爲存在丟失郵件的風險,所以我希望在兩者之間有一個隊列來緩衝它們。

感謝, 羅伊

回答

2

是的,你可以簡單地實例化一個QueueChannel,使之成爲BridgeHandleroutputChannel。然後創建一個EventDrivenConsumer,在構造函數中傳遞pubSub和橋處理程序。

致電start()對消費者使其訂閱pubSub,並stop()在會話關閉時取消訂閱。

如果您不想手動連接這些組件,只需聲明隊列通道並在小型應用程序上下文中橋接;使其成爲主要上下文的子元素,並且會自動在父上下文中訂閱pubSub。撥打context.destroy()斷開連接。

+0

輝煌。對於需要幫助的其他人,我已經爲代碼示例創建了一個要點:https://gist.github.com/roytruelove/7589536 –

+0

對此的另一個警告 - 如果有人試圖發佈信息,渠道必須至少有一個訂閱者給它的消息。由於我們正在動態創建訂閱,因此可能會發生給定頻道尚未訂閱訂閱者的情況。爲了解決這個問題,您需要使用(至少)NullChannel訂閱pubsub頻道。 –

+0

點對點'SubscribableChannel'(例如'DirectChannel')不能有零個訂閱者,但是與JMS主題一樣,PubSub頻道可以具有零個訂閱者,並且該消息剛被刪除。這可以使用'minSubscribers'屬性進行修改,但默認值爲零。該行爲可以通過DEBUG日誌進行檢查。 –