web-dev-qa-db-ja.com

Spring Boot:データベースから@Scheduled cron値を取得する

私はSpring Bootを使用していますが、データベースに存在する値を使用してcron taskをスケジュールする際に問題があります。

当分の間、私は以下のようなプロパティファイルから値を読んでいます:

@Scheduled(cron= "${time.export.cron}")
public void performJob() throws Exception {
   // do something
}

これはうまく機能しますが、プロパティファイルから値を取得する代わりに、データベーステーブルから値を取得する必要があります。それは可能ですか?

12
Daniel

beanを追加して、SpringBootApplicationメインクラスまたは任意の構成クラスのデータベースからcron値を取得できます。サンプルコードは次のとおりです。

@Autowired
private CronRepository cronRepo;

@Bean
public int getCronValue()
{
    return cronRepo.findOne("cron").getCronValue();
}

テーブルを作成し、データベースに適切な値を提供する必要があります。その後、@ Scheduled内でBeanを提供できます。サンプルコードは次のとおりです。

@Scheduled(cron="#{@getCronValue}")

それがあなたの問題に役立つことを願っています。

10
Vignesh

目標を達成するには、実行時にスケジューラを構成する必要があります。つまり、より低レベルのスケジューラAPIを使用する必要があります。正確にデータベースとの接続の準備が完了したら、スケジューラを構成できます。 @Scheduledアノテーションの使用を取り除き、スケジューラを手作業で管理する必要があると思います。

これらのトピックは、私が言っていることを説明するのに役立つと思います。

  1. 実行時にSpringの@Scheduled fixedDelayを変更する方法

  2. Springによるプログラムによるジョブのスケジュール(fixedRateを動的に設定)

ただし、Beanの作成をインターセプトし、アノテーションの元のアノテーションをカスタムメタデータに置き換えるワイルドアプローチをいつでも使用できますが、それを実装するには、多くのフレームワークの詳細と@Scheduled annatationプロセッサの仕組みを知っている必要があります。

1
Alex

値が保存されているデータベーステーブルからプロパティをロードする必要があります。その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/ を参照してください

1
NIrav Modi

@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を使用しないでください。

0
FatalFzrry