无法在 Apache isis quartz 中注入服务

Unable to inject service in Apache isis quartz

我在我的 apache isis 项目中使用 quartz 进行调度。我有一个 class MyJob 实现 org.quartz.Job 并且它有方法执行,当调度程序在给定时间触发时调用。

我的问题是,我有一个 class DemoService 并且它有一个方法 showDemo() 我想从执行方法中调用它。 但是当调度程序运行时,它会在 demoService.showDemo().

处抛出 Null Pointer Exception

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

这是代码:-

public class MyJob implements Job {

    @Inject
    DemoService demoService;

    public MyJob() {

    }

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

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

Incode Platform 的 quartz 作业使用此技术来 运行 后台命令,参见 here; the quartz module 从 quartz 的角度(我想你已经明白了)展示了这一点。

HTH 旦

试试这个

您需要使用 SpringBeanJobFactory 来使用 Spring 的自动装配 bean 创建作业。

class 自动装配SpringBeanJobFactory 扩展 SpringBeanJobFactory 实现 ApplicationContextAware { 私人瞬态 AutowireCapableBeanFactory 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);