2016-09-21 4 views
1

У меня есть работа с добавленным им компонентом. Я продолжаю пользоваться этим solution.Весна с кварцем, используя SchedulerFactoryBean в пользовательском сервисе

В этом решении триггер задания устанавливается во время конфигурации bean-компонента SchedulerFactoryBean в классе конфигурации.

Но я хочу запланировать его в своем обычном SchedulerService услуге colling scheduleTrackRetry метод.

Я пробую что-то вроде этого (см. Ниже), но работа не запускается в соответствующее время.

@Service 
public class SchedulerService { 

    @Autowired 
    SchedulerFactoryBean quartzScheduler; 

    @Autowired 
    JobDetailFactoryBean jobDetailFactoryBean; 

    @Autowired 
    CronTriggerFactoryBean cronTriggerFactoryBean; 

    public void scheduleTrackRetry() { 
    cronTriggerFactoryBean.setJobDetail(jobDetailFactoryBean.getObject()); 
    quartzScheduler.setTriggers(cronTriggerFactoryBean.getObject()); 
} 

Итак, пожалуйста, расскажите мне, как я мог добиться желаемого поведения?

Вот моя работа и конф классы:

@Component 
public class TrackRetryJob implements Job { 

    private static final Logger LOGGER = LoggerFactory.getLogger(TrackRetryJob.class); 

    @Autowired 
    private TimeformBatchService timeformBatchService; 

    @Override 
    public void execute(JobExecutionContext context) throws JobExecutionException { 
    LOGGER.info("Run retry for fetching greyhound tracks"); 
    timeformBatchService.consumeTracks(); 
    } 

} 

@Configuration 
public class QuartzConfig { 

    @Autowired 
    private ApplicationContext applicationContext; 

    @Bean 
    public SchedulerFactoryBean quartzScheduler() { 
    SchedulerFactoryBean quartzScheduler = new SchedulerFactoryBean(); 
    // custom job factory of spring with DI support for @Autowired! 
    AutowiringSpringBeanJobFactory jobFactory = new AutowiringSpringBeanJobFactory(); 
    jobFactory.setApplicationContext(applicationContext); 
    quartzScheduler.setJobFactory(jobFactory); 
    quartzScheduler.setTriggers(getTrigger().getObject()); 
    return quartzScheduler; 
    } 

    @Bean 
    public JobDetailFactoryBean retryTrackFetch() { 
    JobDetailFactoryBean jobDetailFactory = new JobDetailFactoryBean(); 
    jobDetailFactory.setJobClass(TrackRetryJob.class); 
    jobDetailFactory.setGroup("group1"); 
    return jobDetailFactory; 
    } 

    @Bean 
    public CronTriggerFactoryBean getTrigger() { 
    CronTriggerFactoryBean cronTriggerFactoryBean = new CronTriggerFactoryBean(); 
    cronTriggerFactoryBean.setJobDetail(retryTrackFetch().getObject()); 
    cronTriggerFactoryBean.setCronExpression("0 53 * * * ?"); 
    cronTriggerFactoryBean.setGroup("group1"); 
    return cronTriggerFactoryBean; 
    } 

} 

public final class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory implements ApplicationContextAware { 

    private transient AutowireCapableBeanFactory beanFactory; 

    @Override 
    public void setApplicationContext(final ApplicationContext context) { 
    beanFactory = context.getAutowireCapableBeanFactory(); 
    } 

    @Override 
    protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception { 
    final Object job = super.createJobInstance(bundle); 
    beanFactory.autowireBean(job); 
    return job; 
    } 
} 

ответ

1

Я нашел решение here

я не мог использовать SchedulerFactoryBean как обычный компонент. Когда я пытаюсь впрыснуть, весенняя инъекция Scheduler bean. Поэтому мой сервис должен выглядеть следующим образом:

@Service 
public class SchedulerService { 

    @Autowired 
    Scheduler scheduler; 

} 
Смежные вопросы