JAVA使用quartz添加定时任务,并依赖注入对象操作
最近在写定时任务,以前没接触过。查了些相关资料说使用quartz定时框架。
需要配置文件:config-quartz.xml
相关配置如下(红色部分是之后添加的,在后面步骤会说明):
quartz.properties
#============================================================================ #ConfigureMainSchedulerProperties #============================================================================ org.quartz.scheduler.instanceName=WrhFrameScheduler org.quartz.scheduler.instanceId=AUTO org.quartz.scheduler.skipUpdateCheck=true #============================================================================ #ConfigureThreadPool #============================================================================ org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool org.quartz.threadPool.threadCount=12 org.quartz.threadPool.threadPriority=5 #============================================================================ #ConfigureJobStore #============================================================================ 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 #============================================================================ #ConfigureDatasources #============================================================================ #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文件引入即可:
然后写测试类开始测试定时任务:
packagecom.wy.care60.job; importcom.wy.care60.dao.MElementMapper; importcom.wy.care60.dao.MInterEnumMapper; importcom.wy.care60.dao.MProjectMapper; importcom.wy.care60.model.MInterEnum; importcom.wy.care60.model.MProject; importorg.apache.tools.ant.Project; importorg.quartz.JobExecutionContext; importorg.quartz.JobExecutionException; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.scheduling.quartz.QuartzJobBean; importorg.springframework.stereotype.Component; importjavax.annotation.Resource; importjava.text.ParseException; importjava.text.SimpleDateFormat; importjava.util.Date; importjava.util.List; /** *CreatedbyAdministratoron2017/12/20. */ @Component publicclassHealthPlanJobextendsQuartzJobBean{ @Autowired MProjectMappermProjectMapper; @Override publicvoidexecuteInternal(JobExecutionContextjobExecutionContext)throwsJobExecutionException{ System.out.println(newDate()); } }
发现时间可以打印出来,证明定时任务成功开启;但是同时也发现了一个问题,就是依赖注入的mProjectMapper值为null。
开始以为是Spring的原因,导致注解失败,后来查了相关资料发现,不是Spring的原因,而是因为:这个Job是由quartz实例化出来的,不受Spring的管理,所以就导致注入失败。解决办法是自己new一个类,让Spring实例化这个类,代码如下
importorg.quartz.spi.TriggerFiredBundle; importorg.springframework.beans.factory.annotation.Autowired; importorg.springframework.beans.factory.config.AutowireCapableBeanFactory; importorg.springframework.scheduling.quartz.AdaptableJobFactory; publicclassMyJobFactoryextendsAdaptableJobFactory{ @Autowired privateAutowireCapableBeanFactorycapableBeanFactory; protectedObjectcreateJobInstance(TriggerFiredBundlebundle)throwsException{ //调用父类的方法 ObjectjobInstance=super.createJobInstance(bundle); capableBeanFactory.autowireBean(jobInstance); returnjobInstance; } }
然后把这个类配置到Spring中去,(config-quartz.xml中红色部分)
然后在把org.springframework.scheduling.quartz.SchedulerFactoryBean的jobFactory设置成我们自己的。(config-quartz.xml中红色部分)
config-quartz.xml完整版如下:
到这为止,成功!
以上这篇JAVA使用quartz添加定时任务,并依赖注入对象操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持毛票票。