解决quartz的Job类中使用注解Service为null的办法

项目中需要继承Quartz框架。项目的环境是SSM框架,spring4.3,Quartz1.6版本,Intellij IDEA 2017.1
遇到的问题是:在quartz的Job中使用@Autowired自动注入service时候报错,报service为null。
原先代码如下:

public class XXXJob implements Job{
	@AutoWired
	XXXService xxxService;
	@Override
	public void execute(JobExecutionContext jobContext) throws JobExecutionException{
		System.out.println(xxxService.getResult());
	}
}

原来在非spring容器里面调用service的方法需要使用工具类获取service,ApplicationContext.getBean(“xxxService”)
然后写了工具类之后,又报出no bean named ‘xxxService’ available,没脾气,还是获取不到这个service,再去网上搜索Quartz的Job类中如何使用service,搜了一大堆相同的方法,比如什么配置AdaptableJobFactory,试了都没有用,还是报错。最后根据下面两个博客的内容整合之后,可以使用service了。
如何在Java Filter 中注入 Service
ServletContextListener使用

最后代码如下:
QuartzServletContextListener 代码如下:

public class QuartzServletContextListener extends Q
要将自定义的 Quartz Job 集成到 Spring 容器中并实现自动装配功能,可以通过以下方式完成。这种方法的核心在于使用 `JobFactory` 接口来自定义 Job 的实例化逻辑,并确保这些 Job 实例能够访问由 Spring 管理的 Bean。 ### 自定义 Job 工厂 首先需要创建一个继承 `AdaptableJobFactory` 或者直接实现 `JobFactory` 接口,从而覆盖默认的行为以支持 Spring 容器中的依赖注入。下面是一个典型的例子: ```java import org.quartz.spi.TriggerFiredBundle; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationContext; import org.springframework.scheduling.quartz.SpringBeanJobFactory; public class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory { @Autowired private transient ApplicationContext applicationContext; @Override protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception { final Object job = super.createJobInstance(bundle); applicationContext.getAutowireCapableBeanFactory().autowireBean(job); // 将 Job 注入 Spring 上下文中 return job; } } ``` 此代码片段展示了如何扩展 `SpringBeanJobFactory` 来实现对 Job 型对象的自动装配[^1]。 ### 设置 Scheduler Factory Bean 接着,在配置文件中设置 `SchedulerFactoryBean` 并指定刚才创建好的工厂作为它的属性之一: ```java @Bean public SchedulerFactoryBean schedulerFactoryBean() { SchedulerFactoryBean factory = new SchedulerFactoryBean(); AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory(); jobFactory.setApplicationContext(applicationContext); factory.setJobFactory(jobFactory); return factory; } ``` 这段 Java Config 示例设置了自定义的 JobFactory 到 Scheduler 中,使得所有的 Jobs 均能被 Spring 所管理[^3]。 ### 创建 JobDetail 和触发器 之后就可以像平常一样定义 JobDetails 以及 Triggers 。例如: ```java @DisallowConcurrentExecution public class MyCustomJob implements Job { @Autowired private SomeService someService; @Override public void execute(JobExecutionContext context) throws JobExecutionException { System.out.println("Executing custom job with service: " + (someService != null)); } } ``` 这里的 `MyCustomJob` 是一个普通的 Spring 组件,其中包含了一个通过 `@Autowired` 注解标记的服务字段。由于之前已经完成了必要的配置工作,因此该服务会被正确初始化[^2]。 最后一步便是安排好相应的调度计划即可正常运作整个体系结构了。 --- ###
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值