如何通过Quartz在JAVA中实现依赖注入并添加定时任务?

2026-05-16 02:221阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1288个文字,预计阅读时间需要6分钟。

如何通过Quartz在JAVA中实现依赖注入并添加定时任务?

最近在写定时任务,之前没有接触过。查了一些资料,了解到可以使用quartz定时框架。需要配置文件:config-quartz.xml,相关配置如下(红色部分是后来添加的):

+xmlversion=2.0 xmlns=http://www.springframework.org/schema/beans xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation=http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd>

SchedulerInstance AUTO org.quartz.simpl.SimpleThreadPool 10 50 org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.impl.jdbcjobstore.StdJDBCDelegate dataSource 60000 QRTZ_

如何通过Quartz在JAVA中实现依赖注入并添加定时任务?

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

需要配置文件:config-quartz.xml

相关配置如下(红色部分是之后添加的,在后面步骤会说明):

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="www.springframework.org/schema/beans" xmlns:xsi="www.w3.org/2001/XMLSchema-instance" xmlns:context="www.springframework.org/schema/context" xsi:schemaLocation=" www.springframework.org/schema/beans www.springframework.org/schema/beans/spring-beans-3.2.xsd www.springframework.org/schema/context www.springframework.org/schema/context/spring-context-3.2.xsd www.springframework.org/schema/task 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="www.springframework.org/schema/beans" xmlns:xsi="www.w3.org/2001/XMLSchema-instance" xmlns:context="www.springframework.org/schema/context" xsi:schemaLocation=" www.springframework.org/schema/beans www.springframework.org/schema/beans/spring-beans-3.2.xsd www.springframework.org/schema/context www.springframework.org/schema/context/spring-context-3.2.xsd www.springframework.org/schema/task 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>

到这为止,成功!

以上这篇JAVA使用quartz添加定时任务,并依赖注入对象操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持易盾网络。

本文共计1288个文字,预计阅读时间需要6分钟。

如何通过Quartz在JAVA中实现依赖注入并添加定时任务?

最近在写定时任务,之前没有接触过。查了一些资料,了解到可以使用quartz定时框架。需要配置文件:config-quartz.xml,相关配置如下(红色部分是后来添加的):

+xmlversion=2.0 xmlns=http://www.springframework.org/schema/beans xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation=http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd>

SchedulerInstance AUTO org.quartz.simpl.SimpleThreadPool 10 50 org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.impl.jdbcjobstore.StdJDBCDelegate dataSource 60000 QRTZ_

如何通过Quartz在JAVA中实现依赖注入并添加定时任务?

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

需要配置文件:config-quartz.xml

相关配置如下(红色部分是之后添加的,在后面步骤会说明):

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="www.springframework.org/schema/beans" xmlns:xsi="www.w3.org/2001/XMLSchema-instance" xmlns:context="www.springframework.org/schema/context" xsi:schemaLocation=" www.springframework.org/schema/beans www.springframework.org/schema/beans/spring-beans-3.2.xsd www.springframework.org/schema/context www.springframework.org/schema/context/spring-context-3.2.xsd www.springframework.org/schema/task 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="www.springframework.org/schema/beans" xmlns:xsi="www.w3.org/2001/XMLSchema-instance" xmlns:context="www.springframework.org/schema/context" xsi:schemaLocation=" www.springframework.org/schema/beans www.springframework.org/schema/beans/spring-beans-3.2.xsd www.springframework.org/schema/context www.springframework.org/schema/context/spring-context-3.2.xsd www.springframework.org/schema/task 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>

到这为止,成功!

以上这篇JAVA使用quartz添加定时任务,并依赖注入对象操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持易盾网络。