quartz框架实现定时任务举例

  简单的定时任务功能可以通过原生的java.util.Timer定义执行时间规则、继承java.util.TimeTask来定义执行逻辑来实现,更方便的是利用开源的quartz框架,只需定义几个spring配置文件的bean,建一个定时任务执行逻辑类即可。这里通过一个maven项目实例介绍第二种方式:

  1、pom.xml引入quartz的jar包:

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

  2、定义spring配置文件

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
    xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd 
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
       http://code.alibabatech.com/schema/dubbo
       http://code.alibabatech.com/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

    <context:annotation-config />

    <bean id="PropertyConfig" class="com.inspur.chinanet.point.util.PropertiesConfigUtil">
        <property name="locations">
            <list>
                <value>classpath:global.properties</value>
            </list>
        </property>
        <property name="fileEncoding">
            <value>UTF-8</value>
        </property>
        <property name="ignoreResourceNotFound" value="true" />
        <property name="ignoreUnresolvablePlaceholders" value="true" />
    </bean>

    <bean id="jdbcImpl" class="com.wlf.net.point.dao.JdbcImpl" />

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource" />
    </bean>

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="${driver.class}" />
        <property name="url" value="${driver.url}" />
        <property name="username" value="${db.username}" />
        <property name="password" value="${db.password}" />
    </bean>

    <!-- 使用MethodInvokingJobDetailFactoryBean,任务类可以不实现Job接口,通过targetMethod指定调用方法 -->
    <bean id="taskJob" class="com.wlf.net.point.task.CirclePointTask" />
    <bean id="jobDetail"
        class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
        <property name="group" value="circle_point_group" />
        <property name="name" value="circle_point_update" />
        <!--false表示等上一个任务执行完后再开启新的任务 -->
        <property name="concurrent" value="false" />
        <property name="targetObject">
            <ref bean="taskJob" />
        </property>
        <property name="targetMethod">
            <value>run</value>
        </property>
    </bean>

    <!-- 调度触发器 -->
    <bean id="myTrigger"
        class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <property name="name" value="circle_point_update" />
        <property name="group" value="circle_point_group" />
        <property name="jobDetail">
            <ref bean="jobDetail" />
        </property>
        <property name="cronExpression">
            <value>0 0 2? * *</value>
        </property>
    </bean>

    <!-- 调度工厂 -->
    <bean id="scheduler"
        class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="myTrigger" />
            </list>
        </property>
    </bean>
</beans>

  这里配置的表达式是每天凌晨两点执行一次,指定定时任务实现类是CirclePointTask,方法是run。

  3、定时任务实现类

package com.wlf.net.point.task;

import java.io.IOException;
import java.sql.Date;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Logger;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;

import com.inspur.chinanet.point.dao.JdbcImpl;
import com.inspur.chinanet.point.util.DataUtil;
import com.inspur.chinanet.point.util.LogUtil;
import com.inspur.chinanet.point.util.PropertiesConfigUtil;
import com.vividsolutions.jts.io.ParseException;

/**
 * 定时任务实现类
 *
 * @author wulinfeng
 * @since 2018年1月29日*/
public class CirclePointTask
{
    private static final Logger LOG = Logger.getLogger("CirclePointTask");
    
    @Autowired
    private JdbcImpl jdbcImpl;
    
    /**
     * 定时任务执行方法
     *
     * @throws IOException
     * @throws ParseException
     */
    public void run()
        throws IOException, ParseException
    {
        // 手动模式,无需处理
        if ("0".equals(PropertiesConfigUtil.getProperty("isTimeTask")))
        {
            return;
        }
        
        long startTime = System.currentTimeMillis();
        try
        {
            // 处理日志
            LogUtil.dealLog(LOG);
            LOG.info("Start Task ***********************************");
            
            // 加载spring配置文件
            DataUtil.processData(jdbcImpl, getOrderDates());
        }
        catch (Exception e)
        {
            LOG.warning(e.getMessage());
        }
        
        LOG.info("End ***********************************");
        LOG.info("Cost time: " + (System.currentTimeMillis() - startTime) / 1000 + " second.");
    }
    
    /**
     * 获取order_date列表
     *
     * @return
     * @throws java.text.ParseException
     */
    private List<Date> getOrderDates()
        throws java.text.ParseException
    {
        List<java.sql.Date> orderDates = new ArrayList<>();
        String orderDateStr = PropertiesConfigUtil.getProperty("order_date_list");
        if (StringUtils.isEmpty(orderDateStr))
        {
            orderDates.add(new java.sql.Date(System.currentTimeMillis()));
        }
        else
        {
            LOG.info("The ORDER_DATE configed is : " + orderDateStr);
            String[] orderDateList = orderDateStr.split(",");
            for (String orderDate : orderDateList)
            {
                orderDates.add(DataUtil.strToDate(orderDate));
            }
        }
        return orderDates;
    }
    
}

  从上面可以清晰的看到,quartz框架基本上只需要配置以下4个bean:

  1、定时任务实现类:taskJob;

  2、定时任务信息:jobDetail,主要信息包括,定时任务组group,定时任务名name,是否并发执行concurrent,执行目标targetObject(关联taskJob),执行方法名targetMethod;

  3、定时任务调度触发器:myTrigger,同上,触发器组group,触发器名name,触发的定时任务jobDetail(关联上面jobDetail),触发时间规则cronExpression;

  4、定时任务调度工厂:scheduler,关联调度触发器myTrigger。

  以上4个bean从具体到上层,环环相扣,调用机制都由quartz框架实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值