Quartz带参数任务的创建与修改

需求背景:创建的quartz任务需要用到三个参数,根据参数去执行并将结果入库,并且参数可修改更新。

这里,有三个参数需要传入,分别是planId、target、officeId

 

定义Job类:

public class StatisticsTaskService implements Job {

    private Logger logger = LoggerFactory.getLogger(StatisticsTaskService.class);
    
    private StatusStatisticsService statusStatisticsService = ApplicationContextHelper.getBean(StatusStatisticsService.class);
    

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        
JobDataMap dataMap
= context.getJobDetail().getJobDataMap(); JobParameter jobParam = (JobParameter)dataMap.get(JobParameter.JOB_PARAM); String planId = jobParam.getPlanId(); String target = jobParam.getTarget(); String officeId = jobParam.getOfficeId(); //System.out.println(jobParam.toString()); //根据传入的target参数执行不同操作 if(target.equals("1")){ //执行操作1 }else if(target.equals("2")){ //执行操作2 }else{ //执行其他操作 } logger.info("Job:"+planId+" target:"+target); } }

 

 定义参数类:

public class JobParameter implements Serializable{    private static final long serialVersionUID = 1L;

    public static final String JOB_PARAM = "jobParam";
    
    private String planId;
    private String target;
    private String officeId;
    
    public String getPlanId() {
        return planId;
    }
    public void setPlanId(String planId) {
        this.planId = planId;
    }
    public String getTarget() {
        return target;
    }
    public void setTarget(String target) {
        this.target = target;
    }
    public String getOfficeId() {
        return officeId;
    }
    public void setOfficeId(String officeId) {
        this.officeId = officeId;
    }
    
    @Override
    public String toString() {
        return "JobParameter [planId=" + planId + ", target=" + target + ", officeId=" + officeId + "]";
    }
}

 

创建任务创建和修改方法:

1.创建任务:

public static void createScheduleJobWithParams(Scheduler scheduler, String jobName,
            String jobGroup, String cronExpression, Class<? extends Job> jobClass,
        String planId,String target,String officeId) {
// 构建job信息 JobDetail jobDetail = JobBuilder.newJob(jobClass) .withIdentity(jobName, jobGroup) .build();
//创建初始参数 JobParameter jobParam
= new JobParameter(); jobParam.setPlanId(planId); jobParam.setTarget(target); jobParam.setOfficeId(officeId); jobDetail.getJobDataMap().put(JobParameter.JOB_PARAM, jobParam); CronScheduleBuilder scheduleBuilder = CronScheduleBuilder .cronSchedule(cronExpression); CronTrigger trigger = TriggerBuilder.newTrigger() .withIdentity(jobName, jobGroup).withSchedule(scheduleBuilder) .build(); try { scheduler.scheduleJob(jobDetail, trigger); if (!scheduler.isStarted()) { scheduler.start(); } } catch (SchedulerException e) { e.printStackTrace(); } }

 

2.修改任务:

public static void updateScheduleJobWithParams(Scheduler scheduler, String jobName, String jobGroup, String cronExpression,
      String planId,String target) {
try { TriggerKey triggerKey = getTriggerKey(jobName, jobGroup); CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression); CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); // 按新的cronExpression表达式重新构建trigger trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); //参数修改 JobKey jobKey = getJobKey(jobName, jobGroup); JobParameter jobParam = (JobParameter) scheduler.getJobDetail(jobKey).getJobDataMap().get(JobParameter.JOB_PARAM); jobParam.setPlanId(planId); jobParam.setTarget(target); // 按新的trigger重新设置job执行 scheduler.rescheduleJob(triggerKey, trigger); } catch (SchedulerException e) { e.printStackTrace(); } }

 

编码总结:

最开始时我将三个参数直接put进JobDetail的JobDataMap,发现任务中能够正常读取,但是在更新参数是发现set后值不变,不知是不是JobDataMap继承DirtyFlagMap的原因,没有深究。

后将三个参数封装为对象,并实现序列化,以对象形式传入,修改就没有问题了。

 

参考链接:http://sulaohuai.blog.51cto.com/10674946/1702625

转载于:https://www.cnblogs.com/vayci/p/7388689.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在使用Spring Quartz实现定时任务时,如果需要修改定时时间而不重启服务,可以考虑以下几种方式: 1. 使用Quartz的动态定时任务更新功能: Quartz提供了动态修改定时任务的功能,可以通过更新Cron表达式来实现修改定时时间。首先,在配置文件设置定时任务的Cron表达式为一个变量,然后在代码通过调用Quartz的API读取配置文件的变量,并更新定时任务的Cron表达式。通过这种方式,不需要重启服务即可修改定时时间。 2. 使用数据库表保存定时任务配置参数: 可以将定时任务的配置参数,如定时时间、执行类等保存在数据库。然后在代码通过查询数据库表的方式动态获取定时任务的配置参数。当需要修改定时时间时,只需更新数据库的相应字段,代码会动态读取到新的定时时间并生效,而不需要重启服务。 3. 使用Spring的动态Bean注册功能: 在项目启动时,通过编程的方式动态注册定时任务的Bean。将定时任务的配置属性作为参数传入Bean,当需要修改定时时间时,通过修改Bean的相关属性值来实现。Spring会自动重新加载Bean的定义,并根据新的配置参数重新创建定时任务对象,从而实现修改定时时间而不重启服务。 综上所述,使用Quartz的动态定时任务更新功能、数据库表保存定时任务配置参数或者Spring的动态Bean注册功能,都可以实现在不重启服务的情况下修改定时时间。根据实际项目需求和技术架构选择合适的方式即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值