簡體   English   中英

Spring SmartLifeCycle 順序行為?

[英]Spring SmartLifeCycle sequential behavior?

我有一個分為幾個模塊的應用程序。 我創建了一個 class,它的工作是以正確的順序啟動它們並給每個模塊足夠的時間來啟動。 過去我對 SmartLifeCycle 搞砸了很多,但我想更多地了解如果我將它用於我的模塊而不是需要一個單獨的 class 來處理每個模塊的啟動和關閉,它會如何表現。

例如,模塊 A 需要相當長的時間才能啟動,因為它需要初始化幾個 TCP 與其他系統的連接。 模塊 B 依賴於模塊 A 在向這些客戶端發送各種消息時被完全初始化。 如果我讓每個模塊實現 SmartLifeCycle 並為它們提供正確的階段,以便它們以正確的順序開始,我可以假設 Spring 將在移動到下一個之前完全初始化一個嗎? 我們可以控制這種行為嗎?

IMO 最好使用事件驅動的方式來控制您的“模塊”。 如果我在每個模塊中都正確理解了您,那么您有一些服務應該相互依賴。 所以在這種情況下,您可以發布必要的事件並實現一些對這些事件做出反應的監聽器並調用這些服務器的相應方法,然后發布觸發下一部分監聽器的其他事件等。

例如:

@Component
public class FirstHandler {
    @Autoware private FirstService service;

    @EventListener(ApplicationReadyEvent.class) // start when App is ready
    public FirstWorkCompleted onAppReady() {
        service.doWork();
        return new FirstWorkCompleted(); // send FirstWorkCompleted event
    }
}
@Component
public class SecondHandler {
    @Autoware private SecondService service;

    @EventListener(FirstWorkCompleted.class) // start when First work is completed
    public SecondWorkCompleted onFirstWorkCompleted() {
        service.doWork();
        return new SecondWorkCompleted(); // send SecondWorkCompleted event
    }
}

您還可以使用ApplicationEventPublisher發送事件 - 只需將其注入您的組件中。

@EventListener方法可以異步工作 - 只需將@Async注釋添加到此類方法(不要忘記將@EnableAsync注釋應用於您的配置或應用程序 class )。

可以對@EventListener方法進行排序 - 只需按所需順序向它們添加@Order注釋。

有關應用程序事件的更多信息:

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM