• Quartz与Spring的整合使用


    之前说到过Quartz的基本使用(猛戳这里看文章)。在实际使用中,我们一般会将定时任务交由spring容器来管理。所以今天我们来说说Quartz与spring的整合。

    咱们还是依照Quartz的三大元素的顺序来聊聊整合使用。

    作业任务

    在spring中对于Quartz的作业任务管理主要提供了两种方式,JobDetailFactoryBean和MethodInvokingJobDetailFactoryBean,它们都在org.springframework.scheduling.quartz这个包下。以下我们来看看它们的使用。

    • JobDetailFactoryBean

    spring对这个类的解释为:A Spring FactoryBean for creating a Quartz JobDetail instance, supporting bean-style usage for JobDetail configuration.
    一个用于创建Quartz JobDetail实例的。支持以bean定义风格来配置JobDetail的工厂bean。

    对于在spring中的使用也是非常easy,首先我们须要创建一个详细的作业任务的实现类。使用JobDetailFactoryBean来管理作业任务时,我们的作业任务实现类须要继承QuartzJobBean类,并覆盖其executeInternal方法。就像以下这样。

    public class SimpleJob extends QuartzJobBean {
    
        @Override
        protected void executeInternal(JobExecutionContext arg0)
                throws JobExecutionException {
            System.out.println("如今时间为:"+new Date());
            //能够通过上下文获取到JobDataMap,这里面能够存放一些參数类型的数据
            JobDataMap dataMap=arg0.getMergedJobDataMap();
            String wish=(String) dataMap.get("wish");
            System.out.println(wish);
        }
    }

    然后就在spring容器中例如以下配置:

    <bean id="jobDetailFactoryBeanExample" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        <!-- 
            參考源代码。我们能够看到属性jobClass为Class类型。所以不能使用ref来引用一个bean。否则就会由于不能将bean转换为Class类型而出现异常。
            <property name="jobClass" ref="simpleJob"/>
            必须使用value对jobClass赋值。 
            <property name="jobClass" value="com.earl.quartz.spring.job.SimpleJob"/>    
        -->
        <property name="jobClass" value="com.earl.quartz.spring.job.SimpleJob"/>
        <!-- 这里设置的jobDataAsMap能够传递一些參数给作业任务 -->
        <property name="jobDataAsMap">
            <map>
                <entry key="wish" value="hello"/>
            </map>
        </property>
    </bean>
    • MethodInvokingJobDetailFactoryBean

    spring对这个类的解释:FactoryBean that exposes a JobDetail object which delegates job execution to a specified (static or non-static) method.
    这个FactoryBean提供JobDetail对象,这个对象能够指定作业任务的运行方法。

    由于能够指定作业调度时运行的内容,所以使用起来就比JobDetailFactoryBean更加的灵活方便。首先我们还是创建一个作业任务的详细实现类,这个实现类就不须要继承或实现其它的父类,仅仅须要将我们想要运行的作业任务声明在详细的方法中就可以。例如以下:

    public class ExampleJob{
    
        public void execute(){
            System.out.println("如今是"+new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒").format(new Date()));
        }
    
    }

    然后在spring容器中例如以下配置就可以:

    <!-- 
        假设两个触发器触发同一个作业,那么第二个作业可能在第一个作业完毕之前被触发。
        将作业类实现StatefulJob接口就能够避免这样的情况。
        将concurrent设置为false能够避免并发的发生。

    --> <!-- 使用MethodInvokingJobDetailFactoryBean来创建作业对象 --> <bean id="exampleJob" class="com.earl.quartz.spring.job.ExampleJob"/> <bean id="methodInvokingJobDetailFactoryBeanExample" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!-- 目标对象,指的是作业任务的实现类 --> <property name="targetObject" ref="exampleJob"/> <!-- 目标方法,指的是指定实现类中的哪个方法作为调度时的运行方法 --> <property name="targetMethod" value="execute"/> <!-- 是否并发 --> <property name="concurrent" value="false"/> </bean>

    以上就是作业任务的相关内容,以下我们来看看触发器这个可爱的小东东。

    触发器

    在spring中,触发器也分为simpleTrigger和cronTrigger。并且它们的使用也是非常easy,仅仅须要配置一个bean元素就可以。以下我们分别看看它们两者的配置:

    • simpleTrigger
    <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
        <!-- 这里的JobDetail指的就是我们配置的作业任务的bean -->
        <property name="jobDetail" ref="methodInvokingJobDetailFactoryBeanExample" />
        <!-- 延迟5秒開始 -->
        <property name="startDelay" value="5000"></property>
        <!-- 每3秒反复一次 -->
           <property name="repeatInterval" value="3000"></property>     
    </bean>
    • cronTrigger
    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <!-- 这里的JobDetail指的就是我们配置的作业任务的bean -->
        <property name="jobDetail" ref="jobDetailFactoryBeanExample"/>
        <!--cronExpression,cron表达式-->
        <property name="cronExpression" value="40 52 17 * * ?"/>
    </bean>

    以上就是触发器的基本配置。上述两个触发器的工厂bean另一些其它的属性,比如jobDataMap,priority等等。假设有须要,您能够參考相关的文档。

    调度程序

    最后,最简单的莫过于作业调度程序了,在spring中仅仅须要这样配置就可以:

    <bean id="startQuartz" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false">
        <!--指定使用哪些触发器。spring会去调度触发对应的触发器。进而对作业任务进行调度处理-->
        <property name="triggers">
            <list>
    <!--                <ref bean="simpleTrigger"/> -->
                <ref bean="cronTrigger"/>
            </list>
        </property>
    </bean>

    总结

    以上就是对Quartz与Spring的整合使用的基本介绍了。

    整体来说,Quartz的定时任务功能已经非常强大了,而spring对其的整合更是让程序猿在使用定时任务是如虎添翼。对于Quartz来说还有非常多其它的功能,比如定时文件扫描。定时发送邮件等等,之后在另外一篇文章中再进行详细介绍。

    猛戳这里下载源代码
    说明:本文介绍的是Quartz与Spring的整合使用,所以请參考源代码时关注com.earl.quartz.spring包下内容就可以,其它可自行忽略。

  • 相关阅读:
    构造方法
    方法调用时参数传递问题
    空指针异常
    Go安装,配置
    干货-MySQL
    websocket
    Tornado的使用
    socket客户端异步、socket服务端异步
    celery分布式队列实现:实时显示任务执行到哪一步
    celery+django实践
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7260672.html
Copyright © 2020-2023  润新知