QUARTZ 定时任务使用

你离开我真会死。 提交于 2020-03-03 07:04:31

目录

quartz 定时任务使用

准备工作

xml配置定时任务

执行结果分析

其它方式-注解配置


quartz 定时任务使用

        工作中难免会用都定时任务,如果公司针对定时任务没有特别的要求,分布式定时任务你可以选择开源的定时任务elastic-job,与spring结合简单方便(当然需要zookeeper的支持);但是如果你所在的公司针对部分开源不感冒,或者有自己的组件化团队,或者自研的定时任务框架还在研发中,那么你只能选择java自带的Timer,或者Quartz,或者Spring3.0以后自带的task。这里我们介绍下Quartz的使用,感觉应用还是比较广泛的的。

准备工作

引入以下jar包:spring-context-support、quartz
<!--定时任务-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>5.0.7.RELEASE</version>
    </dependency>

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

xml配置定时任务

  • java类:代码自定义的类,Job中业务逻辑
  • Job:任务job包括job需要的各种属性
  • Trigger:触发器定义job的执行规则,经常使用SimpleTrigger、CroTrigger
  • Scheduler:调度器管理Job、Trigger。一个Job可以有多个Trigger,一个Trigger只能对应一个Job
/**
 * @author yxf
 */
public class AdminJob {

    public void job1() {
        System.out.println("执行定时任务-job");
        try {
            System.out.println("定时任务执行中...");
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            System.out.println("定时任务-job执行异常");
        }
        System.out.println("执行定时任务-job 结束");
    }
}
<bean id="adminJob" class="com.yxf.job.AdminJob"/>

   <!--此处id值为需要执行的定时任务方法名-->
   <bean id="job1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
       <property name="targetObject" ref="adminJob"/>
       <property name="targetMethod" value="job1"/>
       <!--作业不并发调度-->
       <property name="concurrent" value="false"/>
   </bean>

   <!--此处为定时任务触发器-->
   <bean id="job1Trigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
       <property name="jobDetail" ref="job1"/>
       <property name="cronExpression" value="0/1 * * * * ?"/>
       <property name="description" value="job1定时任务触发器"/>
   </bean>

   <!-- 触发器 -->
<bean id="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
       <property name="triggers">
           <list>
               <ref bean="job1Trigger"/>
           </list>
       </property>
   </bean>

   <bean id="executor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
       <property name="corePoolSize" value="1"/>
       <property name="maxPoolSize" value="2"/>
       <property name="queueCapacity" value="2"/>
   </bean>

执行结果分析

--->代码中我们让线程睡了3s;定时任务我们配置的为每隔1s执行一次;目前是每隔3s执行一次

控制定时任务是否并发的配置,默认为true。当为true时同一个定时任务如果还未执行完,到时间点后还会再次开启;

       <!--作业不并发调度-->
      
<property name="concurrent" value="false"/>

    我们看下concurrent=true时的执行结果

其它方式-注解配置

<!--计划任务配置,用 @Service @Lazy(false)标注类,用@Scheduled(cron = "0 0 2 * * ?")标注方法-->
<task:annotation-driven/>

<!-- 自动扫描注解的bean -->
<context:component-scan base-package="com.yxf.job"/>

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!