• 欢迎访问本网站,技术教程,资源分享,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站,欢迎加入东蓬莱!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏东部蓬莱吧

Quartz定时任务Job中无法注入spring bean的解决方案

后台开发 XiaoWang 1年前 (2020-06-18) 573次浏览 0个评论 扫描二维码

使用spring 结合quartz进行定时任务开发时,如果直接在job内的execute方法内使用service 或者mapper对象,执行时,出现空指针异常。

问题原因

job对象在spring容器加载时候,能够注入bean,但是调度时,job对象会重新创建,此时就是导致已经注入的对象丢失,因此报空指针异常。

解决方案

  • 方案1:重写JobFactory类
  • @Component
    public class JobFactory extends SpringBeanJobFactory {
    
        @Autowired
        private AutowireCapableBeanFactory beanFactory;
    
        /**
         * 这里覆盖了super的createJobInstance方法,对其创建出来的类再进行autowire。
         *
         * @param bundle
         * @return
         * @throws Exception
         */
        @Override
        protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
            Object jobInstance = super.createJobInstance(bundle);
            beanFactory.autowireBean(jobInstance);
            return jobInstance;
        }
    }
    

    在spring配置文件内配置SchedulerFactoryBean,使用刚才自定义的JobFactory
    此时在job中直接注入bean即可

    @Component
    @DisallowConcurrentExecution
    public class TestSuitJob implements Job {
        @Autowired
        private TestSuitService testSuitService;
    }
    
  • 方案2:静态工具类
  • 创建工具类SpringContextJobUtil,实现ApplicationContextAware接口,此工具类会在spring容器启动后,自动加载,使用其提供的getBean方法获取想要的bean即可

    @Component
    public class SpringContextJobUtil implements ApplicationContextAware  {
    
        private static ApplicationContext context;
    
        @Override
        @SuppressWarnings("static-access" )
        public void setApplicationContext(ApplicationContext contex)
                throws BeansException {
            // TODO Auto-generated method stub
            this.context = contex;
        }
        public static Object getBean(String beanName){
            return context.getBean(beanName);
        }
    
        public static String getMessage(String key){
            return context.getMessage(key, null, Locale.getDefault());
        }
    }
    

    在job内直接调用静态方法

    testSuitService = (TestSuitService) SpringContextJobUtil.getBean("testSuitService");
    
  • 方案3:使用SpringBeanAutowiringSupport
  • public class FtpStateJob implements Job {
    
        @Autowired
        private FTPService ftpService;
    
        @Override
        public void execute(JobExecutionContext jobExecutionContext) {
            //解决无法注入bean的问题
            SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
        }
    }
    

    东部蓬莱 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
    转载请注明原文链接:Quartz定时任务Job中无法注入spring bean的解决方案
    喜欢 (0)
    [支付宝]
    分享 (0)
    发表我的评论
    取消评论
    表情 贴图 加粗 删除线 居中 斜体 签到

    Hi,您需要填写昵称和邮箱!

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址