JAVA使用quartz添加定时任务,并依赖注入对象

本文介绍如何使用Quartz框架配置定时任务,包括配置文件详解、解决依赖注入问题及自定义JobFactory。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在写定时任务,以前没接触过。查了些相关资料说使用quartz定时框架。


需要配置文件:config-quartz.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-3.2.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.2.xsd
		   http://www.springframework.org/schema/task
		   http://www.springframework.org/schema/task/spring-task-3.0.xsd">



			<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
				<property name="schedulerName" value="rqmis"></property>
				<property name="applicationContextSchedulerContextKey" value="applicationContextKey" />
				<property name="configLocation" value="classpath:quartz.properties" />
				<property name="autoStartup" value="true"></property>
				
				<property name="triggers">
					<list>
					
						<bean class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
							
							<property name="cronExpression" value="0 0 0 * * ?"></property>
							<property name="jobDetail">
								<bean class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
									<property name="jobClass" value="com.wy.care60.job.HealthPlanJob" />
								</bean>
							</property>
						</bean>
					</list>
				</property>
			</bean>
		<!--</property>
	</bean>-->

</beans>


quartz.properties

#============================================================================
# Configure Main Scheduler Properties  
#============================================================================

org.quartz.scheduler.instanceName = WrhFrameScheduler
org.quartz.scheduler.instanceId = AUTO

org.quartz.scheduler.skipUpdateCheck = true

#============================================================================
# Configure ThreadPool  
#============================================================================

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 12
org.quartz.threadPool.threadPriority = 5

#============================================================================
# Configure JobStore  
#============================================================================

org.quartz.jobStore.misfireThreshold = 60000

org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

#org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
#org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
#org.quartz.jobStore.useProperties = false
#org.quartz.jobStore.dataSource = myDS
#org.quartz.jobStore.tablePrefix = QRTZ_
#org.quartz.jobStore.isClustered = false

#============================================================================
# Configure Datasources  
#============================================================================

#org.quartz.dataSource.myDS.driver = org.postgresql.Driver
#org.quartz.dataSource.myDS.URL = jdbc:postgresql://localhost/dev
#org.quartz.dataSource.myDS.user = jhouse
#org.quartz.dataSource.myDS.password = 
#org.quartz.dataSource.myDS.maxConnections = 5


最后spring-mvc.xml配置文件中奖quartz.xml文件引入即可:

 <import resource="config-quartz.xml"></import>


然后写测试类开始测试定时任务:

package com.wy.care60.job;

import com.wy.care60.dao.MElementMapper;
import com.wy.care60.dao.MInterEnumMapper;
import com.wy.care60.dao.MProjectMapper;
import com.wy.care60.model.MInterEnum;
import com.wy.care60.model.MProject;
import org.apache.tools.ant.Project;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

/**
 * Created by Administrator on 2017/12/20.
 */
@Component
public class HealthPlanJob extends QuartzJobBean {

    @Autowired
    MProjectMapper mProjectMapper;

    @Override
    public void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println(new Date());
        
    }


}

发现时间可以打印出来,证明定时任务成功开启;但是同时也发现了一个问题,就是依赖注入的mProjectMapper值为null。

开始以为是Spring的原因,导致注解失败,后来查了相关资料发现,不是Spring的原因,而是因为:这个Job是由quartz实例化出来的,不受Spring的管理,所以就导致注入失败。解决办法是自己new一个类,让Spring实例化这个类,代码如下

import org.quartz.spi.TriggerFiredBundle;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
import org.springframework.scheduling.quartz.AdaptableJobFactory;


public class MyJobFactory extends AdaptableJobFactory {

   
    @Autowired
    private AutowireCapableBeanFactory capableBeanFactory;

    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        //调用父类的方法
        Object jobInstance = super.createJobInstance(bundle);
        capableBeanFactory.autowireBean(jobInstance);
        return jobInstance;
    }

}

然后把这个类配置到Spring中去,(config-quartz.xml中红色部分)

<bean id="jobFactory" class="com.wy.care60.job.MyJobFactory"></bean>

然后在把org.springframework.scheduling.quartz.SchedulerFactoryBean的jobFactory设置成我们自己的。(config-quartz.xml中红色部分)

<bean name="MyScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
  <!-- 其他属性省略 -->
  <property name="jobFactory" ref="jobFactory"></property>
</bean>

config-quartz.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-3.2.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.2.xsd
		   http://www.springframework.org/schema/task
		   http://www.springframework.org/schema/task/spring-task-3.0.xsd">



	<bean id="jobFactory" class="com.wy.care60.job.MyJobFactory"></bean>
			<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
				<property name="schedulerName" value="rqmis"></property>
				<property name="applicationContextSchedulerContextKey" value="applicationContextKey" />
				<property name="configLocation" value="classpath:quartz.properties" />
				<property name="autoStartup" value="true"></property>
				<property name="jobFactory" ref="jobFactory"></property>
				<property name="triggers">
					<list>
		
						<bean class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
							
							<property name="cronExpression" value="0 0 0 * * ?"></property>
							<property name="jobDetail">
								<bean class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
									<property name="jobClass" value="com.wy.care60.job.HealthPlanJob" />
								</bean>
							</property>
						</bean>
					</list>
				</property>
			</bean>
		<!--</property>
	</bean>-->

</beans>


到这为止,成功!

时间比较急,随便写写记录一下。




评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值