私はJavaサービスから非同期タスクを呼び出すスケジューラーを備えたSpring Bootアプリケーションを持っています。タスクは完了するまで数分(通常3〜5分)かかります。
Spring Boot Controllerから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();
}
}
スケジューラは非同期タスクを1時間ごとに実行しますが、ユーザーは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");
}
}
さて、問題は、さまざまな理由(アプリの再起動、その他のアプリケーションエラーなど)によってフラグがスタックすることがあるということです。
そのため、Spring Bootアプリケーションがデプロイされるたび、およびが再起動されるたびに、DBのフラグをリセットしたいと思います。
どうやってやるの? Spring Boot Applicationが起動した直後にメソッドを実行する方法はありますか?データベースからフラグを設定解除するために、Repoからメソッドを呼び出すことができますか?
アプリケーション全体がブートしてサンプルの下ですぐに使用できるようにしたい場合 from
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;
@Component
public class ApplicationStartup
implements ApplicationListener<ApplicationReadyEvent> {
/**
* This event is executed as late as conceivably possible to indicate that
* the application is ready to service requests.
*/
@Override
public void onApplicationEvent(final ApplicationReadyEvent event) {
// here your code ...
return;
}
} // class
単一のBeanの作成後にフックするだけで十分な場合は、@ loan Mによって提案されているように@PostConstruct
を使用します。
特定のケースでは、アプリケーションのデプロイ後にデータベースをリセットする必要があるため、これを行うための最良の方法はSpring CommandLineRunnerを使用することです。
Springブートは、CommanLineRunnerインターフェースにコールバックrun()メソッドを提供します。これは、Springアプリケーションコンテキストがインスタンス化された後、アプリケーションの起動時に呼び出すことができます。
CommandLineRunner Beanは同じアプリケーションコンテキスト内で定義でき、@ Orderedインターフェースまたは@Orderアノテーションを使用して注文できます。
@Component
public class CommandLineAppStartupRunnerSample implements CommandLineRunner {
private static final Logger LOG =
LoggerFactory.getLogger(CommandLineAppStartupRunnerSample .class);
@Override
public void run(String...args) throws Exception {
LOG.info("Run method is executed");
//Do something here
}
}
サイトからの回答: https://www.baeldung.com/running-setup-logic-on-startup-in-spring