2014-09-08 3 views
5

Я реализовать работу Quartz, используя услугу DAO, как показано ниже:Кварц не поддерживает @autowired

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

Проблема заключается в том, когда вызов выполнить() метод, то this.fetchFrequencyService.findAll(FetchFrequency.class); выбросит NPE, потому что fetchFrequenceService является недействительным. Я здесь что-то не так? Любой ответ очень ценится. Спасибо!

P/s Я использую Quartz 2.1.7

Обновление: Это FetchFrequencyServiceImpl:

@Service("fetchFrequencyService") 
public class FetchFrequencyServiceImpl extends GenericDaoImpl implements FetchFrequencyService 
{ 
} 

Update: Код реализации задания:

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); 
+0

Можете ли вы показать код, который вы используете для интеграции Spring с кварцем? – geoand

+0

Я обновил. – jack

+0

@geoand обновляемые – jack

ответ

-1

вы должны аннотировать классы с любой из следующих аннотаций

для DAO

@Repository

сервис

@Service

controlloer

@Controller

поэтому ваш класс обслуживания должен иметь нижнюю аннотацию.

@Service("fetchFrequencyService") 
public Class FetchFrequencyService { 
} 

я, что вам нужно, чтобы ввести контекст приложения в 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> 
+0

Спасибо за быстрый ответ, я обновил класс FetchFrequenceServiceImpl – jack

+0

вы все еще получаете NPE –

+0

да, я добавил @Repository к классу FetchFrequenceServiceImpl тоже, но NPE еще бывает :( – jack

5

@Autowired не будет работать в реализации заданий Quartz, потому что не будут создаваться с помощью Spring. Чтобы завладеть Spring-managed beans в Quartz job, вы должны в первую очередь использовать org.springframework.scheduling.quartz.SchedulerFactoryBean для управления жизненным циклом кварца. С помощью этого FactoryBean можно указать applicationContextSchedulerContextKey свойство иметь ссылку на ApplicationContext поставки на ваш Quartz работу в контексте планировщика, например:

<bean id="scheduler" 
    class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> 
    <property name="applicationContextSchedulerContextKey" value="applicationContext" /> 
    <!-- additional properties here --> 
</bean> 

Теперь вы можете получить ApplicationContext ссылку на свою работу, а затем явно получить ссылка боб из 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. 
} 
+0

Спасибо, но я не могу найти ApplicationContext. getBean(). Я использую spring 4.0.6 – jack

+0

ApplicationContext.getBean все еще присутствует в 4.x (определен в интерфейсе BeanFactory, который наследуется ApplicationContext). – marthursson

+0

Я сделал редактирование на вашем исполнении кодаКонтекст. peer. У вас есть контекст JobExecutionContext вместо JobExecutionContext executeContext –

1

, как вы используете Quartz не получает Spring участвовать в процессе на всех, и для этого никакой проводки зависимостей не происходит.

Я предлагаю вам взглянуть на this части официальной документации для основной информации о том, как интегрировать Spring с кварцем, а также this большого SO ответа

+0

спасибо, но я хочу, чтобы Trigger динамически не настраивался в xml-файле. – jack

+0

@doxuannam Хорошая точка! Я уверен, что вы могли бы взломать код и заставить его работать с динамическими триггерами – geoand

0

использование:

SpringBeanAutowiringSupport.processInjectBasedOnCurrentContext(this) 

в autowire ваши бобы в вашем кварцевом задании

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