quartz——JobExecutionContext和JobDataMap
控制器传值,需要根据对应值创建,启动以及对定时任务的相关操作:JobExecutionContext和JobDataMap基本用法,代码待优化,主要是用法吧
第一:控制器,
@RequestMapping("/stopTable") public String stopTableBei(String tableName,String cron){ String result = "error"; try{ JobService.job(tableName,String cron);//将变量传入service result = "ok"; }catch (Exception e){ e.printStackTrace(); } return result; }
第二:service层
//装载调度器
@Autowired
Scheduler scheduler;
public void job(String tableName) throws SchedulerException, InterruptedException { // 定义一个触发器 Trigger trigger = newTrigger().withIdentity("trigger1", "group1") // 定义名称和所属的租 .startNow() //可以链式定义多个值 .usingJobData("test1","Str") .usingJobData("test2",true) .usingJobData("test3",'女') .withSchedule(cronSchedule(cron)) //待优化点 .build(); // 定义一个JobDetail JobDetail job = newJob(MailJob.class) // 指定干活的类MailJob .withIdentity("mailjob1", "mailgroup") // 定义任务名称和分组 .usingJobData("email", "admin@110.com") // 定义属性 .usingjobdata("tableName",tableName)//存入传过来的值 .build(); // 调度加入这个job scheduler.scheduleJob(job, trigger); System.out.println("当前调度器的id是:"+scheduler.getSchedulerInstanceId()); // 启动 scheduler.start(); }
第三:job类
@Configuration @DisallowConcurrentExecution @PropertySource("classpath:quartz.properties") public class MyJob implements Job { @Override public void execute(JobExecutionContext context) throws JobExecutionException { //SimpleFormateSimpleDateFormat smf = new SimpleDateFormat("yyyyMMdd_HHmmss"); //System.out.println(smf.format(new Date().getTime())); //根据值类型和键获取对应值 trigger String test1 = context.getTrigger().getJobDataMap().getString("test1");//根据键获取String值 Boolean test2 = context.getTrigger().getJobDataMap().getBoolean("test2");//根据键获取boolean值 Char test3 = context.getTrigger().getJobDataMap().getChar("test3");//根据键获取Char值 System.out.println(test1+"\t"+test2+"\t"+test3); //根据值类型和键获取对应值 job String tableName = context.getJobDetail().getJobDataMap().getString("tableName");//取传过来的值 context.getJobDetail().getJobDataMap().getString("email");//二者只是.getJobDetail()和.getTrigger()的不同 } }
这样不仅可以传值,对于相同但是仅仅是操作对象不同的job,只用实现一个Job的类就够了,
对于JobExecutionContext context这个存放上下文信息的对象可以获取到的信息还有很多,配置JobDetail和Trigger的所有信息都可以获取,这里只写了获取自己传的参数
以上代码是还可以有dao层,还有专门存放任务的数据库,网上看到几个厉害的家伙博客是存放数据库的 大家可以看下
https://www.cnblogs.com/skyLogin/p/6915921.html ,
https://blog.csdn.net/m0_37872161/article/details/77773966
实现对job的增删改查,以及启动或者关闭状态的控制
看是看出来点意思,但是还没有实践,这因该是任务较多的时候这样配置,感觉任务很少的情况并没有必要。