私はSpring Boot
を使用していますが、データベースに存在する値を使用してcron task
をスケジュールする際に問題があります。
当分の間、私は以下のようなプロパティファイルから値を読んでいます:
@Scheduled(cron= "${time.export.cron}")
public void performJob() throws Exception {
// do something
}
これはうまく機能しますが、プロパティファイルから値を取得する代わりに、データベーステーブルから値を取得する必要があります。それは可能ですか?
beanを追加して、SpringBootApplicationメインクラスまたは任意の構成クラスのデータベースからcron値を取得できます。サンプルコードは次のとおりです。
@Autowired
private CronRepository cronRepo;
@Bean
public int getCronValue()
{
return cronRepo.findOne("cron").getCronValue();
}
テーブルを作成し、データベースに適切な値を提供する必要があります。その後、@ Scheduled内でBeanを提供できます。サンプルコードは次のとおりです。
@Scheduled(cron="#{@getCronValue}")
それがあなたの問題に役立つことを願っています。
目標を達成するには、実行時にスケジューラを構成する必要があります。つまり、より低レベルのスケジューラAPIを使用する必要があります。正確にデータベースとの接続の準備が完了したら、スケジューラを構成できます。 @Scheduledアノテーションの使用を取り除き、スケジューラを手作業で管理する必要があると思います。
これらのトピックは、私が言っていることを説明するのに役立つと思います。
ただし、Beanの作成をインターセプトし、アノテーションの元のアノテーションをカスタムメタデータに置き換えるワイルドアプローチをいつでも使用できますが、それを実装するには、多くのフレームワークの詳細と@Scheduled annatationプロセッサの仕組みを知っている必要があります。
値が保存されているデータベーステーブルからプロパティをロードする必要があります。そのdbプロパティをアプリケーションプロパティとマージします
@Autowired
private DataSource dataSource;
@Autowired
private DatabaseConfiguration configuration;
@Bean(name = "propertyConfig")
public DatabaseConfiguration getDatabaseConfiguration() {
DatabaseConfiguration configuration = new DatabaseConfiguration(dataSource, "propertyTable", "key", "value");
return configuration;
}
@Bean(name = "dbProperty")
public Properties getDBProperties(){
Properties properties = ConfigurationConverter.getProperties(configuration);
return properties;
}
詳細については https://analyzejava.wordpress.com/2015/01/16/loading-configuration-properties-from-database-in-spring-based-application/ を参照してください
@Beanアノテーション付きメソッドを使用すると、トリックが実行されます。しかし、SpringBootはこのメソッドを1回だけ呼び出し、その後キャッシュバージョンを返すため、Springを再起動して新しい値を取得する必要があります。
SchedulingConfigurerを使用して、データベースから新しいランタイムを取得するには:
@Configuration
public class SchedulerConfig implements SchedulingConfigurer {
@Autowired
private YourService yourService;
@Bean
public YourJob yourJob() {
return new YourJob();
}
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.addTriggerTask(
() -> yourJob().performJob(),
(TriggerContext triggerContext) -> yourService.getCron()
);
}
}
注:この方法で@Scheduledを使用しないでください。