Spring4.X+Quartz2.X无法自动注入bean问题

2024-05-08 14:38

本文主要是介绍Spring4.X+Quartz2.X无法自动注入bean问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Quartz是目前非常流行的任务框架,一般用来做定时任务。
但是在QuartzJobBean中无法使用注解自动注入bean。
需要达到的效果:

    @Resourceprivate  IAlumniService alumniService;

原因是因为Job对象的实例化过程是在Quartz中进行的,bean是在Spring容器当中的,那么如何将他们关联到一起呢?
Quartz提供了JobFactory接口,让我们可以自定义实现创建Job的逻辑。那么我们通过实现JobFactory 接口,在实例化Job以后,在通过ApplicationContext 将Job所需要的属性注入即可。
重写JobFactory

/*** Created by XFL.* time on 2016/10/4 23:13* description:自定义JobFactory以便在JobBean中可以获取Spring注解的bean*/
public class MyJobFactory extends AdaptableJobFactory {/*** 这个对象Spring会帮我们自动注入进来,也属于Spring技术范畴.*/private AutowireCapableBeanFactory capableBeanFactory;/*** 注入capableBeanFactory.* @param capableBeanFactory AutowireCapableBeanFactory*/@Autowiredpublic MyJobFactory(final AutowireCapableBeanFactory capableBeanFactory) {Assert.notNull(capableBeanFactory, "自动注入AutowireCapableBeanFactory失败");this.capableBeanFactory = capableBeanFactory;}/*** 重写该方法,以便在quartz中可以获取注解的bean.* @param bundle TriggerFiredBundle* @return 返回实例(Spring bean)* @throws Exception 异常*/protected final Object createJobInstance(final TriggerFiredBundle bundle) throws Exception {//调用父类的方法Object jobInstance = super.createJobInstance(bundle);//进行注入,这属于Spring的技术,不清楚的可以查看Spring的API.capableBeanFactory.autowireBean(jobInstance);return jobInstance;}
}

Spring-quartz配置文件,这里只考虑单机部署,未考虑集群,分布式部署。如需要集群部署需要更改此文件,在bean quartzScheduler中需要加入datascore,quartz集群配置文件等等。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns="http://www.springframework.org/schema/beans"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><bean name="quartzScheduler"class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><property name="jobFactory" ref="myJobFactory"/><property name="triggers"><list><ref bean="trigger" /></list></property></bean><!--任务--><bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"><property name="jobClass" value="com.jxufe.schedule.task.QuartzTestJobBean"/><property name="durability" value="true" /><property name="requestsRecovery" value="true" /></bean><!--触发器--><bean id="trigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"><property name="jobDetail" ref="jobDetail" /><property name="cronExpression" value="0 0/5 * * * ?" /></bean><bean id="myJobFactory" class="com.jxufe.schedule.task.MyJobFactory"/>
</beans>

任务

public class QuartzTestJobBean extends QuartzJobBean {/*** Log4j2 日志对象.*/private static final Logger logger = LogManager.getLogger(QuartzTestJobBean.class);/*** 注入alumniService.*/@Resourceprivate  IAlumniService alumniService;/*** 测试定时任务.* @param jobExecutionContext 定时任务* @throws JobExecutionException 抛出异常*/@Overrideprotected final void executeInternal(final JobExecutionContext jobExecutionContext) throws JobExecutionException {logger.info("执行定时任务QuartzTestJobBean");System.out.println("执行定时任务");//  SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);Map<String, Object> parameterMap = new HashMap<>();//获取beanif (alumniService != null) {List<Map<String, Object>> result = alumniService.findAlumni(parameterMap);if (result != null) {logger.info("获取的大小" + result.size());}}logger.info("执行定时任务完毕QuartzTestJobBean");}
}

还有一种解决办法是在任务中加入,使用这种方法可以不需要重写JobFactory

SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);

注意:以上方法如果使用构造函数注入,是仍然不行的
使用到的框架包
Spring基础包,SpringMVC框架包
spring-context-support,quartz,quartz-jobs

这篇关于Spring4.X+Quartz2.X无法自动注入bean问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/970597

相关文章

mybatis和mybatis-plus设置值为null不起作用问题及解决

《mybatis和mybatis-plus设置值为null不起作用问题及解决》Mybatis-Plus的FieldStrategy主要用于控制新增、更新和查询时对空值的处理策略,通过配置不同的策略类型... 目录MyBATis-plusFieldStrategy作用FieldStrategy类型每种策略的作

linux下多个硬盘划分到同一挂载点问题

《linux下多个硬盘划分到同一挂载点问题》在Linux系统中,将多个硬盘划分到同一挂载点需要通过逻辑卷管理(LVM)来实现,首先,需要将物理存储设备(如硬盘分区)创建为物理卷,然后,将这些物理卷组成... 目录linux下多个硬盘划分到同一挂载点需要明确的几个概念硬盘插上默认的是非lvm总结Linux下多

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

Python Jupyter Notebook导包报错问题及解决

《PythonJupyterNotebook导包报错问题及解决》在conda环境中安装包后,JupyterNotebook导入时出现ImportError,可能是由于包版本不对应或版本太高,解决方... 目录问题解决方法重新安装Jupyter NoteBook 更改Kernel总结问题在conda上安装了

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

解决jupyterLab打开后出现Config option `template_path`not recognized by `ExporterCollapsibleHeadings`问题

《解决jupyterLab打开后出现Configoption`template_path`notrecognizedby`ExporterCollapsibleHeadings`问题》在Ju... 目录jupyterLab打开后出现“templandroidate_path”相关问题这是 tensorflo

如何解决Pycharm编辑内容时有光标的问题

《如何解决Pycharm编辑内容时有光标的问题》文章介绍了如何在PyCharm中配置VimEmulator插件,包括检查插件是否已安装、下载插件以及安装IdeaVim插件的步骤... 目录Pycharm编辑内容时有光标1.如果Vim Emulator前面有对勾2.www.chinasem.cn如果tools工

最长公共子序列问题的深度分析与Java实现方式

《最长公共子序列问题的深度分析与Java实现方式》本文详细介绍了最长公共子序列(LCS)问题,包括其概念、暴力解法、动态规划解法,并提供了Java代码实现,暴力解法虽然简单,但在大数据处理中效率较低,... 目录最长公共子序列问题概述问题理解与示例分析暴力解法思路与示例代码动态规划解法DP 表的构建与意义动

Java多线程父线程向子线程传值问题及解决

《Java多线程父线程向子线程传值问题及解决》文章总结了5种解决父子之间数据传递困扰的解决方案,包括ThreadLocal+TaskDecorator、UserUtils、CustomTaskDeco... 目录1 背景2 ThreadLocal+TaskDecorator3 RequestContextH

关于Spring @Bean 相同加载顺序不同结果不同的问题记录

《关于Spring@Bean相同加载顺序不同结果不同的问题记录》本文主要探讨了在Spring5.1.3.RELEASE版本下,当有两个全注解类定义相同类型的Bean时,由于加载顺序不同,最终生成的... 目录问题说明测试输出1测试输出2@Bean注解的BeanDefiChina编程nition加入时机总结问题说明