美文网首页
quartz作业调度spring整合和实例

quartz作业调度spring整合和实例

作者: onlyHalfSoul | 来源:发表于2018-08-01 10:48 被阅读1次

    最近项目中要用到定时任务调度,几番查找决定使用quartz来实现,这里记录一下这个过程,备忘兼学习。

    maven引入

     <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-support</artifactId>
        <version>4.2.6.RELEASE</version>
      </dependency>
     <dependency>
        <groupId>org.quartz-scheduler</groupId>
        <artifactId>quartz</artifactId>
        <version>2.2.1</version>
    </dependency>
    

    spring整合

    用spring声明若干相关bean
    配置任务类:

    <!-- 配置要定时加载的目标类 -->
        <bean id="JobTestOne" class="com.trace.app.framework.utils.TaskTime.WarningTask"></bean>
        <bean id="JobTestOneDitail"
              class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
            <property name="targetObject" ref="JobTestOne"></property><!-- 指定任务类 -->
            <property name="targetMethod" value="run"></property><!-- 指定任务方法 -->
        </bean>
    

    配置触发器,这里使用日历式定时触发器:

    <!-- 定义时间间隔触发器 -->
        <bean id="JobTestOneTigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
            <property name="jobDetail" ref="JobTestOneDitail"></property>
            <property name="cronExpression">
                <value>0 0 0 * * ?</value><!--每天凌晨0:00执行定时任务-->
            </property>
        </bean>
    

    配置调度器:

    <!--调度器配置,list下可加入其他的调度器 -->
        <bean id="startJob" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
            <property name="triggers">
                <list>
                    <ref bean="JobTestOneTigger" />
                </list>
            </property>
        </bean>
    

    这样配置之后,只需要实现job任务即可完成定时任务调度工作。
    注意:

    1).org.springframework.scheduling.quartz.JobDetailBean有两个属性.

    jobClass属性即我们在java代码中定义的任务类.

    jobDataAsMap属性即该任务类中需要注入的属性值.

    2).Quartz的作业触发器有两种(两种任选其一就行)

    org.springframework.scheduling.quartz.SimpleTriggerFactoryBean:只支持按照一定频度调用任务,如每隔30分钟运行一次.

    org.springframework.scheduling.quartz.CronTriggerFactoryBean:支持到指定时间运行一次,如每天12:00运行一次等.

    关于第二种触发器的Cron表达式,请参见另一篇博客:摆脱Spring 定时任务的@Scheduled cron表达式的困扰

    3).org.springframework.scheduling.quartz.SchedulerFactoryBean的参数triggers指定的就是之前配置的触发器的名字.

    实现的需要调度的任务

    @Component
    public class WarningTask {
        @Resource(name = "CompanyServiceImpl")
        private CompanyService companyService;
        public void run() {
            System.out.println("检查门店订单有无异常任务开始执行");
            int endTime = TimeUtils.getTime();//当前时间戳,endTime;
            int lastDay = 15*24*60*60 ;//十五天总共的时间戳
            int startTime =endTime - lastDay ;//十五天前的时间戳,startTime;
    
            List<Company> list = companyService.getExceptionCompany(startTime,endTime);//查询有订单异常的公司
    
            companyService.AddOderWarning(list);//插入异常门店的信息
    
        }
    }
    

    只需要吧需要定时的任务写出来就可以了,这里是定时查询异常并添加异常记录操作。

    备注:Quartz属于重量级的定时任务框架,我们一般都会选择轻量级的如Spring Task定时任务进行开发,但是遇到比较棘手的,这也是一种解决问题的方式。

    相关文章

      网友评论

          本文标题:quartz作业调度spring整合和实例

          本文链接:https://www.haomeiwen.com/subject/bcjlvftx.html