Quartz使用

Quzrtz概念

这是一个定时任务的线程

单机版结构

  • 1.Job:定义一个任务必须实现Quartz接口
  • 2.JobDetail:用于描述任务的详细信息(任务名称、任务分组等)
  • 3.Trigger:定义任务的调度时机(调度规则)SimpleTrigger:定义任务的
    执行的时间、执行频率、结束时间等CronTrigger:通过Cron表达式来定义 任务的执行规则
  • 4.Scheduler:调度器,使用Trigger定义的时间、执行规则来调度Job
  • 5.JobExecutionContext:任务执行上下文
  • 6.JobBuilder、TriggerBuilder…

helloworld

public class Hellojob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        SimpleDateFormat dateFormat =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        System.out.println(dateFormat.format(new Date())+"hello world");
    }
}
public class First {
    public static void main(String[] args) throws SchedulerException {
        //创建JobDetail
        JobDetail jobDetail = JobBuilder.newJob(Hellojob.class).withIdentity("hello", "hello").build();
        //创建Trigger
        SimpleTrigger trigger = TriggerBuilder.newTrigger().startNow().withIdentity("hello", "hello")
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever()).build();
        //创建Scheduler
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

        scheduler.scheduleJob(jobDetail,trigger);
        scheduler.start();
    }
}

SpringMVC搭载集群版Quartz

SpringRoot容器配置:

/*
        1. 数据源
        2. 事务管理器
        3. JobDetailFactoryBean
           特点:要求任务类继承QuartzJobBean
           属性:name、group、jobClass(任务类的Class对象)、durability
        4. CronTriggerFactoryBean
        5. SchedulerFactoryBean
           属性:数据源、事务管理、集群配置信息、triggers
*/
    <bean id="dataSource" class="com.zaxxer.hikari.HikariDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <property name="jdbcUrl" value="jdbc:mysql:///et2009" />
        <property name="username" value="root" />
        <property name="password" value="etoak" />
    </bean>
    <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <!-- JobDetailFactoryBean -->
    <bean id="emailJobDetail"
          class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        <property name="name" value="emailJob" />
        <property name="group" value="emailJob" />
        <!-- 这里是Class对象, 不是Spring Bean。
            要和MethodInvokingJobDetailFactoryBean的targetObject区分 -->
        <property name="jobClass" value="com.etoak.job.EmailJob" />
        <property name="durability" value="true" />
    </bean>

    <!-- CronTriggerFactoryBean -->
    <bean id="emailTrigger"
          class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="name" value="emailTrigger" />
        <property name="group" value="emailTrigger" />
        <property name="jobDetail" ref="emailJobDetail" />
        <property name="cronExpression" value="0/10 * * * * ?" />
    </bean>

    <!-- SchedulerFactoryBean -->
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="transactionManager" ref="transactionManager" />
        <!-- 集群配置信息 -->
        <property name="configLocation"
                  value="classpath:quartz.properties" />
        <property name="triggers">
            <list>
                <ref bean="emailTrigger" />
            </list>
        </property>
     <property name="applicationContextSchedulerContextKey"
                  value="spring" />

    </bean>

Job类,因为继承了QuartzJobBean而Spring容器不能管理这个bean,所以会导致我们没办法注入Service,所以采用下面这种手段,获得容器,强行获得ioc种管理的service

public class EmailJob extends QuartzJobBean {
    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        // 先获取Scheduler
        Scheduler scheduler = context.getScheduler();
        try {
            // 再获取SchedulerContext
            SchedulerContext schedulerContext = scheduler.getContext();
            // 再获取IOC容器
            ApplicationContext ioc =
                    (ApplicationContext)schedulerContext.get("spring");
            // 最后从ioc容器中拿到Spring Bean
            EmailService emailService = ioc.getBean(EmailService.class);
            emailService.sendEmail();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
  }

Job类的service

@Service
public class EmailService {
    public void sendEmail() {
        System.out.println("EmailService Send Email...");
    }
}

Controller中继续和暂停

@RestController
@RequestMapping("/job")
public class JobController {

    /** 已经通过SchedulerFactoryBean配置到Spring IOC容器了 */
    @Autowired
    Scheduler scheduler;

    /** 暂停任务 */
    @RequestMapping(value = "/pause", produces = "text/plain;charset=UTF-8")
    public String pause(String jobName, String jobGroup) throws SchedulerException {
        JobKey jobKey = new JobKey(jobName, jobGroup);
        if (!scheduler.checkExists(jobKey)) {
            return "任务不存在!";
        }

        // 暂停任务
        scheduler.pauseJob(jobKey);
        return "暂停成功";
    }

    /** 重启任务 */
    @RequestMapping("/resume")
    public String resume(String triggerName,
                         String triggerGroup) throws SchedulerException {

        /* 先判断Trigger是否存在 */
        TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroup);
        if (!scheduler.checkExists(triggerKey)) {
            return "Job Not Exists!";
        }

        /* 判断任务是否是暂停状态 */
        Trigger.TriggerState state = scheduler.getTriggerState(triggerKey);
        if (!state.equals(Trigger.TriggerState.PAUSED)) {
            return "Job is Not Paused!";
        }

        scheduler.resumeTrigger(triggerKey);
        return "Success";
    }

SpringBoot搭载集群Quartz

@Configuration配置

//数据源
	@Bean("ds1")
    public DataSource dataSource(){
        DruidDataSource druidDataSource =new DruidDataSource();
        druidDataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
        druidDataSource.setUrl("jdbc:mysql:///et2009?serverTimezone=UTC");
        druidDataSource.setUsername("root");
        druidDataSource.setPassword("etoak");
        return druidDataSource;
    }
    //事务管理器
    @Bean
    public DataSourceTransactionManager transactionManager(){
        DataSourceTransactionManager transactionManager =new DataSourceTransactionManager();
        transactionManager.setDataSource(this.dataSource());
        return transactionManager;
    }
    //Schedulerfactorybean
        @Bean
    public SchedulerFactoryBean schedulerFactoryBean(
            @Qualifier("ds1") DataSource dataSource,
            DataSourceTransactionManager transactionManager
    ){
        SchedulerFactoryBean schedulerFactoryBean =new SchedulerFactoryBean();
        schedulerFactoryBean.setDataSource(dataSource);
        schedulerFactoryBean.setTransactionManager(transactionManager);
        //=======读配置文件
        ResourcePatternResolver resolver =new PathMatchingResourcePatternResolver();
        Resource resource =resolver.getResource("classpath:quartz.properties");
        //=======
        schedulerFactoryBean.setConfigLocation(resource);
        schedulerFactoryBean.setApplicationContextSchedulerContextKey("spring");
        return schedulerFactoryBean;
    }

jobBean和service类和springMVC一样我就不写了 我们写上Controller,五个参数开这个线程,至于暂停和继续和上面一样

@RestController
@RequestMapping("/job")
public class JobController {
    //集群的Quartz一旦开起来 不手动停不会自己停下的
    @Autowired
    Scheduler scheduler;
    @RequestMapping("/create")
    public String create(@RequestParam String jobName,
                         @RequestParam String jobGroup,
                         @RequestParam String triggerName,
                         @RequestParam String triggerGroup,
                         @RequestParam String cron) throws ParseException, SchedulerException {
        JobDetailImpl jobDetail =new JobDetailImpl();
        jobDetail.setName(jobName);
        jobDetail.setGroup(jobGroup);
        jobDetail.setJobClass(EmailJob.class);
        jobDetail.setDurability(true);

        CronTriggerImpl cronTrigger =new CronTriggerImpl();
        cronTrigger.setName(triggerName);
        cronTrigger.setGroup(triggerGroup);
        cronTrigger.setCronExpression(cron);
        scheduler.scheduleJob(jobDetail,cronTrigger);
        return "success";
    }
}

Spring-task(最简易)

Maven依赖

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.6.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

Service+JobBean合二为一

@Service
public class TaskService {

    @Scheduled(cron = "0/5 * * * * ?")
    public void sendEmail(){
        System.out.println("hello world");
    }
}

启动类加@EnableScheduling注解

@SpringBootApplication
@EnableScheduling
public class SpringTaskApp {
    public static void main(String[] args) {
        SpringApplication.run(SpringTaskApp.class,args);
    }
}

结果:
在这里插入图片描述

总结

Quartz的初步入门就这么多啦~

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

商朝

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值