【问题标题】:How to inject Spring DAO class in QuartzJobBean, using JobDetailFactoryBean Annotated wayQuartzJobBean中如何注入Spring DAO类,使用JobDetailFactoryBean注解方式
【发布时间】:2016-05-04 20:34:36
【问题描述】:

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

@Configuration
public class SchedulerConfig {
    @Bean
    public JobDetailFactoryBean jobDetailFactoryBean() {
        JobDetailFactoryBean factory = new JobDetailFactoryBean();
        factory.setJobClass(SchedulerService.class);

        //Should I inject DAO here?

        factory.setGroup("mygroup");
        factory.setName("myjob");
        return factory;
    }
}

QuartzJobBean 被扩展执行

@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();
    }
}

【问题讨论】:

    标签: quartz-scheduler spring-4


    【解决方案1】:

    您的问题是 Quartz 对您的配置类一无所知,因此它无法自动装配未知 bean。 转到 SchedulerConfig.java 并将您的服务或 DAO 声明为自动装配,然后使用作业数据并映射此对象以便在 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;
    }
    }
    

    然后在你的 YourJob.java 中

    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();
    }
    }
    

    如果您使用@Service 类和YourDAO 类作为@Transational,请注意,您将收到有关未声明的Bean 的错误。在这种情况下,您必须传递您的 DAO 的接口。

    【讨论】:

      猜你喜欢
      • 2012-10-17
      • 2011-04-22
      • 1970-01-01
      • 2012-01-01
      • 1970-01-01
      • 2017-04-07
      • 1970-01-01
      • 2018-04-19
      • 2013-01-15
      相关资源
      最近更新 更多