• 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

  • 相关阅读:
    基元线程同步构造之用户模式易变构造volatile
    C# 基元线程同步构造
    idea 的Low Memory问题
    python工具——xmind
    VSCODE 远程开发树莓派
    firefox临时文件位置及修改方法
    Veeam Backup & Replication 9.5 备份方式详解
    Windows下登录凭证密码获取工具
    VMProtect虚拟机保护分析入门
    Applescrip
  • 原文地址:https://www.cnblogs.com/vayci/p/7388689.html
Copyright © 2020-2023  润新知