2016-05-23 109 views
1

如何在完成所有文件的所有處理後,在彈簧集成中創建自動關閉?我的應用程序使用大量文件作爲輸入並使用http出站網關作爲最後一個端點,所以我對每個文件輸入都有http出站請求,並且我嘗試使用該端點的最後一個http響應作爲關閉觸發器(context.close ())春天融合。我的想法是嘗試使用(System.currentTime() - lastTimeGatewayResponse)> = idleTime作爲觸發器。但我沒有找到從該網關獲取lastTimeGatewayResponse的方法。彈簧集成自動關機

然後我嘗試下載http://forum.spring.io/forum/spring-projects/integration/116366-orderly-shutdown-how-to-know-when-downstream-executor-is-idle。但是mybe不是最好的解決方案,因爲我的應用程序在進程未完成時已經關閉。

任何人都有這方面的經驗?

感謝

回答

0

如果您使用4.2.x版(當前版本是4.2.6),您可以致電回覆道channel.getTimeSinceLastSend()

javadocs說這是在幾秒鐘內,但這是不正確的,這是毫秒。

0

那麼,實際上lastTimeGatewayResponse可能完全等效於該網關上的reply-channeltimeSinceLastSend

所以,你可以指定你的HTTP出站網關nullChanneloutputreply-channel),並跟蹤其timeSinceLastSend執行你的關機邏輯。

另一方面,嘗試使用<aggregator>來實現類似但更強健的行爲。您可以將correlationKey用作所有文件的靜態內容,並將其作爲<aggregator>的輸入操作觸發關閉。發佈策略可能是您輸入文件的數量。

+0

我們可以從主類入口點(我們稱之爲context.xml的地方)調用「lastTimeGatewayResponse/timeSinceLastSend」嗎?或者應該在端點內調用?在你的建議是在,如果我這樣如何調用context.close()?提前致謝。 – Harji

+0

你能舉個例子嗎?謝謝。對不起,請求很多。 – Harji

+0

好吧,如果它是'main',通常它會在上下文刷新之後停止,因爲沒有任何東西可以阻止該主線程。無論如何,您可以訪問'timeSinceLastSend'屬性從該上下文獲取'MessageChannel' bean。您應該定期做這個問題,或作爲每個文件進程的附帶事件。僅僅因爲你需要在最後一個之後有空閒時間。 –