spring整合quartz实现定时任务

pom文件

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.akane.test</groupId>
  <artifactId>test-quartz</artifactId>
  <version>1.0.0</version>
  <packaging>jar</packaging>
  <name>test-quartz</name>

   <properties>
      <springframework.version>4.0.6.RELEASE</springframework.version>
      <quartz.version>2.2.1</quartz.version>
   </properties>

   <dependencies>
      <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-core</artifactId>
         <version>${springframework.version}</version>
      </dependency>
      <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-context-support</artifactId>
         <version>${springframework.version}</version>
      </dependency>
      <!-- Transaction dependency is required with Quartz integration -->
      <dependency>
         <groupId>org.springframework</groupId>
         <artifactId>spring-tx</artifactId>
         <version>${springframework.version}</version>
      </dependency>
      
      <!-- Quartz framework -->
      <dependency>
         <groupId>org.quartz-scheduler</groupId>
         <artifactId>quartz</artifactId>
         <version>${quartz.version}</version>
      </dependency>

   </dependencies>
</project>


XML配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
                       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

    <context:component-scan base-package="com.akane.test.quartz"/>

    <!--简单任务:调度某个对象的某个方法,使用MethodInvokingJobDetailFactoryBean,
    任务类可以不实现Job接口,通过targetMethod指定调用方法-->
    <bean id="simpleJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="targetObject" ref="testQuartz1"/>
        <property name="targetMethod" value="testSimpleDetail"/>
        <!--false表示等上一个任务执行完后再开启新的任务-->
        <property name="concurrent" value="false"/>
    </bean>

    <!--复杂任务:调度带依赖对象的Job任务-->
    <bean name="complexJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        <!--TestQuartz1继承QuartzJobBean,实现了Job接口-->
        <!--Quartz的默认JobFactory实现在job被实例化的时候会自动调用set方法将依赖对象注入-->
        <property name="jobClass" value="com.akane.test.quartz.TestQuartz1"/>
        <!--JobDataMap是Java Map接口的一个实现,可以包含不限量的(序列化的)数据对象-->
        <!--JobDataMap里的数据可以通过executeInternal函数的JobExecutionContext参数取出
        就本例而言,Map里的对象和通过set注入的对象其实是同一个-->
        <property name="jobDataMap">
            <map>
                <entry key="complexDetailInvoker" value-ref="complexDetailInvoker"/>
            </map>
        </property>
        <!--如果一个job是非持久的,当没有活跃的trigger与之关联的时候,会被自动地从scheduler中删除。
        也就是说,非持久的job的生命期是由trigger的存在与否决定的-->
        <property name="durability" value="true"/>
    </bean>


    <!--简单触发器: 延迟1秒启动,每隔2秒执行一次,任务执行完要5秒,间隔2秒,不允许并发执行的情况下会等任务执行完
    再开启下次任务-->
    <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
        <property name="jobDetail" ref="simpleJobDetail"/>
        <!--延迟1秒启动-->
        <property name="startDelay" value="1000"/>
        <!--每隔2秒执行一次-->
        <property name="repeatInterval" value="2000"/>
    </bean>


    <!-- 带cron表达书的触发器:每隔5秒执行一次 -->
    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="jobDetail" ref="complexJobDetail"/>
        <property name="cronExpression" value="0/5 * * * * ? "/>
    </bean>


    <!-- 调度器工厂bean通过jobdetail和trigger生成调度器 -->
    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="jobDetails">
            <list>
                <ref bean="simpleJobDetail"/>
                <ref bean="complexJobDetail"/>
            </list>
        </property>

        <property name="triggers">
            <list>
                <ref bean="simpleTrigger"/>
                <ref bean="cronTrigger"/>
            </list>
        </property>
    </bean>

</beans>


测试类

@Component("testQuartz1")
public class TestQuartz1 extends QuartzJobBean {

    //要注入的对象
    private ComplexDetailInvoker complexDetailInvoker;

    //必须提供set方法
    public void setComplexDetailInvoker(ComplexDetailInvoker complexDetailInvoker) {
        this.complexDetailInvoker = complexDetailInvoker;
    }
    //简单任务直接执行
    public void testSimpleDetail(){
        for (int i = 1; i <=5 ; i++) {
            System.out.println("simple quartz-test invoke "+i+" time");
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        //JobDataMap中获取要执行的任务对象
        ComplexDetailInvoker complexDetailInvoker = (ComplexDetailInvoker) context.getJobDetail().getJobDataMap().get("complexDetailInvoker");
        complexDetailInvoker.testComplexDetail();
        //通过set方法注入的任务对象
        this.complexDetailInvoker.testComplexDetail();
        //查看是否是同一个对象
        System.out.println(complexDetailInvoker==this.complexDetailInvoker);
    }
}

测试类依赖对象

@Component("complexDetailInvoker")
public class ComplexDetailInvoker {
    public void testComplexDetail(){
        System.out.println("complex quartz-test!");
    }
}


测试启动类

public class AppMain {
    public static void main(String[] args) {
        final ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("classpath:spring-quartz.xml");
    }
}

测试结果

simple quartz-test invoke 5 time
simple quartz-test invoke 1 time
simple quartz-test invoke 2 time
simple quartz-test invoke 3 time
complex quartz-test!
complex quartz-test!
true
simple quartz-test invoke 4 time
simple quartz-test invoke 5 time
simple quartz-test invoke 1 time
complex quartz-test!
complex quartz-test!
true
simple quartz-test invoke 2 time
simple quartz-test invoke 3 time
simple quartz-test invoke 4 time
simple quartz-test invoke 5 time
simple quartz-test invoke 1 time
complex quartz-test!
complex quartz-test!
true
simple quartz-test invoke 2 time
simple quartz-test invoke 3 time
simple quartz-test invoke 4 time
simple quartz-test invoke 5 time
complex quartz-test!
complex quartz-test!
true
simple quartz-test invoke 1 time
simple quartz-test invoke 2 time

参考资料

Spring 4 + Quartz Scheduler Integration Example

转载于:https://my.oschina.net/u/2529036/blog/626517

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值