Quartz scheduler 如何使用JobDetailFactoryBean注释方式在QuartzJobBean中注入Spring DAO类

Quartz scheduler 如何使用JobDetailFactoryBean注释方式在QuartzJobBean中注入Spring DAO类,quartz-scheduler,spring-4,Quartz Scheduler,Spring 4,如何在QuartzJobBean中注入SpringDAO类,我正在使用配置类级别实例化的JobDetailFactoryBean。我使用的是Spring4 Quartz 2.2.1注释方式 QuartzJobBean已扩展为执行 您的问题是Quartz对您的配置类一无所知,因此它无法自动连接未知bean。 转到SchedulerConfig.java并将您的服务或DAO声明为自动连接,然后使用jobdata并映射此对象,以便在Quartz中传递。然后您可以在Quartz的executeInt

如何在QuartzJobBean中注入SpringDAO类,我正在使用配置类级别实例化的JobDetailFactoryBean。我使用的是Spring4 Quartz 2.2.1注释方式

QuartzJobBean已扩展为执行


您的问题是Quartz对您的配置类一无所知,因此它无法自动连接未知bean。 转到SchedulerConfig.java并将您的服务或DAO声明为自动连接,然后使用jobdata并映射此对象,以便在Quartz中传递。然后您可以在Quartz的executeInternal方法中使用它。 比如说

@Configuration 
public class mplampla{ 
@Autowired
private YourDAO dao;
@Bean
public JobDetailFactoryBean jobDetailFactoryBean(){
    JobDetailFactoryBean factory = new JobDetailFactoryBean();
    Map<String,Object> map = new HashMap<String,Object>();
    map.put("YourDAO", dao);
    factory.setJobDataAsMap(map);
    return factory;
}
}
如果您将@Service类和YourDAO类用作@Transational,请小心,您将得到关于未声明Bean的错误。在这种情况下,您必须通过刀的接口

@PersistJobDataAfterExecution
@DisallowConcurrentExecution
@Service
public class SchedulerService extends QuartzJobBean {

    @Autowire
    public SchedulerDAO schDAO;

    protected void executeInternal(JobExecutionContext ctx) throws JobExecutionException {

        System.out.println("---SchedulerService .executeInternal ----");

        try {
            init(ctx.getJobDetail().getJobDataMap(), 
            ctx.getScheduler().getContext());
        } catch (SchedulerException e) {
            e.printStackTrace();
        }

        // I want to do DAO methods used here - how to do that? 
        // Can get access to DAO
        schDAO.getSomeMethods();
    }
}
@Configuration 
public class mplampla{ 
@Autowired
private YourDAO dao;
@Bean
public JobDetailFactoryBean jobDetailFactoryBean(){
    JobDetailFactoryBean factory = new JobDetailFactoryBean();
    Map<String,Object> map = new HashMap<String,Object>();
    map.put("YourDAO", dao);
    factory.setJobDataAsMap(map);
    return factory;
}
}
public class YourJob extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext ctx) throws JobExecutionException {
    JobDataMap dataMap = ctx.getJobDetail().getJobDataMap();
    YourDAO dao = (YourDAO) dataMap.get("YourDAO");
    dao.getMethods();
}
}