在上一章【第三十九章:基于SpringBoot & Quartz完成定時(shí)任務(wù)分布式單節(jié)點(diǎn)持久化】中我們已經(jīng)完成了任務(wù)的持久化秉沼,當(dāng)我們創(chuàng)建一個(gè)任務(wù)時(shí)任務(wù)會(huì)被quartz
定時(shí)任務(wù)框架自動(dòng)持久化到數(shù)據(jù)庫(kù)太惠,我們采用的是SpringBoot
項(xiàng)目托管的dataSource
來(lái)完成的數(shù)據(jù)源提供昌罩,當(dāng)然也可以使用quartz
內(nèi)部配置數(shù)據(jù)源方式,我們的標(biāo)題既然是提到了定時(shí)任務(wù)的分布式多節(jié)點(diǎn)俘种,那么怎么才算是多節(jié)點(diǎn)呢?當(dāng)有節(jié)點(diǎn)故障或者手動(dòng)停止運(yùn)行后是否可以自動(dòng)漂移任務(wù)到可用的分布式節(jié)點(diǎn)呢绝淡?
免費(fèi)教程專題
恒宇少年在博客整理三套免費(fèi)學(xué)習(xí)教程專題
宙刘,由于文章偏多
特意添加了閱讀指南
,新文章以及之前的文章都會(huì)在專題內(nèi)陸續(xù)填充
够委,希望可以幫助大家解惑更多知識(shí)點(diǎn)荐类。
本章目標(biāo)
- 完成定時(shí)任務(wù)分布式多節(jié)點(diǎn)配置,當(dāng)單個(gè)節(jié)點(diǎn)關(guān)閉時(shí)其他節(jié)點(diǎn)自動(dòng)接管定時(shí)任務(wù)茁帽。
- 創(chuàng)建任務(wù)時(shí)傳遞自定義參數(shù)玉罐,方便任務(wù)處理后續(xù)業(yè)務(wù)邏輯。
SpringBoot 企業(yè)級(jí)核心技術(shù)學(xué)習(xí)專題
專題 | 專題名稱 | 專題描述 |
---|---|---|
001 | Spring Boot 核心技術(shù) | 講解SpringBoot一些企業(yè)級(jí)層面的核心組件 |
002 | Spring Boot 核心技術(shù)章節(jié)源碼 | Spring Boot 核心技術(shù)簡(jiǎn)書每一篇文章碼云對(duì)應(yīng)源碼 |
003 | Spring Cloud 核心技術(shù) | 對(duì)Spring Cloud核心技術(shù)全面講解 |
004 | Spring Cloud 核心技術(shù)章節(jié)源碼 | Spring Cloud 核心技術(shù)簡(jiǎn)書每一篇文章對(duì)應(yīng)源碼 |
005 | QueryDSL 核心技術(shù) | 全面講解QueryDSL核心技術(shù)以及基于SpringBoot整合SpringDataJPA |
006 | SpringDataJPA 核心技術(shù) | 全面講解SpringDataJPA核心技術(shù) |
007 | SpringBoot核心技術(shù)學(xué)習(xí)目錄 | SpringBoot系統(tǒng)的學(xué)習(xí)目錄潘拨,敬請(qǐng)關(guān)注點(diǎn)贊5跏洹!! |
構(gòu)建項(xiàng)目
注意:我們本章項(xiàng)目需要結(jié)合上一章共同完成铁追,有一點(diǎn)要注意的是任務(wù)在持久化到數(shù)據(jù)庫(kù)內(nèi)時(shí)會(huì)保存任務(wù)的全路徑季蚂,如:
com.hengyu.chapter39.timers.GoodStockCheckTimer
,quartz
在運(yùn)行任務(wù)時(shí)會(huì)根據(jù)任務(wù)全路徑去執(zhí)行琅束,如果不一致則會(huì)提示找不到指定類扭屁,我們本章在創(chuàng)建項(xiàng)目時(shí)package
需要跟上一章完全一致。
我們這里就不去直接創(chuàng)建新項(xiàng)目了涩禀,直接復(fù)制上一章項(xiàng)目的源碼為新的項(xiàng)目命名為Chapter40
配置分布式
在上一章配置文件quartz.properties
中我們其實(shí)已經(jīng)為分布式做好了相關(guān)配置料滥,下面我們就來(lái)看一下分布式相關(guān)的配置。
分布式相關(guān)配置:
1. org.quartz.scheduler.instanceId
: 定時(shí)任務(wù)的實(shí)例編號(hào)艾船,如果手動(dòng)指定需要保證每個(gè)節(jié)點(diǎn)的唯一性葵腹,因?yàn)?code>quartz不允許出現(xiàn)兩個(gè)相同instanceId
的節(jié)點(diǎn)高每,我們這里指定為Auto
就可以了,我們把生成編號(hào)的任務(wù)交給quartz
践宴。
2. org.quartz.jobStore.isClustered
: 這個(gè)屬性才是真正的開啟了定時(shí)任務(wù)的分布式配置鲸匿,當(dāng)我們配置為true
時(shí)quartz
框架就會(huì)調(diào)用ClusterManager
來(lái)初始化分布式節(jié)點(diǎn)。
3. org.quartz.jobStore.clusterCheckinInterval
:配置了分布式節(jié)點(diǎn)的檢查時(shí)間間隔阻肩,單位:毫秒带欢。
下面是quartz.properties
配置文件配置信息:
#調(diào)度器實(shí)例名稱
org.quartz.scheduler.instanceName = quartzScheduler
#調(diào)度器實(shí)例編號(hào)自動(dòng)生成
org.quartz.scheduler.instanceId = AUTO
#持久化方式配置
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
#持久化方式配置數(shù)據(jù)驅(qū)動(dòng),MySQL數(shù)據(jù)庫(kù)
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
#quartz相關(guān)數(shù)據(jù)表前綴名
org.quartz.jobStore.tablePrefix = QRTZ_
#開啟分布式部署
org.quartz.jobStore.isClustered = true
#配置是否使用
org.quartz.jobStore.useProperties = false
#分布式節(jié)點(diǎn)有效性檢查時(shí)間間隔磺浙,單位:毫秒
org.quartz.jobStore.clusterCheckinInterval = 10000
#線程池實(shí)現(xiàn)類
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
#執(zhí)行最大并發(fā)線程數(shù)量
org.quartz.threadPool.threadCount = 10
#線程優(yōu)先級(jí)
org.quartz.threadPool.threadPriority = 5
#配置為守護(hù)線程洪囤,設(shè)置后任務(wù)將不會(huì)執(zhí)行
#org.quartz.threadPool.makeThreadsDaemons=true
#配置是否啟動(dòng)自動(dòng)加載數(shù)據(jù)庫(kù)內(nèi)的定時(shí)任務(wù),默認(rèn)true
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
當(dāng)我們啟動(dòng)任務(wù)節(jié)點(diǎn)時(shí)撕氧,會(huì)根據(jù)org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread
屬性配置進(jìn)行是否自動(dòng)加載任務(wù)瘤缩,默認(rèn)true
自動(dòng)加載數(shù)據(jù)庫(kù)內(nèi)的任務(wù)到節(jié)點(diǎn)。
測(cè)試分布式
上一章項(xiàng)目節(jié)點(diǎn)名稱:quartz-cluster-node-first
本章項(xiàng)目節(jié)點(diǎn)名稱:quartz-cluster-node-second
由于我們quartz-cluster-node-first
的商品庫(kù)存檢查定時(shí)任務(wù)是每隔30秒執(zhí)行一次伦泥,所以任務(wù)除非手動(dòng)清除否則是不會(huì)被清空的剥啤,在運(yùn)行項(xiàng)目測(cè)試之前需要將application.yml
配置文件的端口號(hào)、項(xiàng)目名稱修改下不脯,保證quartz-cluster-node-second
與quartz-cluster-node-first
端口號(hào)不一致府怯,可以同時(shí)運(yùn)行,修改后為:
spring:
application:
name: quzrtz-cluster-node-second
server:
port: 8082
然后修改相應(yīng)控制臺(tái)輸出防楷,為了能夠區(qū)分任務(wù)執(zhí)行者是具體的節(jié)點(diǎn)牺丙。
Chapter40Application啟動(dòng)類修改日志輸出:
logger.info("【【【【【【定時(shí)任務(wù)分布式節(jié)點(diǎn) - quartz-cluster-node-second 已啟動(dòng)】】】】】】");
GoodAddTimer商品添加任務(wù)類修改日志輸出:
logger.info("分布式節(jié)點(diǎn)quartz-cluster-node-second,商品添加完成后執(zhí)行任務(wù)复局,任務(wù)時(shí)間:{}",new Date());
GoodStockCheckTimer商品庫(kù)存檢查任務(wù)類修改日志輸出:
logger.info("分布式節(jié)點(diǎn)quartz-cluster-node-second冲簿,執(zhí)行庫(kù)存檢查定時(shí)任務(wù),執(zhí)行時(shí)間:{}",new Date());
下面我們啟動(dòng)本章項(xiàng)目亿昏,查看控制臺(tái)輸出內(nèi)容峦剔,如下所示:
2017-11-12 10:28:39.969 INFO 11048 --- [ main] c.hengyu.chapter39.Chapter40Application : 【【【【【【定時(shí)任務(wù)分布式節(jié)點(diǎn) - quartz-cluster-node-second 已啟動(dòng)】】】】】】
2017-11-12 10:28:41.930 INFO 11048 --- [lerFactoryBean]] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now, after delay of 2 seconds
2017-11-12 10:28:41.959 INFO 11048 --- [lerFactoryBean]] org.quartz.core.QuartzScheduler : Scheduler schedulerFactoryBean_$_yuqiyu1510453719308 started.
2017-11-12 10:28:51.963 INFO 11048 --- [_ClusterManager] o.s.s.quartz.LocalDataSourceJobStore : ClusterManager: detected 1 failed or restarted instances.
2017-11-12 10:28:51.963 INFO 11048 --- [_ClusterManager] o.s.s.quartz.LocalDataSourceJobStore : ClusterManager: Scanning for instance "yuqiyu1510450938654"'s failed in-progress jobs.
2017-11-12 10:28:51.967 INFO 11048 --- [_ClusterManager] o.s.s.quartz.LocalDataSourceJobStore : ClusterManager: ......Freed 1 acquired trigger(s).
2017-11-12 10:29:00.024 INFO 11048 --- [ryBean_Worker-1] c.h.c.timers.GoodStockCheckTimer : 分布式節(jié)點(diǎn)quartz-cluster-node-second,執(zhí)行庫(kù)存檢查定時(shí)任務(wù)角钩,執(zhí)行時(shí)間:Sun Nov 12 10:29:00 CST 2017
可以看到項(xiàng)目啟動(dòng)完成后自動(dòng)分配的instanceId
為yuqiyu1510450938654
吝沫,生成的規(guī)則是當(dāng)前用戶的名稱+時(shí)間戳。然后ClusterManager
分布式管理者自動(dòng)介入進(jìn)行掃描是否存在匹配的觸發(fā)器任務(wù)递礼,如果存在則會(huì)自動(dòng)執(zhí)行任務(wù)邏輯惨险,而商品庫(kù)存檢查定時(shí)任務(wù)確實(shí)由quartz-cluster-node-second
進(jìn)行輸出的。
測(cè)試任務(wù)自動(dòng)漂移
下面我們也需要把quartz-cluster-node-first
的輸出進(jìn)行修改脊髓,如下所示:
Chapter39Application啟動(dòng)類修改日志輸出:
logger.info("【【【【【【定時(shí)任務(wù)分布式節(jié)點(diǎn) - quartz-cluster-node-first 已啟動(dòng)】】】】】】");
GoodAddTimer商品添加任務(wù)類修改日志輸出:
logger.info("分布式節(jié)點(diǎn)quartz-cluster-node-first平道,商品添加完成后執(zhí)行任務(wù),任務(wù)時(shí)間:{}",new Date());
GoodStockCheckTimer商品庫(kù)存檢查任務(wù)類修改日志輸出:
logger.info("分布式節(jié)點(diǎn)quartz-cluster-node-first供炼,執(zhí)行庫(kù)存檢查定時(shí)任務(wù)一屋,執(zhí)行時(shí)間:{}",new Date());
接下來(lái)我們啟動(dòng)quartz-cluster-node-first
,并查看控制臺(tái)的輸出內(nèi)容:
2017-11-12 10:34:09.750 INFO 192 --- [ main] c.hengyu.chapter39.Chapter39Application : 【【【【【【定時(shí)任務(wù)分布式節(jié)點(diǎn) - quartz-cluster-node-first 已啟動(dòng)】】】】】】
2017-11-12 10:34:11.690 INFO 192 --- [lerFactoryBean]] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now, after delay of 2 seconds
2017-11-12 10:34:11.714 INFO 192 --- [lerFactoryBean]] org.quartz.core.QuartzScheduler : Scheduler schedulerFactoryBean_$_yuqiyu1510454049066 started.
項(xiàng)目啟動(dòng)完成后袋哼,定時(shí)節(jié)點(diǎn)并沒(méi)有實(shí)例化ClusterManager
來(lái)完成分布式節(jié)點(diǎn)的初始化冀墨,因?yàn)?code>quartz檢測(cè)到有其他的節(jié)點(diǎn)正在處理任務(wù),這樣也是保證了任務(wù)執(zhí)行的唯一性涛贯。
關(guān)閉quartz-cluster-node-second
我們關(guān)閉quartz-cluster-node-second
運(yùn)行的項(xiàng)目诽嘉,預(yù)計(jì)的目的可以達(dá)到quartz-cluster-node-first
會(huì)自動(dòng)接管數(shù)據(jù)庫(kù)內(nèi)的任務(wù),完成任務(wù)執(zhí)行的自動(dòng)漂移弟翘,我們來(lái)查看quartz-cluster-node-first
的控制臺(tái)輸出內(nèi)容:
2017-11-12 10:34:09.750 INFO 192 --- [ main] c.hengyu.chapter39.Chapter39Application : 【【【【【【定時(shí)任務(wù)分布式節(jié)點(diǎn) - quartz-cluster-node-first 已啟動(dòng)】】】】】】
2017-11-12 10:34:11.690 INFO 192 --- [lerFactoryBean]] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now, after delay of 2 seconds
2017-11-12 10:34:11.714 INFO 192 --- [lerFactoryBean]] org.quartz.core.QuartzScheduler : Scheduler schedulerFactoryBean_$_yuqiyu1510454049066 started.
2017-11-12 10:41:11.793 INFO 192 --- [_ClusterManager] o.s.s.quartz.LocalDataSourceJobStore : ClusterManager: detected 1 failed or restarted instances.
2017-11-12 10:41:11.793 INFO 192 --- [_ClusterManager] o.s.s.quartz.LocalDataSourceJobStore : ClusterManager: Scanning for instance "yuqiyu1510453719308"'s failed in-progress jobs.
2017-11-12 10:41:11.797 INFO 192 --- [_ClusterManager] o.s.s.quartz.LocalDataSourceJobStore : ClusterManager: ......Freed 1 acquired trigger(s).
2017-11-12 10:41:11.834 INFO 192 --- [ryBean_Worker-1] c.h.c.timers.GoodStockCheckTimer : 分布式節(jié)點(diǎn)quartz-cluster-node-first虫腋,執(zhí)行庫(kù)存檢查定時(shí)任務(wù),執(zhí)行時(shí)間:Sun Nov 12 10:41:11 CST 2017
控制臺(tái)已經(jīng)輸出了持久的定時(shí)任務(wù)稀余,輸出節(jié)點(diǎn)是quartz-cluster-node-first
悦冀,跟我們預(yù)計(jì)的一樣,節(jié)點(diǎn)quartz-cluster-node-first
完成了自動(dòng)接管quartz-cluster-node-second
的工作睛琳,而這個(gè)過(guò)程肯定有一段時(shí)間間隔盒蟆,而這個(gè)間隔可以修改quartz.properties
配置文件內(nèi)的屬性org.quartz.jobStore.clusterCheckinInterval
進(jìn)行調(diào)節(jié)。
關(guān)閉quartz-cluster-node-first
我們同樣可以測(cè)試啟動(dòng)任務(wù)節(jié)點(diǎn)quartz-cluster-node-second
后师骗,再關(guān)閉quartz-cluster-node-first
任務(wù)節(jié)點(diǎn)历等,查看quartz-cluster-node-second
控制臺(tái)的輸出內(nèi)容:
2017-11-12 10:53:31.010 INFO 3268 --- [ main] c.hengyu.chapter39.Chapter40Application : 【【【【【【定時(shí)任務(wù)分布式節(jié)點(diǎn) - quartz-cluster-node-second 已啟動(dòng)】】】】】】
2017-11-12 10:53:32.967 INFO 3268 --- [lerFactoryBean]] o.s.s.quartz.SchedulerFactoryBean : Starting Quartz Scheduler now, after delay of 2 seconds
2017-11-12 10:53:32.992 INFO 3268 --- [lerFactoryBean]] org.quartz.core.QuartzScheduler : Scheduler schedulerFactoryBean_$_yuqiyu1510455210493 started.
2017-11-12 10:53:52.999 INFO 3268 --- [_ClusterManager] o.s.s.quartz.LocalDataSourceJobStore : ClusterManager: detected 1 failed or restarted instances.
2017-11-12 10:53:52.999 INFO 3268 --- [_ClusterManager] o.s.s.quartz.LocalDataSourceJobStore : ClusterManager: Scanning for instance "yuqiyu1510454049066"'s failed in-progress jobs.
2017-11-12 10:53:53.003 INFO 3268 --- [_ClusterManager] o.s.s.quartz.LocalDataSourceJobStore : ClusterManager: ......Freed 1 acquired trigger(s).
2017-11-12 10:54:00.020 INFO 3268 --- [ryBean_Worker-1] c.h.c.timers.GoodStockCheckTimer : 分布式節(jié)點(diǎn)quartz-cluster-node-second,執(zhí)行庫(kù)存檢查定時(shí)任務(wù)辟癌,執(zhí)行時(shí)間:Sun Nov 12 10:54:00 CST 2017
得到的結(jié)果是同樣可以完成任務(wù)的自動(dòng)漂移寒屯。
如果兩個(gè)節(jié)點(diǎn)同時(shí)啟動(dòng),哪個(gè)節(jié)點(diǎn)先把節(jié)點(diǎn)信息注冊(cè)到數(shù)據(jù)庫(kù)就獲得了優(yōu)先執(zhí)行權(quán)黍少。
傳遞參數(shù)到任務(wù)
我們平時(shí)在使用任務(wù)時(shí)寡夹,如果是針對(duì)性比較強(qiáng)的業(yè)務(wù)邏輯,肯定需要特定的參數(shù)來(lái)完成業(yè)務(wù)邏輯的實(shí)現(xiàn)仍侥。
下面我們來(lái)模擬商品秒殺的場(chǎng)景要出,當(dāng)我們添加商品后自動(dòng)添加一個(gè)商品提前五分鐘的秒殺提醒,為關(guān)注該商品的用戶發(fā)送提醒消息农渊。
我們?cè)诠?jié)點(diǎn)quartz-cluster-node-first
中添加秒殺提醒任務(wù)患蹂,如下所示:
package com.hengyu.chapter39.timers;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.quartz.QuartzJobBean;
/**
* 商品秒殺提醒定時(shí)器
* 為關(guān)注該秒殺商品的用戶進(jìn)行推送提醒
* ========================
*
* @author 恒宇少年
* Created with IntelliJ IDEA.
* Date:2017/11/12
* Time:9:23
* 碼云:http://git.oschina.net/jnyqy
* ========================
*/
public class GoodSecKillRemindTimer
extends QuartzJobBean
{
/**
* logback
*/
private Logger logger = LoggerFactory.getLogger(GoodSecKillRemindTimer.class);
/**
* 任務(wù)指定邏輯
* @param jobExecutionContext
* @throws JobExecutionException
*/
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//獲取任務(wù)詳情內(nèi)的數(shù)據(jù)集合
JobDataMap dataMap = jobExecutionContext.getJobDetail().getJobDataMap();
//獲取商品編號(hào)
Long goodId = dataMap.getLong("goodId");
logger.info("分布式節(jié)點(diǎn)quartz-cluster-node-first,開始處理秒殺商品:{}砸紊,關(guān)注用戶推送消息.",goodId);
//.../
}
}
在秒殺提醒任務(wù)邏輯中传于,我們通過(guò)獲取JobDetail
的JobDataMap
集合來(lái)獲取在創(chuàng)建任務(wù)的時(shí)候傳遞的參數(shù)集合,我們這里約定了goodId
為商品的編號(hào)醉顽,在創(chuàng)建任務(wù)的時(shí)候傳遞到JobDataMap
內(nèi)沼溜,這樣quartz
在執(zhí)行該任務(wù)的時(shí)候就會(huì)自動(dòng)將參數(shù)傳遞到任務(wù)邏輯中,我們也就可以通過(guò)JobDataMap
獲取到對(duì)應(yīng)的參數(shù)值游添。
設(shè)置秒殺提醒任務(wù)
我們找到節(jié)點(diǎn)項(xiàng)目quartz-cluster-node-first
中的GoodInfoService
系草,編寫方法buildGoodSecKillRemindTimer
設(shè)置秒殺提醒任務(wù)通熄,如下所示:
/**
* 構(gòu)建商品秒殺提醒定時(shí)任務(wù)
* 設(shè)置五分鐘后執(zhí)行
* @throws Exception
*/
public void buildGoodSecKillRemindTimer(Long goodId) throws Exception
{
//任務(wù)名稱
String name = UUID.randomUUID().toString();
//任務(wù)所屬分組
String group = GoodSecKillRemindTimer.class.getName();
//秒殺開始時(shí)間
long startTime = System.currentTimeMillis() + 1000 * 5 * 60;
JobDetail jobDetail = JobBuilder
.newJob(GoodSecKillRemindTimer.class)
.withIdentity(name,group)
.build();
//設(shè)置任務(wù)傳遞商品編號(hào)參數(shù)
jobDetail.getJobDataMap().put("goodId",goodId);
//創(chuàng)建任務(wù)觸發(fā)器
Trigger trigger = TriggerBuilder.newTrigger().withIdentity(name,group).startAt(new Date(startTime)).build();
//將觸發(fā)器與任務(wù)綁定到調(diào)度器內(nèi)
scheduler.scheduleJob(jobDetail,trigger);
}
我們模擬秒殺提醒時(shí)間是添加商品后的5分鐘,我們通過(guò)調(diào)用jobDetail
實(shí)例的getJobDataMap
方法就可以獲取該任務(wù)數(shù)據(jù)集合找都,直接調(diào)用put
方法就可以進(jìn)行設(shè)置指定key的值唇辨,該集合繼承了StringKeyDirtyFlagMap
并且實(shí)現(xiàn)了Serializable
序列化,因?yàn)樾枰獙?shù)據(jù)序列化到數(shù)據(jù)庫(kù)的qrtz_job_details
表內(nèi)能耻。
修改保存商品方法赏枚,添加調(diào)用秒殺提醒任務(wù):
/**
* 保存商品基本信息
* @param good 商品實(shí)例
* @return
*/
public Long saveGood(GoodInfoEntity good) throws Exception
{
goodInfoRepository.save(good);
//構(gòu)建創(chuàng)建商品定時(shí)任務(wù)
buildCreateGoodTimer();
//構(gòu)建商品庫(kù)存定時(shí)任務(wù)
buildGoodStockTimer();
//構(gòu)建商品描述提醒定時(shí)任務(wù)
buildGoodSecKillRemindTimer(good.getId());
return good.getId();
}
添加測(cè)試商品
下面我們調(diào)用節(jié)點(diǎn)quartz-cluster-node-first
的測(cè)試Chapter39ApplicationTests.addGood
方法完成商品的添加,由于我們的quartz-cluster-node-second
項(xiàng)目并沒(méi)有停止晓猛,所以我們?cè)?code>quartz-cluster-node-second項(xiàng)目的控制臺(tái)查看輸出內(nèi)容:
2017-11-12 11:45:00.008 INFO 11652 --- [ryBean_Worker-5] c.h.c.timers.GoodStockCheckTimer : 分布式節(jié)點(diǎn)quartz-cluster-node-second饿幅,執(zhí)行庫(kù)存檢查定時(shí)任務(wù),執(zhí)行時(shí)間:Sun Nov 12 11:45:00 CST 2017
2017-11-12 11:45:30.013 INFO 11652 --- [ryBean_Worker-6] c.h.c.timers.GoodStockCheckTimer : 分布式節(jié)點(diǎn)quartz-cluster-node-second戒职,執(zhí)行庫(kù)存檢查定時(shí)任務(wù)栗恩,執(zhí)行時(shí)間:Sun Nov 12 11:45:30 CST 2017
2017-11-12 11:45:48.230 INFO 11652 --- [ryBean_Worker-7] c.hengyu.chapter39.timers.GoodAddTimer : 分布式節(jié)點(diǎn)quartz-cluster-node-second,商品添加完成后執(zhí)行任務(wù)帕涌,任務(wù)時(shí)間:Sun Nov 12 11:45:48 CST 2017
2017-11-12 11:46:00.008 INFO 11652 --- [ryBean_Worker-8] c.h.c.timers.GoodStockCheckTimer : 分布式節(jié)點(diǎn)quartz-cluster-node-second摄凡,執(zhí)行庫(kù)存檢查定時(shí)任務(wù),執(zhí)行時(shí)間:Sun Nov 12 11:46:00 CST 2017
2017-11-12 11:46:30.016 INFO 11652 --- [ryBean_Worker-9] c.h.c.timers.GoodStockCheckTimer : 分布式節(jié)點(diǎn)quartz-cluster-node-second蚓曼,執(zhí)行庫(kù)存檢查定時(shí)任務(wù)亲澡,執(zhí)行時(shí)間:Sun Nov 12 11:46:30 CST 2017
2017-11-12 11:47:00.011 INFO 11652 --- [yBean_Worker-10] c.h.c.timers.GoodStockCheckTimer : 分布式節(jié)點(diǎn)quartz-cluster-node-second,執(zhí)行庫(kù)存檢查定時(shí)任務(wù)纫版,執(zhí)行時(shí)間:Sun Nov 12 11:47:00 CST 2017
2017-11-12 11:47:30.028 INFO 11652 --- [ryBean_Worker-1] c.h.c.timers.GoodStockCheckTimer : 分布式節(jié)點(diǎn)quartz-cluster-node-second床绪,執(zhí)行庫(kù)存檢查定時(shí)任務(wù),執(zhí)行時(shí)間:Sun Nov 12 11:47:30 CST 2017
2017-11-12 11:48:00.014 INFO 11652 --- [ryBean_Worker-2] c.h.c.timers.GoodStockCheckTimer : 分布式節(jié)點(diǎn)quartz-cluster-node-second其弊,執(zhí)行庫(kù)存檢查定時(shí)任務(wù)癞己,執(zhí)行時(shí)間:Sun Nov 12 11:48:00 CST 2017
2017-11-12 11:48:30.013 INFO 11652 --- [ryBean_Worker-3] c.h.c.timers.GoodStockCheckTimer : 分布式節(jié)點(diǎn)quartz-cluster-node-second,執(zhí)行庫(kù)存檢查定時(shí)任務(wù)梭伐,執(zhí)行時(shí)間:Sun Nov 12 11:48:30 CST 2017
2017-11-12 11:49:00.010 INFO 11652 --- [ryBean_Worker-4] c.h.c.timers.GoodStockCheckTimer : 分布式節(jié)點(diǎn)quartz-cluster-node-second痹雅,執(zhí)行庫(kù)存檢查定時(shí)任務(wù),執(zhí)行時(shí)間:Sun Nov 12 11:49:00 CST 2017
2017-11-12 11:49:30.028 INFO 11652 --- [ryBean_Worker-5] c.h.c.timers.GoodStockCheckTimer : 分布式節(jié)點(diǎn)quartz-cluster-node-second糊识,執(zhí)行庫(kù)存檢查定時(shí)任務(wù)绩社,執(zhí)行時(shí)間:Sun Nov 12 11:49:30 CST 2017
2017-11-12 11:49:48.290 INFO 11652 --- [ryBean_Worker-6] c.h.c.timers.GoodSecKillRemindTimer : 分布式節(jié)點(diǎn)quartz-cluster-node-second,開始處理秒殺商品:15赂苗,關(guān)注用戶推送消息.
2017-11-12 11:50:00.008 INFO 11652 --- [ryBean_Worker-7] c.h.c.timers.GoodStockCheckTimer : 分布式節(jié)點(diǎn)quartz-cluster-node-second愉耙,執(zhí)行庫(kù)存檢查定時(shí)任務(wù),執(zhí)行時(shí)間:Sun Nov 12 11:50:00 CST 2017
秒殺任務(wù)在添加完成商品后的五分鐘開始執(zhí)行的拌滋,而我們也正常的輸出了傳遞過(guò)去的goodId
商品編號(hào)的參數(shù)朴沿,而秒殺提醒任務(wù)執(zhí)行一次后也被自動(dòng)釋放了。
總結(jié)
本章主要是結(jié)合上一章完成了分布式任務(wù)的講解,完成了測(cè)試持久化的定時(shí)任務(wù)自動(dòng)漂移赌渣,以及如何向定時(shí)任務(wù)傳遞參數(shù)魏铅。當(dāng)然在實(shí)際的開發(fā)過(guò)程中,任務(wù)創(chuàng)建是需要進(jìn)行封裝的坚芜,目的也是為了減少一些冗余代碼以及方面后期統(tǒng)一維護(hù)定時(shí)任務(wù)沦零。
本章源碼已經(jīng)上傳到碼云:
SpringBoot配套源碼地址:https://gitee.com/hengboy/spring-boot-chapter
SpringCloud配套源碼地址:https://gitee.com/hengboy/spring-cloud-chapter