2017-04-20 28 views
1

私は春のブートをThymeleafで使用しています。春のブートのバックグラウンドジョブ

ユーザーが関連ボタンをクリックすると、投稿要求が送信され、関連するコントローラメソッドには20分かかる機能があります。この関数は値を返しません。

この機能をバックグラウンドで処理したいだけです。アプリケーションがこの関数の行に来ると、この関数にパラメータを送信し、戻りを待つことなく処理を続ける必要があります。

このケースのベストプラクティスは何ですか?

事前に感謝します。

UPDATE

私のconfigクラス

@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クラス

@Service 
public class OcrService { 

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


..... 

} 

}

コントローラ

@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

多分 'Async' @と?ここの例:https://spring.io/guides/gs/async-method/ –

+0

このガイドはすでに確認済みです。問題は、@Asyncメソッドが完了する前に次の行に移動しないということです。 – Murmelto

答えて

0

春は@Async@EnableAsyncを経由して非同期メソッドを実行するためのアノテーションのサポートを提供します:https://spring.io/guides/gs/async-method/

+0

私はすでにこのガイドをチェックしています。問題は、@Asyncメソッドが完了する前に次の行に移動しないということです。 – Murmelto

+0

'@ EnableAsync'アノテーションを追加しましたか? – Aboullaite

+0

私は必要な注釈をすべて追加しましたが、戻り値value.topicが現在の値で更新されるのを待っています。今すぐ文字列の値を返しています。しかし、それはまだそれを完了するためのメソッドを待って空を返します。 – Murmelto

関連する問題