2016-10-05 3 views
1

Ich baue eine Spring 4 Rest API für eine Handelsautomatisierung Website.Zeitplan Aufgabe für bestimmte Zeit von Frühling 4 web mvc

Eine HTTP-Anfrage enthält einige Informationen zusammen mit einem Datum-Uhrzeit. Nach dem Einfügen dieser Informationen in die Datenbank (mit Hibernate), muss ich dynamisch einen neuen Cron-Job erstellen, der auf diese Datenbankinformationen zugreifen und etwas tun wird. Der Cron-Job muss zum oben angegebenen Zeitpunkt ausgeführt werden.

Es wird also keinen festen Cron-Ausdruck geben, auch die Cron-Task muss auf meine mit @Repository gekennzeichnete DAO-Schicht zugreifen. Auch nach dem Verweisen viel Post im Stapel und anderen Blog, die über @Scheduled, Spring-Quartz-Integration erzählt, konnte ich keine Lösung für meine spezifischen Bedürfnisse finden.

Die Java/Annotation-Konfiguration wird bevorzugt.

Bitte helfen. Dank

Antwort

0

Sie Trigger und TaskScheduler Schnittstellen verwenden können. Beispiel unten. Um den Job in der Zukunft abzubrechen, muss die ScheduledFuture Instanz gespeichert werden.

@Configuration 
public class AppConfiguration { 

    @Bean 
    public ThreadPoolTaskScheduler taskScheduler() { 
     return new ThreadPoolTaskScheduler(); 
    } 
} 

@Controller 
public class TriggerService { 

    @Autowired 
    private TaskScheduler scheduler; 

    @Autowired 
    private DAOService db; 

    private ScheduledFuture job;   

    @GetMapping("/task1") 
    @ResponseBody 
    public void triggerMyTask(@RequestParam String cronExpression) { 

     Runnable runnable = new Runnable() {    
      @Override 
      public void run() { 
       log.info(new Date()); 
       /** 
       * here You can do what You want with db 
       * using some DAOService 
       */   
       db.count(); 
      } 
     }; 

     /** 
     * cancel current task if You need 
     */ 
     if(job != null) { 
      job.cancel(true); 
     } 

     CronTrigger trigger = new CronTrigger(cronExpression); 
     job = scheduler.schedule(runnable, trigger); 
    } 
} 

Sie können Cron-Ausdruck zum Beispiel wie das passieren:

http://localhost:8080/task1?cronExpression=0/5%20*%20*%20*%20*%20* 
+0

Danke für Ihre ausführliche Antwort. Habe meinen Tag gerettet !! –

+0

Nicht die Trigger-Schnittstelle, aber ** org.springframework.scheduling.TaskScheduler.schedule (Runnable arg0, Datum arg1) ** Methode tatsächlich für mich gearbeitet. 'final Langer Schlüssel = transDao.saveTransaction (transObj); \t \t \t \t \t \t Runnable runnable = new Runnable() { \t \t \t Privat lang id = Schlüssel; public void run() { \t \t taskService.executeTask (id); } }; ' Die Taskservice autowired ist, und es ist transaktions, so dass ich mein Transaktionsobjekt mit dem _ID_ Wert zugreifen kann. –

+0

'scheduler.schedule (runnable, exeTime);' wobei exeTime genau 'java.util.Date' von der http-Anfrage ist –