目前項目中,採用的是微服務框架,因爲在微服務中,存在須要定時的任務。但若是定時任務維護在每一個微服務下,當微服務部署多個實例的狀況下,會出現定事任務屢次執行的狀況。而且在解決問題的基礎上,但願可以實現動態修改任務的定時時間,能夠經過頁面對定時任務進行控制。mysql
首先,XXL-JOB是一個輕量級分佈式任務調度平臺,內容採用了Quartz定時框架實現,服務之間通訊經過RPC的方式實現。git
其次,在功能方面:github
詳情可參考官方網站:http://www.xuxueli.com/xxl-jobweb
github地址:https://github.com/xuxueli/xxl-jobspring
其中,xxl-job-core爲核心代碼塊,xxl-job-admin爲任務調度中心管理模塊,部署的話,部署xxl-job-admin便可。sql
sql文件爲:xxl-job/doc/db/tables_xxl_job.sql,在mysql數據庫中執行該sql,能生成新的數據庫xxl-job及相關的數據庫表xxl_job_*。數據庫
目前從源碼來看,暫時只支持mysql數據庫,如需支持其餘數據庫,可在源碼上進行相關的修改:如mybatis的配置、sql語句等。服務器
修改xxl-job-admin下的配置文件:application.propertiesmybatis
在配置文件中,主要須要修改數據庫地址(spring.datasource.url)、用戶名(spring.datasource.username)、密碼的配置(spring.datasource.password)爲實際的部署環境。app
端口號(server.port)默認爲8080,可修改。
訪問地址(server.context-path)默認爲xxl-job-admin,可修改。
啓動成功後,可經過訪問http://localhost:8080/xxl-job-admin來對任務調度中心進行訪問。
用戶名密碼默認爲:admin/123456
pom.xml中,增長依賴:
<dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>2.0.2</version> </dependency>
本文采用yml配置文件,增長配置以下:
xxl:
job:
admin:
addresses: http://localhost:8080/xxl-job-admin
executor:
ip:
port: 9999
logpath: /data/applogs/xxl-job/jobhandler
appname: plat-job
accessToken:
其中ip可不填,會自動識別註冊。
此處須要注意版本差別,因爲服務器端採用的是V2+,客戶端也須要採用V2+。否則會有異常。
V2+的配置類代碼以下:
import com.xxl.job.core.executor.impl.XxlJobSpringExecutor; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class XxlJobConfig { @Value("${xxl.job.admin.addresses}") private String adminAddresses; @Value("${xxl.job.executor.appname}") private String appName; @Value("${xxl.job.executor.ip}") private String ip; @Value("${xxl.job.executor.port}") private int port; @Value("${xxl.job.accessToken}") private String accessToken; @Value("${xxl.job.executor.logpath}") private String logPath; private int logRetentionDays=-1; @Bean(initMethod = "start", destroyMethod = "destroy") public XxlJobSpringExecutor xxlJobExecutor() { System.out.println(">>>>>>>>>>> xxl-job config init."); XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); xxlJobSpringExecutor.setAdminAddresses(adminAddresses); xxlJobSpringExecutor.setAppName(appName); xxlJobSpringExecutor.setIp(ip); xxlJobSpringExecutor.setPort(port); xxlJobSpringExecutor.setAccessToken(accessToken); xxlJobSpringExecutor.setLogPath(logPath); xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays); return xxlJobSpringExecutor; } }
代碼以下所示:
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import com.xxl.job.core.handler.annotation.JobHandler;
@JobHandler(value="TestHandler") @Component public class TestHandler extends IJobHandler { @Override public ReturnT<String> execute(String param) throws Exception { System.out.println("執行了TestHandler一次");
return SUCCESS; } }
在上面代碼中,Handler的命名爲「TestHandler」,此命名須要是惟一的,後續再服務器中配置會用到。
啓動成功後,會自動在服務器中,增長一個名爲【plat-job】的執行器,用來執行定時任務。
訪問服務器頁面登陸成功後,點擊執行器管理,如圖:
對執行器進行編輯,註冊方式改成【手動錄入】,機器地址寫入客戶端(微服務)具體的ip:port後,點擊保存。
點擊【任務管理】頁籤【新增】按鈕,執行器選擇plat-job,JobHandler編寫爲【TestHandler】,Cron爲定時計劃,如圖所示:
保存後,可點擊【執行】按鈕,查看是否調用了客戶端的Handler處理。在此再也不演示。如可執行,則點擊【啓動】按鈕,會在定時計劃內,再次調用Handler處理。
同時,在對任務的Cron進行修改、保存後,會動態的更新定時計劃,實現了項目中的指望。
因爲每一個微服務的ip和port能夠在執行器的機器地址中,經過逗號分隔的方式,可增長多個客戶端的地址,則解決了項目中多實例的問題。