3

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

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

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

这是代码: -

public class MyJob implements Job {

    @Inject
    DemoService demoService;

    public MyJob() {

    }

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

2 回答 2

1

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

Incode 平台的石英作业使用此技术运行后台命令,请参见此处石英模块从石英的角度展示了这一点(我认为你已经弄清楚了)。

HTH丹

于 2017-09-25T14:01:38.227 回答
0

在 Spring Boot 中部署 Quartz 时试试这个NullPointerException

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

类 AutowiringSpringBeanJobFactory 扩展 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);
于 2017-09-25T22:00:22.517 回答