1. 程式人生 > >SpringBoot知識體系實戰-定時器篇

SpringBoot知識體系實戰-定時器篇

之前 假設 schedule 取數據 rep 文件中 nag mark fc7

實戰前言:定時任務我想諸位童鞋都不陌生,簡而言之名為“設定定時鬧鐘做某件事情”,在這裏我將以訂單模塊作為實戰為例!

需求分析:在企業級應用中,經常打交道的業務應當屬於訂單模塊了,下面將基於這樣的場景實戰定時器:將業務級別的訂單表A中發生更新的數據 每天定時 同步到報表級別的訂單表B中(為了給數據分析部門做報表)!其定時執行的業務流程如下圖所示:
技術分享圖片

實現思路:
①、核心邏輯其實你會發現在於“拉取A表的數據以及更新到報表級別的訂單表B中”;
②、實現①流程之後,接下來其實是定時器的責任了。在這裏我采用的是Spring提供的Scheduler模塊來實現!
③、在這裏需要解釋“發生更新”的概念,假設每天拉取數據的日期定義為reportDate,那麽更新的數據應當包括:“create_time=reportDate的數據列表”以及“update_time=reportDate的數據列表”,即“當天新產生的數據以及當天發生更新的數據”統稱為“發生更新的數據”,即增量拉取;

在實戰過程中,我也實現了全量拉取的業務邏輯。而對於報表級別的訂單表B,則是通過order_no,即訂單編號來判斷記錄是否唯一從而決定觸發B表的數據記錄是需要修改還是新增

正文:當得到上面的實現思路時,其實已經幾乎實現了一大半,接下來就是代碼實現了
①、首先創建數據庫db_springboot,創建兩張數據字段一樣的表,分別為業務級別的數據表A:order_record,報表級別的數據表B:order_report。並用mybatis逆向工程生成entity,mapper,mapper.xml文件(在這裏就不貼出來了!),下面貼出A,B表的創建語句:
技術分享圖片

技術分享圖片

②、然後在業務級別的訂單模塊OrderRecordMapper中定義全量/增量拉取的sql邏輯:

技術分享圖片

技術分享圖片

③、在報表級別的訂單模塊OrderReportMapper中定義新增或者修改的sql邏輯,即通過訂單編號查詢的sql邏輯

技術分享圖片

技術分享圖片

④、采用Spring的Scheduler組件模塊實現定時邏輯,在使用之前,需要在SpringBoot啟動類開啟Scheduler,如下所示:
技術分享圖片

⑤、而真正的定時代碼邏輯如下:

技術分享圖片

技術分享圖片

效果:在這裏,@Scheduled是核心重點,而其中的cron參數其實就是:“秒 分 時 日 月 年”的設置,在這裏我是動態配置配置文件中,配置如下圖所示:
技術分享圖片

系統一啟動,將會在定時設置的cron的那個點開始觸發,首先是源數據表,接著是從源數據表中“拉取今天新增的以及新增更新的數據列表” 並新增或者更新到 目標報表表B中,數據表中的數據以及觸發的效果如下圖所示:

技術分享圖片

技術分享圖片

技術分享圖片

結語:以上涉及到的源碼以及數據庫下載地址:http://down.51cto.com/data/2449867 實戰過程如有相關問題,請多多指教!若文章能幫助到你,請點贊轉發分享唄,順便關註關註我的微信公眾號或者加我個人qq:1974544863 或者 qq群:583522159(java開源技術交流)進行技術交流
技術分享圖片

SpringBoot知識體系實戰-定時器篇