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";
}
Vielleicht mit '@ Async'? Beispiel hier: https://spring.io/guides/gs/async-method/ –
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