2016-05-06 9 views
1

Ich versuche, Quarz 2.2.1 mit Spring Boot zu verwenden. Ich versuche, eine geplante Aufgabe zu deklarieren, die einige Daten in eine Datei schreiben soll. Mein Job ist, wie unten definiert:NullPointerException bei der Bereitstellung von Quarz im Frühjahr Boot

public class JobTask implements Job { 

@Autowired 
JobController controller; 

@Override 
public void execute(JobExecutionContext arg0) throws JobExecutionException { 

       try { 
        controller.doPrintData(); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
    } 
} 

Und dann:

public class StartJob { 

    public static void main(final String[] args) { 
    final SchedulerFactory factory = new StdSchedulerFactory(); 
    Scheduler scheduler; 
    try { 
     scheduler = factory.getScheduler(); 
     scheduler.start(); 
    } catch (SchedulerException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    } 


    try { 
     scheduler = factory.getScheduler(); 

     final JobDetailImpl jobDetail = new JobDetailImpl(); 
     jobDetail.setName("My job"); 
     jobDetail.setJobClass(JobTask.class); 

     final SimpleTriggerImpl simpleTrigger = new SimpleTriggerImpl(); 
     simpleTrigger.setStartTime(new Date(System.currentTimeMillis() + 5000)); 
     //simpleTrigger.setStartTime(dateOf(12, 58, 00,06,05,2016)); 
     simpleTrigger.setRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY); 
     simpleTrigger.setRepeatInterval(5000); 
     simpleTrigger.setName("Trigger execution every 5 secondes"); 

     scheduler.start(); 
     scheduler.scheduleJob(jobDetail, simpleTrigger); 

     System.in.read(); 
     if (scheduler != null) { 
     scheduler.shutdown(); 
     } 
    } catch (final SchedulerException e) { 
     e.printStackTrace(); 
    } catch (final IOException e) { 
     e.printStackTrace(); 
    } 
    } 
} 

PS: Ich habe meine Controller-Methode 'doPrintData' getestet und es funktioniert. Aber wenn ich es in die Execute-Methode im Blick auf die JavaNullPointerException.

+2

diese Anrufe zu neuen bedeutet diese Bohnen sind in Ihrer Verantwortung, nicht Spring. Sie stehen nicht unter der Kontrolle von Spring, also können Sie nicht erwarten, dass sie injiziert werden. – duffymo

+0

versuchen { JobController Controller = neue JobController(); controller.doGetDataFromBank(); } catch (Ausnahme e) { \t e.printStackTrace(); } Ich habe es auch versucht und lösche den Autowiring-Teil, vergeblich – Daniel

+0

Aufruf "neu" bedeutet "nicht Frühlingsproblem". Du machst es immer noch falsch. – duffymo

Antwort

3

Spring Boot verwaltet es für Sie. Entfernen Sie die Quarz Abhängigkeit und erstellen Sie einfach eine Service für geplante Ausführungen mit:

@Service 
public class JobScheduler{ 

    @Autowired 
    JobController controller; 

    //Executes each 5000 ms 
    @Scheduled(fixedRate=5000) 
    public void performJob() { 
     controller.doPrintData(); 
    } 
} 

und aktivieren Sie die Aufgabenplanung für Ihre Anwendung:

@SpringBootApplication 
@EnableScheduling 
public class Application { 

    public static void main(String[] args) throws Exception { 
     SpringApplication.run(Application.class); 
    } 
} 

Siehe auch:

2

Sie müssen SpringBeanJobFactory verwenden, um einen Job mit Spring 's autowired beans zu erstellen.

class AutowiringSpringBeanJobFactory extends SpringBeanJobFactory implements ApplicationContextAware { 
    private transient AutowireCapableBeanFactory beanFactory; 

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

    @Override 
    public Object createJobInstance(final TriggerFiredBundle bundle) throws Exception { 
     final Object job = super.createJobInstance(bundle); 
     beanFactory.autowireBean(job); //the magic is done here 
     return job; 
    } 
} 

Und dann, wenn Sie alle tun

SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory(); 
    scheduler = schedFact.getScheduler(); 

    AutowiringSpringBeanJobFactory autowiringSpringBeanJobFactory = new AutowiringSpringBeanJobFactory(); 
    autowiringSpringBeanJobFactory.setApplicationContext(applicationContext); 
    scheduler.setJobFactory(autowiringSpringBeanJobFactory); 
Verwandte Themen