2017-04-20 4 views
1

Ich benutze Spring Boot mit Thymeleaf.Spring Boot Hintergrund Job

Wenn der Benutzer auf die entsprechende Schaltfläche klickt, sendet er post requst und in der zugehörigen Controller-Methode gibt es eine Funktion, die 20 Minuten dauert. Diese Funktion gibt keinen Wert zurück.

Ich möchte nur diese Funktion im Hintergrund verarbeiten. Wenn die Anwendung die Zeile dieser Funktion erreicht, sollte sie Parameter an diese Funktion senden und die Verarbeitung fortsetzen, ohne auf eine Rückkehr zu warten.

Was ist die beste Vorgehensweise für diesen Fall?

Vielen Dank im Voraus.

UPDATE

Meine Config-Klasse

@Configuration 
@EnableAsync 
public class SpringAsyncConfig implements AsyncConfigurer{ 

@Bean(name = "ocrThread-") 
public Executor threadPoolTaskExecutor() { 
    return new ThreadPoolTaskExecutor(); 
} 

@Override 
public Executor getAsyncExecutor() { 
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); 
     executor.setCorePoolSize(2); 
     executor.setMaxPoolSize(2); 
     executor.setQueueCapacity(10); 
     executor.initialize(); 
     return executor; 
} 

@Override 
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { 
    // TODO Auto-generated method stub 
    return null; 
} 

}

Service-Klasse

@Service 
public class OcrService { 

@Async 
public String treadliOcr(List<String> liste, String kok) throws 
InterruptedException, IOException, TesseractException { 


..... 

} 

}

-Controller

@RequestMapping(value="/aktar", method= RequestMethod.POST) 
public String aktar(@RequestParam("belgeAdi") String belgeAdi, 
        @RequestParam("evrakTurId") String evrakTurId, 
        @RequestParam("kategoriId") String kategoriId, 
        @RequestParam("belgeTurId") String belgeTurId, 
        @RequestParam("firmaId") String firmaId, 
        @RequestParam("projeId") String projeId, 
        @RequestParam("aciklama") String aciklama) throws InterruptedException, IOException, TesseractException{ 

    Integer b = null; 
    Integer p = null; 
    String klasor = getInitYol(); 
    String belgeOnAd = belgeAdi.substring(0, 14); 
    BelgeIsimleri belgeIsimleri = new BelgeIsimleri(); 
    List<String> seciliListe = belgeIsimleri.seciliBelgeleriFiltrele(klasor, belgeOnAd); 

    for(String s:seciliListe){ 

     File file = new File (getInitYol()+s); 
     if(file.renameTo(new File("D:\\Done\\"+s))){ 
      file.delete(); 
      System.out.println(s+"yi sildi"); 
     }   


    } 



    OcrService ocr = new OcrService(); 
    String result=ocr.treadliOcr(seciliListe,getInitYol()); 
    System.out.println("Ocr dan döndü"); 


    Integer et = Integer.valueOf(evrakTurId); 
    Integer k = Integer.valueOf(kategoriId); 
    if(null==belgeTurId || "".equals(belgeTurId)){ 

    }else{ 
     b = Integer.valueOf(belgeTurId); 
    } 

    Integer f = Integer.valueOf(firmaId); 
    if(null==projeId || "".equals(projeId)){ 


    }else{ 
     p = Integer.valueOf(projeId); 
    } 

    belgeRepo.save(new BelgeEntity(et,k ,b , f ,p ,aciklama, result,belgeOnAd)); 


    return "redirect:/verigiris"; 
} 
+1

Vielleicht mit '@ Async'? Beispiel hier: https://spring.io/guides/gs/async-method/ –

+0

Ich habe dieses Handbuch bereits überprüft. Das Problem ist, dass es nicht nächste Zeile geht, bevor die @ Async-Methode ausgeführt wird. – Murmelto

Antwort

0

Frühling bietet Anmerkung Unterstützung für asynchrone Methodenausführung über @Async und @EnableAsync: https://spring.io/guides/gs/async-method/

+0

Ich habe diesen Leitfaden bereits überprüft. Das Problem ist, dass es nicht nächste Zeile geht, bevor die @ Async-Methode ausgeführt wird. – Murmelto

+0

Haben Sie die Anmerkung "@ EnableAsync" hinzugefügt? – Aboullaite

+0

Ich habe alle erforderlichen Anmerkungen hinzugefügt, aber es wartet immer noch Rückgabewert. Topic wird mit den aktuellen Werten aktualisiert. Es gibt jetzt einen Zeichenfolgenwert zurück. aber selbst es kehrt zurück, es wartet immer noch auf Methode für fertig. – Murmelto