web-dev-qa-db-ja.com

Spring Boot @ Scheduledのcron式を更新します

@Scheduledと次のようなハードコードされたcron式で約10のジョブがスケジュールされています。

@Scheduled(cron = "* * 1 * * *")
public void testMethod(){
    doSomething();
}

データベースを介してこのcron式を更新し、実行時に特定のジョブを再スケジュールできるようにしたいと思います。

誰かがこれを行う方法を知っていますか?

ありがとう

7
tiagocarvalho92

実行時にジョブのスケジュールを構成する場合は、注釈_@Scheduled_を使用できないと思います。

代わりに、春のドキュメントから独自のスケジューラを使用できます:

_scheduler.schedule(task, new CronTrigger("0 15 9-17 * * MON-FRI"));
_

次に、構成を変更する場合は、スケジュールをキャンセルして新しいスケジュールを作成できます。

TaskScheduler return ScheduledFuture どこかに保存する必要があり、 cancel(...)でキャンセルできます。 メソッド。

8
Mickael

@Scheduledはこの機能をサポートしていないと思います(興味深い実装である必要があります)。事前スケジューリング機能を使用するには、クォーツまたはその他のスケジューラソリューションを使用する必要があります。私の答えはQuartzソリューションに基づいています:@Component class ReschedulerComponent {

    @Autowired
    private SchedulerFactoryBean schedulerFactoryBean;

    public void reSchedule(){

    Trigger oldTriger = schedulerFactoryBean.getScheduler().getTrigger("my_custom_trigger");

        Trigger myNewTrigger = TriggerBuilder
                .newTrigger()
                .forJob(jobDetail) // Name of your job
                .withIdentity("my_custom_trigger")
                .startAt(myNewDATE)
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withMisfireHandlingInstructionFireNow())
                .build();

    schedulerFactoryBean.getScheduler().rescheduleJob(oldTriger.getKey(), myNewTrigger);
    }

}

簡単な紹介: https://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/scheduling.html

3
Makoton

コードを変更する必要がないようにジョブのスケジュールを構成する場合は、いくつかのconfiguration.propertiesに格納されているプロパティの値を抽出し、@Valueを使用してコードでアクセスすることをお勧めします。

UPD:このトピックが見つかりました、多分あなたはそれが役に立つと思うでしょう Spring Schedulerはcron式を動的に変更します

0
WeGa

これは、以下に説明するように、cron expressionproperty place holderを指定することで実行できます。 @configurationクラスに以下のコードを追加します。

@Bean
    public PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {

        PropertySourcesPlaceholderConfigurer properties = new PropertySourcesPlaceholderConfigurer();
        properties.setLocation(new ClassPathResource("test.properties"));
    return properties;
    }

これで、test.propertiesがプレースホルダーで使用できるようになります。以下に示すTest.properties

variable.name.inside.properties= 00 39 05 * * *

次に、スケジューラクラス内に追加します

    @Scheduled(cron = "${variable.name.inside.properties}")
public void testMethod(){
    doSomething();
}
0
vipin cp

このリソースを確認する必要があると思います。プログラムでスケジュールされたジョブを作成できます。したがって、メソッドに@PostConstructアノテーションを付けると、アプリケーションの起動時にメソッドが選択され、スケジュールされた時間に実行されます。

https://www.programcreek.com/Java-api-examples/index.php?api=org.quartz.impl.triggers.SimpleTriggerImpl

http://www.quartz-scheduler.org/api/2.2.1/org/quartz/impl/triggers/SimpleTriggerImpl.html

0
Ayo K