• quartz 任务调度


    quartz 

    设置参数, 获取参数

    在job中使用spring注入的service对象

    循环获取所有的job

    删除job

    @PersistJobDataAfterExecution

    @DisallowConcurrentExecution

    maven 中添加依赖

      <dependency>
          <groupId>org.quartz-scheduler</groupId>
          <artifactId>quartz</artifactId>
          <version>2.2.1</version>
      </dependency>
      <dependency>
          <groupId>org.quartz-scheduler</groupId>
          <artifactId>quartz-jobs</artifactId>
          <version>2.2.1</version>
      </dependency>   

    quartz 的 API 设计使用 domain-specific language (DSL),  写起来十分的流畅, 可读性高。 写之前先导入类方便IDE联想:

      import org.quartz.Scheduler;
      import org.quartz.SchedulerException;
      import org.quartz.impl.StdSchedulerFactory;
      import static org.quartz.JobBuilder.*;
      import static org.quartz.TriggerBuilder.*;
      import static org.quartz.SimpleScheduleBuilder.*;

    使用:

        @Test
        public void test4() throws SchedulerException {
            Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
            JobDetail job1 = newJob(JobTest1.class)
                    // 第一个参数name: job名称,job的唯一标志如果一个job未执行完继续使用同名的jobName会报错,
                    // 第二个参数group:分组名称,用于逻辑处理
                    .withIdentity("test1", "test1Group").build();
            Trigger trigger1 = newTrigger()
                    .withIdentity("test1", "test1Group")
                    .usingJobData("name", "scott") //设置参数,在JobTest1类中取用
                    .usingJobData("gender","male")
                    .startNow() // 立即执行
                    .withSchedule(simpleSchedule()     //通过simpleSchedule定时, 有很多种类,比如cron等等
                            .withIntervalInSeconds(60)   //每60秒执行一次, 单位可设置为分,时,秒,毫秒
                            .withRepeatCount(2)) //  执行次数设置为2次,应为立即执行了一次, 所以实际执行此时是withRepeatCount+1次
                    .build();
    
    
            JobDataMap jobDataMap = new JobDataMap();
            jobDataMap.put("name", "scott");
            JobDetail job2 = newJob(JobTest2.class)
                    .withIdentity("test2", "test2Group")
                    .usingJobData(jobDataMap)
                    .build();
            Trigger trigger2 = newTrigger()
                    .withIdentity("test2", "test2Group")
                    .startNow()
                    .withSchedule(simpleSchedule()
                            .withIntervalInSeconds(20)
                            .repeatForever()) // 奔流到海不复回
                    .build();
    
    
            scheduler.scheduleJob(job1, trigger1);
            scheduler.scheduleJob(job2, trigger2);
            scheduler.start();
        }

    JobTest1代码

    package com.quartz;
    
    import org.quartz.*;
    
    public class JobTest1 implements Job {
    
        @Override
        public void execute(JobExecutionContext context) throws JobExecutionException {
            JobDataMap jobDataMap = context.getMergedJobDataMap();
            String name = jobDataMap.getString("name");  //获取参数
            int gender = jobDataMap.getIntValue("gender");
            System.out.println(name+gender);
        }
    }

    JobTest2 的代码:

    package com.quartz;
    
    import com.service.device.DeviceService;
    import org.quartz.*;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.context.support.SpringBeanAutowiringSupport;
    
    @PersistJobDataAfterExecution
    @DisallowConcurrentExecution
    public class JobTest2 implements Job {
        @Autowired
        private DeviceService deviceService;
        
        @Override
        public void execute(JobExecutionContext context) {
            SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);  //在非spring托管的类中使用spring的对象
            Integer result = deviceService.selectIdBydeviceCode("154653468");  //调用service层方法向数据库中查询数据
            System.out.println(result);
    
            JobDataMap jobDataMap = context.getMergedJobDataMap();
            String name = jobDataMap.getString("name");
            System.out.println(name);  //获取设置的参数
            
            SimpleTrigger trigger = (SimpleTrigger) context.getTrigger();
            int times = trigger.getTimesTriggered();  //获取当前执行次数
            System.out.println("我是job2第"+times+"次运行");
        }
    }

    循环所有的job, 删除指定job

       @Test
        public void testQuartz1() {
            try {
                Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
                for (String groupName : scheduler.getJobGroupNames()) {
                    for (JobKey jobKey : scheduler.getJobKeys(GroupMatcher.jobGroupEquals(groupName))) {
                        String jobName = jobKey.getName();
                        String jobGroup = jobKey.getGroup();
                        List<Trigger> triggers = (List<Trigger>) scheduler.getTriggersOfJob(jobKey);
                        Date nextFireTime = triggers.get(0).getNextFireTime();
                        System.out.println(jobName + "第"+times+"次运行, 存在" + jobGroup + "组,距离下次到期时间" + nextFireTime);
                        if(jobName.equalsIgnoreCase("test2"))  //删除job
                            scheduler.deleteJob(jobKey);
                    }
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
  • 相关阅读:
    报错:The specified datastore driver ("com.mysql.jdbc.Driver") was not found in the CLASSPATH. Please check your CLASSPATH specification, and the name of the driver.
    报错:HDFS IO error org.apache.hadoop.security.AccessControlException: Permission denied: user=root, access=WRITE, inode="/yk/dl/alarm_his":hdfs:supergroup:drwxr-xr-x
    报错:Error starting Jetty. JSON Metrics may not be available.java.net.BindException:地址已在使用
    报错:java.lang.ClassNotFoundException: org.codehaus.jackson.map.JsonMappingException
    Sqoop2 将hdfs中的数据导出到MySQL
    报错:Sqoop2 Error message: Class not found JDBC Driver Class: com.mysql.jdbc.Driver
    报错:Error, CM server guid updated, expected xxxxx, received xxxxx (未解决)
    pre 标签的使用注意事项
    成为专业程序员路上用到的各种优秀资料、神器及框架
    转webstorm的快捷键
  • 原文地址:https://www.cnblogs.com/jxlsblog/p/9980681.html
Copyright © 2020-2023  润新知