スミット:
私は、タスクが完了するまでに数分を(通常は3-5mins)かかりサービスからの非同期タスクを呼び出すスケジューラを持つJava春ブートアプリケーションを持っています。
サービスから同じ非同期メソッドも春のブートコントローラからAPIを呼び出すことによって、UIアプリケーショントラフと呼ばれることができます。
コード:
スケジューラ
@Component
public class ScheduledTasks {
@Autowired
private MyService myService;
@Scheduled(cron = "0 0 */1 * * ?")
public void scheduleAsyncTask() {
myService.doAsync();
}
}
サービス
@Service
public class MyService {
@Async("threadTaskExecutor")
public void doAsync() {
//Do Stuff
}
}
コントローラ
@CrossOrigin
@RestController
@RequestMapping("/mysrv")
public class MyController {
@Autowired
private MyService myService;
@CrossOrigin
@RequestMapping(value = "/", method = RequestMethod.POST)
public void postAsyncUpdate() {
myService.doAsync();
}
}
スケジューラは、非同期タスク毎時間実行されますが、ユーザーはUIから手動で実行することができます。
しかし、私はそれが実行の途中ですでにある場合は非同期メソッドを再度実行する必要はありません。
そのために、私は、メソッドが実行されているときに行くと、それは方法の完了後にオフされるフラグが含まれているDB内のテーブルを作成しました。
私のサービスクラスでは、このような何か:
@Autowired
private MyDbRepo myDbRepo;
@Async("threadTaskExecutor")
public void doAsync() {
if (!myDbRepo.isRunning()) {
myDbRepo.setIsRunning(true);
//Do Stuff
myDbRepo.setIsRunning(false);
} else {
LOG.info("The Async task is already running");
}
}
さて、問題は、フラグは、時には様々な理由(アプリの再起動、他のいくつかのアプリケーションエラーなど)が原因立ち往生ということです
だから、私はDBに春のブートアプリケーションがデプロイされるたびにフラグをリセットしたいといつでも再起動があります。
どうやってやるの?国連は、データベース内のフラグを設定するために、私は私のレポからメソッドを呼び出すことができる場所からちょうど春ブートアプリケーションが起動した後、メソッドを実行するためのいくつかの方法がありますか?
ジョン・M:
ここでは、たとえばため@PostConstructをチェックhttps://www.baeldung.com/running-setup-logic-on-startup-in-spring