SpringBoot_SpringTask_Quartz
一、SpringTask和Quartz
1、兩者都是用來(lái)任務(wù)調(diào)度的框架、比如需要每天定時(shí)清理垃圾數(shù)據(jù)
2、SpringTask
1、默認(rèn)單線程同步執(zhí)行
2、單個(gè)任務(wù)時(shí),當(dāng)前次的調(diào)度完成后,再執(zhí)行下一次任務(wù)調(diào)度
3、多個(gè)任務(wù)時(shí),一個(gè)任務(wù)執(zhí)行完成后才會(huì)執(zhí)行下一個(gè)任務(wù)。若需要任務(wù)能夠并發(fā)執(zhí)行,需手動(dòng)設(shè)置線程池
4、觸發(fā)方式:與Quartz的CronTrigger的表達(dá)式類似
5、可以使用注解標(biāo)注定時(shí)任務(wù)
3、Quartz
1、默認(rèn)多線程異步執(zhí)行
2、單個(gè)任務(wù)時(shí),在上一個(gè)調(diào)度未完成時(shí),下一個(gè)調(diào)度時(shí)間到時(shí),會(huì)另起一個(gè)線程開(kāi)始新的調(diào)度。業(yè)務(wù)繁忙時(shí),一個(gè)任務(wù)會(huì)有多個(gè)調(diào)度,可能導(dǎo)致數(shù)據(jù)處理異常。
3、多個(gè)任務(wù)時(shí),任務(wù)之間沒(méi)有直接影響,多任務(wù)執(zhí)行的快慢取決于CPU的性能
4、觸發(fā)方式一:SimpleTrigger:value=2000 每隔兩秒觸發(fā)
5、觸發(fā)方式二:CronTrigger:value=”0 0 12 * * ?” 每天中午12點(diǎn)觸發(fā)
6、需要在配置文件中實(shí)現(xiàn)配置Job
7、能被集群實(shí)例化,支持分布式部署
8、使用JobStoreCMT(JDBCJobStore的子類),Quartz 能參與JTA事務(wù);Quartz 能管理JTA事務(wù)(開(kāi)始和提交)在執(zhí)行任務(wù)之間,這樣,任務(wù)做的事就可以發(fā)生在JTA事務(wù)里。
4、兩者的區(qū)別
1、實(shí)現(xiàn),Task注解實(shí)現(xiàn)方式,比較簡(jiǎn)單。Quartz需要手動(dòng)配置Jobs。
2、任務(wù)執(zhí)行,Task默認(rèn)單線程串行執(zhí)行任務(wù),多任務(wù)時(shí)若某個(gè)任務(wù)執(zhí)行時(shí)間過(guò)長(zhǎng),后續(xù)任務(wù)會(huì)無(wú)法及時(shí)執(zhí)行。Quartz采用多線程,無(wú)這個(gè)問(wèn)題。
3、調(diào)度,Task采用順序執(zhí)行,若當(dāng)前調(diào)度占用時(shí)間過(guò)長(zhǎng),下一個(gè)調(diào)度無(wú)法及時(shí)執(zhí)行;Quartz采用異步,下一個(gè)調(diào)度時(shí)間到達(dá)時(shí),會(huì)另一個(gè)線程執(zhí)行調(diào)度,不會(huì)發(fā)生阻塞問(wèn)題,但調(diào)度過(guò)多時(shí)可能導(dǎo)致數(shù)據(jù)處理異常
4、部署,Quartz可以采用集群方式,分布式部署到多臺(tái)機(jī)器,分配執(zhí)行定時(shí)任務(wù)
二、SpringTask的使用
1、導(dǎo)入jar包:spring-context.jar包就帶這個(gè)功能、所以選擇 web就可以使用了
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2、編寫一個(gè)類,被Spring管理即可執(zhí)行
import java.util.Date;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.stereotype.Component;
@Component
public class TaskTools {
static int count=0;
@Scheduled( fixedRate = 5000 )
public void test001() {
System.out.println("無(wú)論上一次執(zhí)行需要多少秒,我都會(huì)在5秒后執(zhí)行:"+new Date().getSeconds());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Scheduled( fixedDelay = 5000 )
public void test002() {
System.out.println("上一次執(zhí)行完畢后,再過(guò)5秒,我再執(zhí)行:"+new Date().getSeconds());
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//@Scheduled(cron = "0 0/1 * * * ? ")
public void test003(){
System.out.println("我會(huì)每隔1分鐘執(zhí)行一次");
}
//initialDelay 初始化延遲時(shí)間,也就是標(biāo)識(shí)第一次延遲執(zhí)行的時(shí)間,只能配合 fixedDelay 或 fixedRate 使用
//@Scheduled(initialDelay = 5000, fixedRate = 5000)
public void test004() {
System.out.println("第一次執(zhí)行需要5秒后");
}
}
3、@Scheduled常用屬性介紹
| 屬性名 | 屬性作用 |
|---|---|
| fixedRate | 上一次執(zhí)行無(wú)論需要多少秒結(jié)束,我都會(huì)在5秒后執(zhí)行 |
| fixedDelay | 上一次執(zhí)行完畢后,我再執(zhí)行 |
| cron | Cron表達(dá)式:在線生成https://cron.qqe2.com/ |
| initialDelay | 初始化延遲時(shí)間,也就是標(biāo)識(shí)第一次延遲執(zhí)行的時(shí)間,只能配合 fixedDelay 或 fixedRate 使用 |
4、啟動(dòng)類添加注解
@SpringBootApplication
@EnableScheduling
public class Springboot004Application {
public static void main(String[] args) {
SpringApplication.run(Springboot004Application.class, args);
}
}
5、CronExpression表達(dá)式詳解
https://www.jianshu.com/p/1defb0f22ed1
在線制作Cron表達(dá)式:https://www.bejson.com/othertools/cron/
格式為:{秒數(shù)} {分鐘} {小時(shí)} {日期} {月份} {星期} {年份(可為空)}
cron表達(dá)式各占位符解釋:
以下為{秒數(shù)}的案例 ==> 允許值范圍: 0~59 ,不允許為空值,若值不合法,調(diào)度器將拋出SchedulerException異常
"*" 代表每隔1秒鐘觸發(fā);
"," 代表在指定的秒數(shù)觸發(fā),比如"0,15,45"代表0秒、15秒和45秒時(shí)觸發(fā)任務(wù)
"-" 代表在指定的范圍內(nèi)觸發(fā),比如"25-45"代表從25秒開(kāi)始觸發(fā)到45秒結(jié)束觸發(fā),每隔1秒觸發(fā)1次
"/" 代表觸發(fā)步進(jìn)(step),"/"前面的值代表初始值(""等同"0"),后面的值代表偏移量,比如"0/20"或者"/20"代表從0秒鐘開(kāi)始,每隔20秒鐘觸發(fā)1次,即0秒觸發(fā)1次,20秒觸發(fā)1次,40秒觸發(fā)1次;"5/20"代表5秒觸發(fā)1次,25秒觸發(fā)1次,45秒觸發(fā)1次;"10-45/20"代表在[10,45]內(nèi)步進(jìn)20秒命中的時(shí)間點(diǎn)觸發(fā),即10秒觸發(fā)1次,30秒觸發(fā)1次
三、Quartz的使用
1、導(dǎo)入jar包
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
2、創(chuàng)建一個(gè)【被調(diào)度的類】
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class MyJob implements Job {
private void before() {
System.out.println("任務(wù)開(kāi)始執(zhí)行");
}
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
before();
System.out.println("開(kāi)始:" + System.currentTimeMillis());
JobDataMap jdMap = context.getJobDetail().getJobDataMap(); //獲得傳遞過(guò)來(lái)的參數(shù)
System.out.println(jdMap.get("key"));
System.out.println("結(jié)束:" + System.currentTimeMillis());
after();
}
private void after() {
System.out.println("任務(wù)開(kāi)始執(zhí)行");
}
}
3、創(chuàng)建一個(gè)調(diào)用【任務(wù)調(diào)度服務(wù)】
import java.util.Date;
import javax.servlet.http.HttpServletRequest;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/student")
public class MyController {
@Autowired
Scheduler scheduler;
@RequestMapping(value = "/index001")
public void testTask() throws SchedulerException {
JobDetail jobDetail = JobBuilder.newJob(MyJob.class).withIdentity("job2", "group2").build();
jobDetail.getJobDataMap().put("key", "張三"); // 給自定義任務(wù)傳值
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0 0/1 * * * ?");
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("job2", "group2")
.withSchedule(cronScheduleBuilder).build();
scheduler.scheduleJob(jobDetail, cronTrigger);
}
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("Trigger_HelloQuartz", "group1") // 定義name/group
// .startNow()//一旦加入scheduler,立即執(zhí)行11
.startAt(new Date(System.currentTimeMillis() + 5000))// 5秒后執(zhí)行
.withSchedule(SimpleScheduleBuilder.simpleSchedule() // 使用SimpleTrigger
.withIntervalInSeconds(2) // 每隔2秒執(zhí)行一次
.withRepeatCount(1))// 重復(fù)1次,共計(jì)2次
// .repeatForever()) //一直執(zhí)行,奔騰到老不停歇
.build();
}
posted on 2022-01-19 10:46 小雞炸 閱讀(143) 評(píng)論(0) 收藏 舉報(bào)
浙公網(wǎng)安備 33010602011771號(hào)