最近公司业务需要用到Quartz,在集成使用的时候突然发现Job任务类中不可以自动注入spring管理的对象。在网上找了很多解决方法,基本上都是自定义JobFactory,通过 AutowireCapableBeanFactory 将创建好的 Job 对象交给 Spring 管理。但是我觉得过于繁琐,从而研究出以下方案:
思路:创建一个 Spring 工具类,在Job任务中使用Spring工具类获取Spring bean
Spring工具类(自行导包):
@Slf4j
@Component
public class SpringUtil implements ApplicationContextAware {
private static ApplicationContext context;
@Override
public void setApplicationContext(ApplicationContext context) throws BeansException {
SpringUtil.context = context;
}
/**
* 获取 Spring Bean
*
* @param clazz 类
* @param <T> 泛型
* @return 对象
*/
public static <T> T getBean(Class<T> clazz) {
if (clazz == null) {
return null;
}
return context.getBean(clazz);
}
/**
* 获取 Spring Bean
*
* @param bean 名称
* @param <T> 泛型
* @return 对象
*/
@SuppressWarnings("unchecked")
public static <T> T getBean(String bean) {
if (bean == null) {
return null;
}
return (T) context.getBean(bean);
}
/**
* 获取 Spring Bean
*
* @param beanName 名称
* @param clazz 类
* @param <T> 泛型
* @return 对象
*/
public static <T> T getBean(String beanName, Class<T> clazz) {
if (null == beanName || "".equals(beanName.trim())) {
return null;
}
if (clazz == null) {
return null;
}
return (T) context.getBean(beanName, clazz);
}
/**
* 获取上下文
*
* @return 上下文
*/
public static ApplicationContext getContext() {
if (context == null) {
throw new RuntimeException("There has no Spring ApplicationContext!");
}
return context;
}
/**
* 发布事件
*
* @param event 事件
*/
public static void publishEvent(ApplicationEvent event) {
if (context == null) {
return;
}
try {
context.publishEvent(event);
} catch (Exception ex) {
log.error(ex.getMessage());
}
}
}
Job任务类:
@Component
public class InventoryJob implements Job {
@Override
public void execute(org.quartz.JobExecutionContext jobExecutionContext) throws org.quartz.JobExecutionException {
InventoryEarlyWarningService inventoryEarlyWarningService = SpringUtil.getBean(InventoryEarlyWarningService.class);
inventoryEarlyWarningService.queryInventoryQuarz(1736679500400537603L);
}
}