Spring Boot 配置 Quartz 定时任务的方法

网友投稿 452 2022-09-29


Spring Boot 配置 Quartz 定时任务的方法

Quartz有四个核心概念:

Job:是一个接口,只定义一个方法 execute(JobExecutionContext context),在实现接口的 execute 方法中编写所需要定时执行的 Job(任务)

Double slongitude = Double.valueOf(jobExecutionContext.getJobDetail().getJobDataMap().get("slongitude").toString());

JobDetail:Quartz 每次调度 Job 时,都重新创建一个 Job 实例,因此它不接受一个 Job 的实例,相反它接收一个 Job 实现类(JobDetail,描述 Job 的实现类及其他相关的静态信息,如 Job 名字、描述、关联监听器等信息),以便运行时通过 newInstance() 的反射机制实例化 Job。

rigger:是一个类,描述触发 Job 执行的时间触发规则,主要有 SimpleTrigger 和 CronTrigger 这两个子类。当且仅当需调度一次或者以固定时间间隔周期执行调度,SimpleTrigger 是最适合的选择;而 CronTrigger 则可以通过 Cron 表达式定义出各种复杂时间规则的调度方案:如工作日周一到周五的 15:00 ~ 16:00 执行调度等。

Scheduler:调度器就相当于一个容器,装载着任务和触发器,该类是一个接口,代表一个 Quartz 的独立运行容器,Trigger 和 JobDetail 可以注册到 Scheduler 中,两者在 Scheduler 中拥有各自的组及名称,组及名称是 Scheduler 查找定位容器中某一对象的依据,Trigger 的组及名称必须唯一,JobDetail 的组和名称也必须唯一(但可以和 Trigger 的组和名称相同,因为它们是不同类型的)。Scheduler 定义了多个接口方法,允许外部通过组及名称访问和控制容器中 Trigger 和 JobDetail。

1.导入pom依赖

org.springframework.boot

spring-boot-starter-quartz

2.开启定时任务

@EnableScheduling注解

//java fhadmin.cn

@EnableScheduling

@SpringBootApplication

public class DemoApplication {

public static void main(String[] args) {

SpringApplication.run(DemoApplication.class, args);

}

}

3.新建一个job

@Slf4j

public class MyJob implements Job {

@Override

public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {

try {

executeTask(jobExecutionContext);

} catch (Exception e) {

e.printStackTrace();

}

}

//java fhadmin.cn

private static void executeTask(JobExecutionContext jobExecutionContext) throws SchedulerException {

//JobExecutionContext 类提供了调度应用的一些信息;

//Job 运行时的信息保存在 JobDataMap 实例中。

JobKey key = jobExecutionContext.getJobDetail().getKey();

System.out.println(new Date()+"->"+key.toString()+"定时任务正在执行");

}

}

4.构建JobDetailrigger

把Trigger 和 JobDetail 可以注册到 Scheduler 中

//fhrom fhadmin.cn

@Configuration

public class QuartzManager {

// public static final String JOB1="job1";

// public static final String GROUP1="group1";

/**默认每个星期凌晨一点执行*/

//public static final String DEFAULT_CRON="0 0 1 ? * L";

/**默认5秒执行一次*/

// public static final String DEFAULT_CRON="*/5 * * * * ?";

/**

* 任务调度

*/

private Scheduler scheduler;

@Bean

public Scheduler scheduler() throws SchedulerException {

SchedulerFactory schedulerFactoryBean = new StdSchedulerFactory();

this.scheduler = schedulerFactoryBean.getScheduler();

return schedulerFactoryBean.getScheduler();

}

/**

* 开始执行定时任务

*/

public void startJob(String name,String group,String time) throws SchedulerException {

startJobTask(scheduler,name,group,time);

scheduler.start();

}

/**

* 启动定时任务

* @param scheduler

*/

private void startJobTask(Scheduler scheduler,String name ,String group,String time) throws SchedulerException {

//对于身份

JobDetail jobDetail= JobBuilder.newJob(MyJob.class).withIdentity(nVxjiZame,group).build();

System.out.println("jobDetail:-------------"+jobDetail);

String DEFAULT_CRON="*/"+time+" * * * * ?";

// SimpleScheduleBuilder CronScheduleBuilder 用于构建Scheduler,定义任务调度的时间规则

CronScheduleBuilder cronScheduleBuilder=CronScheduleBuilder.cronSchedule(DEFAULT_CRON);

//触发器

CronTrigger cronTrigger=TriggerBuilder.newTrigger().withIdentity(name,group)

.withSchedule(cronScheduleBuilder).build();

scheduler.scheduleJob(jobDetail,cronTrigger);

}

/**

* 获取Job信息

* @param name

* @param group

*/

public String getjobInfo(String name,String group) throws SchedulerException {

TriggerKey triggerKey=new TriggerKey(name,group);

System.out.println("triggerKey:"+triggerKey);

CronTrigger cronTrigger= (CronTrigger) scheduler.getTrigger(triggerKey);

return String.format("time:%s,state:%s",cronTrigger.getCronExpression(),

scheduler.getTriggerState(triggerKey).name());

}

/**

* 修改任务的执行时间

* @param name

* @param group

* @param cron cron表达式

* @return

* @throws SchedulerException

*/

public boolean modifyJob(String name,String group,String cron) throws SchedulerException{

Date date=null;

TriggerKey triggerKey=new TriggerKey(name, group);

CronTrigger cronTrigger= (CronTrigger) scheduler.getTrigger(triggerKey);

String oldTime=cronTrigger.getCronExpression();

if (!oldTime.equalsIgnoreCase(VxjiZcron)){

CronScheduleBuilder cronScheduleBuilder=CronScheduleBuilder.cronSchedule(cron);

CronTrigger trigger=TriggerBuilder.newTrigger().withIdentity(name,group)

.withSchedule(cronScheduleBuilder).build();

date=scheduler.rescheduleJob(triggerKey,trigger);

}

return date !=null;

}

/**

* 暂停所有任务

* @throws SchedulerException

*/

public void pauseAllJob()throws SchedulerException{

scheduler.pauseAll();

}

/**

* 暂停某个任务

* @param name

* @param group

* @throws SchedulerException

*/

public void pauseJob(String name,String group)throws SchedulerException{

JobKey jobKey=new JobKey(name,group);

JobDetail jobDetail=scheduler.getJobDetail(jobKey);

if (jobDetail==null) {

return;

}

scheduler.pauseJob(jobKey);

}

/**

* 恢复所有任务

* @throws SchedulerException

*/

public void resumeAllJob()throws SchedulerException{

scheduler.resumeAll();

}

/**

* 恢复某个任务

*/

public void resumeJob(String name,String group)throws SchedulerException {

JobKey jobKey=new JobKey(name,group);

JobDetail jobDetail=scheduler.getJobDetail(jobKey);

if (jobDetail==null) {

return;

}

scheduler.resumeJob(jobKey);

}

/**

* 删除某个任务

* @param name

* @param group

* @throws SchedulerException

*/

public void deleteJob(String name,String group)throws SchedulerException{

JobKey jobKey=new JobKey(name, group);

JobDetail jobDetail=scheduler.getJobDetail(jobKey);

if (jobDetail==null) {

return;

}

scheduler.deleteJob(jobKey);

}

}

5.编写Controller

通过调用接口 可以开始定时任务 结束定时任务 获取任务信息

//fhadmin.cn

@RestController

@RequestMapping("/quartz")

public class ModifyCronController {

@Autowired

private QuartzManager quartzManager;

@GetMapping("/modify")

public String modify(@RequestParam("job")String job, //job的名称

@RequestParam("group")String group,//job的组

@RequestParam("time")String time //执行定时任务的步长

) throws SchedulerException {

// quartzManager.pauseJob(QuartzManager.JOB1,QuartzManager.GROUP1);

quartzManager.startJob(job,group,time);

String s = quartzManager.getjobInfo(job, group);

System.out.println("job:"+s);

return "ok";

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:浏览器的渗透测试攻击(黑客渗透测试)
下一篇:入门网站渗透测试的学习经验分享(网站渗透测试思路)
相关文章

 发表评论

评论列表