java B2B2C Springboot仿淘寶電子商城系統-Spring Cloud Task

概述
Spring Cloud Task的目標是爲Spring Boot應用程序提供創建短運行期微服務的功能。在Spring Cloud Task中,我們可以靈活地動態運行任何任務,按需分配資源並在任務完成後檢索結果。Tasks是Spring Cloud Data Flow中的一個基礎項目,允許用戶將幾乎任何Spring Boot應用程序作爲一個短期任務執行。
需要JAVA Spring Cloud大型企業分佈式微服務雲構建的B2B2C電子商務平臺源碼一零三八七七四六二六

Spring Cloud Task的生命週期

現代的雲平臺都是圍繞着長生命週期的服務而設計的,如web應用,一經啓用,除非手動去重啓應用,否則就會沒有終點的持續運行。雖然大多數平臺都有方法在不重啓應用的情況下,將服務的生命週期推向終點,但每個服務的處理結果難以以可重用的方式來維護。Spring Cloud Task可以在平臺環境中執行短生命週期的應用,並記錄這些應用的結果,經由通過消息通知的機制來集成各個tasks。通過這特性就可以實現讓短生命週期的應用像長生命週期的應用一樣組成微服務架構。

Spring Task Cloud的方式對現代的雲環境是非常有用的,但它也在部署應用方面帶來新問題。如使用調度器(如corn)來執行Spring Boot應用時,如何在應用結束後監控到其執行結果?

Spring Cloud Task採用的方法是,將Spring Boot應用分爲開始、結束、以及正在運行等狀態。如批處理任務就是一個清晰的短生命週期應用,Spring Cloud Task會監控指定任務的所有生命週期事件。
生命週期是一個任務task實例運行的全過程,也是一個被配置爲task的Spring Boot應用被執行的過程(通過 添加@EnableTask註解配置)。
在task剛剛開始運行時(CommandLineRunner或ApplicationRunner及其子類的實例被執行之前)TaskRespository會創建一條task紀錄並將其標記爲start狀態。start事件由spring框架的SmartLifecycle#start觸發。開始事件被觸發說明了系統已經做好了執行CommandLineRunner或ApplicationRunner及其子類的實例的準備。

任務紀錄只有在 ApplicationContext被成功啓動後纔會被紀錄。如果ApplicationContext沒有被成功啓動,那麼task的相關信息也不會被紀錄。

當Spring Boot應用的所有*Runner#run接口都被調用後,或者在ApplicationContext發生了失敗(由ApplicationFailedEvent來表現),任務倉庫中此任務的執行結果都會被更新。

task 完成之後(*Runner#run方法被執行完)默認情況下會被關閉ApplicationContext。這個特性可以在配置文件中設置spring.cloud.task.closecontext_enable屬性爲false來更改。

其實現原理如下面代碼所示:

    public class TaskLifecycleListener{
        ...

        /**
         * 在發生task相關的事件後,會自動調用這個方法
         * Utilizes {@link ApplicationEvent}s to determine the start, end, and failure of a
         * task.  Specifically:
         * <ul>
         *     <li>{@link ContextRefreshedEvent} - Start of a task</li>
         *     <li>{@link ApplicationReadyEvent} - Successful end of a task</li>
         *     <li>{@link ApplicationFailedEvent} - Failure of a task</li>
         * </ul>
         *
         * @param applicationEvent The application being listened for.
         */
        @Override
        public void onApplicationEvent(ApplicationEvent applicationEvent) {
            if(applicationEvent instanceof ApplicationFailedEvent) {
                this.applicationFailedEvent = (ApplicationFailedEvent) applicationEvent;
                doTaskEnd();
            }
            else if(applicationEvent instanceof ExitCodeEvent){
                this.exitCodeEvent = (ExitCodeEvent) applicationEvent;
            }
            else if(applicationEvent instanceof ApplicationReadyEvent) {
                doTaskEnd();
            }
        }
        }

java B2B2C Springboot仿淘寶電子商城系統

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章