2017-02-13 9 views
0

私のSpringブートアプリケーションでは、バックグラウンドでいくつかのタスクを実行しようとしています。Java Spring Boot - 非同期db操作のためのCommandLineRunnerは、バックグラウンドで実行されます。

1つのデータベースからデータを取得し、それを別のデータベースに格納すると、30分ごとに格納されます。

@Asyncでこれを処理するCommandLineRunnerクラスを作成するのは正しいでしょうか?

@Component 
public class UpdateDB implements CommandLineRunner { 

@Autowired 
private WagerBoardMarksRepo loadRepo; 

@Autowired 
private StoreDbEntRepo storeRepo; 

@Async 
private static void update() { 
    while (true) { 

     // get data from loadRepo. 
     // save data to storeRepo 

     try { 
      Thread.sleep("sleep for 30min"); // 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

@Override 
public void run(String... args) throws Exception { 
    update(); 
} 

}

+0

これは最初に内部メソッド呼び出し(AOPのプロキシのために動作しないため)では機能しません。次に、 '@ Async'を' static'メソッドに適用することはできません。だから、それは単に動作しません。 '@ Scheduled'はそのために考案されたもので、自分自身を再度作成しようとはしません。大量のデータがある場合は、Spring Batchと組み合わせることを検討してください。 –

答えて

0

あなたはあなたのアプリケーションにSpring batchを導入するの恩恵を受ける可能性があります。現在、ジョブが失敗したときに何が起きるか、同時に処理されるアイテムの数、マルチスレッド環境で実行されるアイテムの数など、バッチで何が起こるかをたくさん管理する必要はありません。あなたはWagerBoardMarksRepoから読み込むItemReaderを作成することができます春のバッチと

、あなたの出力にあなたのエンティティを変換しItemProcessorStoreDbEntRepo内のアイテムを格納ItemWriter。すべてを説明すると広すぎますが、開始するにはreference guideを読むことができます。

30分ごとにタスクをスケジュールするには、@Scheduled annotationを使用します。 fixedDelayを設定し、バッチジョブを実行させるだけです。あるいは、cron構文を使用して遅延を指定することもできます。

例:

@Scheduled(fixedDelay = 1800000) // 1000 millis * 1800 seconds = 30 minutes 
public void doBatch() throws JobParametersInvalidException, JobExecutionAlreadyRunningException, JobRestartException, JobInstanceAlreadyCompleteException { 
    jobLauncher.run(batchJob, new JobParametersBuilder().toJobParameters()); 
} 
1

スケジューラは、このような動作のために作られているが、

@Component 
public class ScheduledTasks { 
    @Scheduled(cron = "0 0,30 * * * * ?") 
    public void update() { 
     // get data from loadRepo. 
     // save data to storeRepo 
    } 
} 

以下のコードを参照してくださいそして、あなたのスタートアップクラスで@EnableSchedulingを使用することを忘れていけない

@SpringBootApplication 
@EnableScheduling 
public class Application { 

    public static void main(String[] args) throws Exception { 
     SpringApplication.run(Application.class); 
    } 
} 

参照してください。詳細は春のScheduling Tasksドキュメントをご覧ください。

関連する問題