Quartz不支持@autowired

jac*_*ack 5 spring quartz-scheduler

我使用DAO服务实现Quartz作业,如下所示:

public class InitialFetchFrequenceScheduleJob implements Job
{
    @Autowired
    private FetchFrequencyService fetchFrequencyService;

    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException
    {
        try
        {
            List<FetchFrequency> frequencies = this.fetchFrequencyService.findAll(FetchFrequency.class);
Run Code Online (Sandbox Code Playgroud)

问题是,当调用execute()方法时,this.fetchFrequencyService.findAll(FetchFrequency.class);将抛出NPE,因为fetchFrequenceService为null.我这里做错了什么?任何回复都非常感谢.谢谢!

P/s我使用的是Quartz 2.1.7

更新:这是FetchFrequencyServiceImpl:

@Service("fetchFrequencyService")
public class FetchFrequencyServiceImpl extends GenericDaoImpl implements FetchFrequencyService
{
}
Run Code Online (Sandbox Code Playgroud)

更新:代码实现作业:

JobDetail job = JobBuilder.newJob(InitialFetchFrequenceScheduleJob.class).build();
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.MINUTE, 1);
        Trigger trigger = TriggerBuilder.newTrigger().forJob(job).startAt(cal.getTime()).build();
        Scheduler scheduler = new StdSchedulerFactory("quartz.properties").getScheduler();
        scheduler.start();
        scheduler.scheduleJob(job, trigger);
Run Code Online (Sandbox Code Playgroud)

mar*_*son 6

@Autowired将不会在Quartz作业实现中工作,因为它不会被Spring实例化.为了在Quartz作业中掌握Spring管理的bean,您首先应该使用它org.springframework.scheduling.quartz.SchedulerFactoryBean来管理Quartz生命周期.使用此FactoryBean,您可以指定该applicationContextSchedulerContextKey属性以在调度程序上下文中引用提供给Quartz作业的ApplicationContext,例如:

<bean id="scheduler"
    class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="applicationContextSchedulerContextKey" value="applicationContext" />
    <!-- additional properties here -->
</bean>
Run Code Online (Sandbox Code Playgroud)

您现在可以ApplicationContext在作业中检索引用,然后从以下位置显式获取bean引用ApplicationContext:

@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
    ApplicationContext applicationContext = (ApplicationContext) executionContext
               .getScheduler().getContext().get("applicationContext");

    FetchFrequencyService service = applicationContext.getBean(FetchFrequencyService.class);

    // Start using your service.
}
Run Code Online (Sandbox Code Playgroud)


pap*_*tty -1

您必须使用以下注释之一来注释您的类

对于DAO

@存储库

服务

@服务

控制者

@控制器

所以你的服务类应该有下面的注释。

@Service("fetchFrequencyService")
public Class FetchFrequencyService {
}
Run Code Online (Sandbox Code Playgroud)

我认为您需要将应用程序上下文注入 SchedulerFactoryBean

<bean id="scheduler"
        class="org.springframework.scheduling.quartz.SchedulerFactoryBean"
        lazy-init="false">
        <property name="jobFactory">
            <bean class="org.springframework.scheduling.quartz.SpringBeanJobFactory" />
        </property>
        <property name="applicationContextSchedulerContextKey">
            <value>applicationContext</value>
        </property>
</bean>
Run Code Online (Sandbox Code Playgroud)