有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java无法在Apache isis quartz中注入服务

我在ApacheISIS项目中使用quartz进行调度。我有一个实现org的类MyJob。石英作业,它有方法execute,当调度程序在给定时间触发时调用该方法

我的问题是,我有一个类DemoService,它有一个方法showDemo(),我想从execute方法调用它。 但是当调度程序运行时,它在demoService.showDemo()处抛出空指针异常

我无法在该类中注入任何服务。它总是给NPE。如何将服务注入MyJob

代码如下:-

public class MyJob implements Job {

    @Inject
    DemoService demoService;

    public MyJob() {

    }

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
        demoService.showDemo();
    }
}

共 (2) 个答案

  1. # 1 楼答案

    试试这个NullPointerException while deploying Quartz in Spring Boot

    您需要使用SpringBeanJobFactory使用Spring的自动连接bean创建作业

    类AutowiringSpringBeanJobFactory扩展SpringBeanJobFactory实现ApplicationContextAware{ 私人瞬时自动连线beanFactory beanFactory

    public void setApplicationContext(final ApplicationContext context) {
        beanFactory = context.getAutowireCapableBeanFactory();
    }
    
    @Override
    public Object createJobInstance(final TriggerFiredBundle bundle) throws Exception {
       final Object job = super.createJobInstance(bundle);
       beanFactory.autowireBean(job);  //the magic is done here
       return job;
    }
    

    } 然后当你这么做的时候

    SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();
    scheduler = schedFact.getScheduler();
    
    AutowiringSpringBeanJobFactory autowiringSpringBeanJobFactory = new AutowiringSpringBeanJobFactory();
    autowiringSpringBeanJobFactory.setApplicationContext(applicationContext);
    scheduler.setJobFactory(autowiringSpringBeanJobFactory);
    
  2. # 2 楼答案

    最简单的方法是将要运行的逻辑放在AbstractIsisSessionTemplate的子类中,然后从quartz作业中实例化并执行它

    Incode平台的quartz作业使用这种技术来运行后台命令,请参见here;这个quartz module从石英的角度显示了这一点(我想你已经弄明白了)

    嗯 丹