Spring quartz定时任务的配置与使用

来源:互联网 发布:周朝放弃关中 知乎 编辑:程序博客网 时间:2024/06/05 13:29
  • Maven引入quartz的jar包
<dependency>    <groupId>org.quartz-scheduler</groupId>    <artifactId>quartz</artifactId>    <version>2.2.2</version></dependency>
  • 创建JobFactory 接口的实现类:用来实例化Job,为了在定时任务中使用@Autowired注入service对象,若不实例化,会导致@Autowired注入为null。
package com.wx.app.ygp.dbyc.task.jobs;import org.quartz.spi.TriggerFiredBundle;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.config.AutowireCapableBeanFactory;import org.springframework.scheduling.quartz.SpringBeanJobFactory;/** *  * @ClassName: QuartzJobFacotry  * @author: huangjp * @date: 2017年4月10日 下午6:49:23 */public class QuartzJobFacotry extends SpringBeanJobFactory{    @Autowired    private AutowireCapableBeanFactory beanFactory;    @Override    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {        Object jobInstance = super.createJobInstance(bundle);        beanFactory.autowireBean(jobInstance);        return jobInstance;    }}
  • 定时任务的配置文件:spring-task.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.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">    <context:component-scan base-package="com.wx.app.ygp.dbyc.task"/>    <!-- 大表远传定时任务 -->    <bean id="largeTableFarTransferJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">        <property name="jobClass" value="com.wx.app.ygp.dbyc.task.jobs.LargeTableFarTransferJobImpl"></property>    </bean>    <!-- 大表远传定时任务的触发时间-->    <bean id="largeTableFarTransferTriggerBean" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">        <property name="jobDetail" ref="largeTableFarTransferJob"></property>        <property name="cronExpression" value="0 */3 * * * ?"></property>  <!-- 设置每三分钟执行一次-->    </bean>    <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">        <property name="triggers">            <list>                <ref bean="largeTableFarTransferTriggerBean"/>            </list>        </property>        <property name="jobFactory">            <bean class="com.wx.app.ygp.dbyc.task.jobs.QuartzJobFacotry" />   <!-- 实例化Job-->        </property>        <property name="quartzProperties">            <props>                <prop key="org.quartz.scheduler.instanceName">DBYC-QuartzScheduler</prop>            </props>        </property>    </bean></beans>
  • web.xml中引入spring-task.xml:
<context-param>    <param-name>contextConfigLocation</param-name>    <param-value>        classpath:spring-core.xml;        classpath:spring-mybatis.xml;        classpath:spring-task.xml;   <!-- 定时任务 -->        classpath:spring-dbyc.xml    </param-value></context-param>
  • 配置都做完了,可以开始写定时任务的类了:
 package com.wx.app.ygp.dbyc.task.jobs;import java.util.Calendar;import java.util.Date;import java.util.List;import org.quartz.Job;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;@Servicepublic class LargeTableFarTransferJobImpl implements Job{    private static final Logger log = LoggerFactory.getLogger(LargeTableFarTransferJobImpl.class);    @Autowired    private LargeTableFarTransferService largeTableFarTransferService;    @Override    @Transactional    public void execute(JobExecutionContext context) throws JobExecutionException {        Calendar nowC = Calendar.getInstance();        log.info("大表远传定时任务开始");        List<LargeTableFarTransferEntity> tableList = largeTableFarTransferService.getLargeTableList();        log.info("执行大表远传的定时任务,大表的数量是{}",tableList.size());        .....}

至此,一个简单的定时任务框架已经搭好了,之前做过若干个定时任务,但都是在前人搭好的框架下,只做实现部分,经过这次开发独立小项目的机会,全面的认识了定时任务的框架及实现流程。

备注:Spring QuartZ Cron表达式

0 0