1. ホーム
  2. java

[解決済み] Springでスケジュールされたジョブを条件付きで有効または無効にするには?

2023-05-14 19:32:27

質問

Springでcronスタイルのパターンでスケジュールされたジョブを定義しています。 @Scheduled アノテーションを使用しています。

cronパターンはconfigプロパティファイルに格納されています。1つはデフォルトの設定、もう1つは環境に依存し(dev, test, prod customer 1, prod customer 2など)、デフォルト値をオーバーライドするプロファイルの設定ファイルです。

Spring コンテキストでプロパティプレースホルダービーンを構成し、これによって ${} スタイルのプレースホルダを使用して、プロパティファイルから値をインポートすることができます。

ジョブビーンズはこのような感じです。

@Component
public class ImagesPurgeJob implements Job {

    private Logger logger = Logger.getLogger(this.getClass());

    @Override
    @Transactional(readOnly=true)
    @Scheduled(cron = "${jobs.mediafiles.imagesPurgeJob.schedule}")
    public void execute() {
        //Do something
            //can use DAO or other autowired beans here
    }
}

私のコンテキストXMLの関連する部分 :

<!-- Enable configuration of scheduled tasks via annotations -->
    <task:annotation-driven/>

<!-- Load configuration files and allow '${}' style placeholders -->
    <bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>classpath:config/default-config.properties</value>
                <value>classpath:config/environment-config.properties</value>
            </list>
        </property>
        <property name="ignoreUnresolvablePlaceholders" value="true"/>
        <property name="ignoreResourceNotFound" value="false"/>
    </bean>

私はこれがとても気に入っています。最小限のXMLで非常にシンプルかつクリーンです。

しかし、私はもう1つ要求があります。これらの仕事のいくつかは、場合によっては完全に無効にすることができます。

そこで、Springを使用してそれらを管理する前に、私はそれらを手動で作成し、設定ファイルのcronパラメータと一緒にbooleanパラメータがあり、ジョブが有効でなければならないかどうかを指定するようにしました。

jobs.mediafiles.imagesPurgeJob.enable=true or false
jobs.mediafiles.imagesPurgeJob.schedule=0 0 0/12 * * ?

Springでこのパラメータを使用して、この設定パラメータに応じて条件付きでBeanを作成したり、単に無視したりするにはどうしたらよいでしょうか。

1つの明白な回避策は、決して評価されないcronパターンを定義することで、ジョブが実行されることはありません。しかし、ビーンはまだ作成され、構成は少し不明瞭になるので、私はより良い解決策があるはずだと感じています。

どのように解決するのですか?

@Component
public class ImagesPurgeJob implements Job {

    private Logger logger = Logger.getLogger(this.getClass());

    @Value("${jobs.mediafiles.imagesPurgeJob.enable}")
    private boolean imagesPurgeJobEnable;

    @Override
    @Transactional(readOnly=true)
    @Scheduled(cron = "${jobs.mediafiles.imagesPurgeJob.schedule}")
    public void execute() {

         //Do something
        //can use DAO or other autowired beans here
        if(imagesPurgeJobEnable){

            Do your conditional job here...

        }
    }
}