web-dev-qa-db-ja.com

Spring Bootアプリの起動後にメソッドを呼び出す

私は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からメソッドを呼び出すことができますか?

7
Sumit

アプリケーション全体がブートしてサンプルの下ですぐに使用できるようにしたい場合 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を使用します。

1
madz

特定のケースでは、アプリケーションのデプロイ後にデータベースをリセットする必要があるため、これを行うための最良の方法は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

0