2

我有一個應用程序從Kafka獲取消息並調用目標系統來更新舊版Oracle數據庫。停止Spring Stream Stream @StreamListener從目標系統關閉時收聽

我想啓用一個場景,如果目標系統關閉,將信息留在卡夫卡總線上,並且在給定的時間段內不處理它們。我正在考慮一些基於Hystrix斷路器的解決方案,但我找不到任何機制告訴Spring Cloud Stream「停止」事件監聽。我能想到的唯一另外一種選擇是斷路器是斷開的,將這些信息轉移到錯誤/重新處理主題,但這聽起來像是反模式。我應該只能暫停系統處理事件,這是微服務應用程序中pub/sub的整體優勢。

任何幫助將appriciated。

回答

0

一個解決方案是自動連線應用程序上下文。

@Autowired 
private ConfigurableApplicationContext context; 

您可以stop()start()上下文。

不應該在調用@StreamListener的線程上調用stop(),否則停止會被延遲(因爲默認情況下容器會等待該線程退出5秒 - 至少使用Rabbit綁定程序)。

當然,您需要某種帶外機制才能重新啓動 - 可能是JMX或單獨的應用程序上下文在某種控制主題上進行偵聽。

+0

好主意!我會試一試。我的猜測是,這不會是一個全功能的斷路器解決方案,因爲我猜停止上下文會停止整個應用程序,但這是一個很好的起點。 – odedia

+0

這很好。一旦我達到一定的錯誤閾值,我將停止上下文並進入一個簡單的while循環來測試服務器是否啓動(內部30秒)。一旦服務器啓動,我只需再次調用context.start()。因此,甚至不需要JMX或任何其他的東西,這個過程在這種情況下是一種自我修復,所有的消息都在卡夫卡繼續排隊。當然,我不能在ping方法中使用任何Spring功能,但沒關係,因爲它非常簡單。再次感謝! – odedia