2016-08-30 13 views
1

Spring Bootで特定のメソッドの進捗状況を報告したいと考えています。私は、私は現在の状態を保存し、現在のビューとして返し別々のクラスを使用: それは次のようになります。Spring Boot Progress report

public class SearchTableReloadState { 

    //STATIC STORAGE 

    public static long TABLE_ROW_COUNT = 0; 
    public static long CURRENT_OFFSET = 0; 
    public static long CURRENT_LIMIT = 0; 
    public static long DEFAULT_LIMIT = 20000; 

    public static void reset() { 
     TABLE_ROW_COUNT = 0; 
     CURRENT_OFFSET = 0; 
     CURRENT_LIMIT = DEFAULT_LIMIT; 
    } 

    public static void setDefaultLimit(long defaultLimit) { 
     DEFAULT_LIMIT = defaultLimit; 
    } 

    // VIEWMODEL 
    public long tableRowCount = 0; 
    public long currentOffset = 0; 
    public long currentLimit = 0; 

    public static SearchTableReloadState getState() { 
     SearchTableReloadState reloadState = new SearchTableReloadState(); 
     reloadState.tableRowCount = TABLE_ROW_COUNT; 
     reloadState.currentOffset = CURRENT_OFFSET; 
     reloadState.currentLimit = CURRENT_LIMIT; 
     return reloadState; 
    } 
} 

および方法:

@RequestMapping(value = {"/manage/searchtable/reload/state"}, method = RequestMethod.GET) 
public @ResponseBody SearchTableReloadState searchTableReloadState() { 
    return SearchTableReloadState.getState(); 
} 

@ResponseStatus(HttpStatus.OK) 
    @RequestMapping(value = {"/manage/searchtable/reload"}, method = RequestMethod.GET) 
    public void searchTableReload() throws ResourceAlreadyExistsException, ParameterMissingIdException { 
    SearchTableReloadState.reset(); 
    SearchTableReloadState.TABLE_ROW_COUNT = productDataReferenceDao.countJobReferences(); 
    productDataReferenceDao.truncateSearchTable(); 
    while (SearchTableReloadState.CURRENT_OFFSET < SearchTableReloadState.TABLE_ROW_COUNT) { 
      ... long running task 
      .... 
      SearchTableReloadState.CURRENT_OFFSET += SearchTableReloadState.CURRENT_LIMIT; 
     } 
} 

方法/状態となり現在の状態を報告するので、サイトでAjaxを呼び出すことができます。問題は、長時間実行した場合、長時間実行が完了しないと状態レポート要求は完了しません。私は、Springがリクエストごとに別々のスレッドを使用すると考えました。 Springでスレッディングを実装する必要はありますか?

長時間実行するプロセスで@Asyncアノテーションを使用した場合、期待どおりに機能しますが、まだ理解していません。

+0

私はそれがそのようにうまくいくと思ういけないいいえ、あなたはどこか別の問題を持っていますが、あなたが言及した方法で動作しますdoesntのそれは、あなたが春のログを開き、ここでそれらを投稿してください可能性があることを確認します。春のアペンダーにスレッドIDを追加して、リクエストを処理するために別のスレッドを使用することを確認することができる場合は – AntJavaDev

+0

どうすればSpringブートのログにアクセスできますか?私はそれをIDEで実行していますので、実行中のプロセスがコンソールウィンドウに表示される内容を意味していますか? – appl3r

+0

はい、あなたはlog4jを使用していますか? – AntJavaDev

答えて

0

長時間かかると思われるメソッドで@Async注釈を使用すると、そのリクエストを呼び出すHTTPリクエストがすぐに応答し、バックグラウンドで実行され、私が期待したとおりに状態メソッドを呼び出すことができます。動作しているにもかかわらず、私はまだそれが非同期実行なしに動作しない理由を知らない。

あなたが@Asyncアノテーションを使用したい場合は、あなたが@SpringBootApplicationおよび/または@EnableAutoConfigurationを使用するクラスに@EnableAsync注釈を配置する必要があります。

私は誰かが、後に、より良い答えを提供することができます願っています。