2017-12-18 6 views
1

私はSpringブート自動設定@EnableSchedulingを使ってcronジョブを作成しようとしています。 fixedRateStringがハードコーディングされている場合、ジョブは完全に正常に起動します。しかし、私がSpELを使って価値を提供しようとすると成功しません。SpELがインスタンス変数にアクセスできない

//ビーンインスタンスJavaConfigで

@Bean 
public AlertbotJob2 getAlertJob2() { 
    AlertbotJob2 alertbotJob2 = new AlertbotJob2("alertId", "alertName", "alertSubject", "6000", true); 
    return alertbotJob2; 
} 

Bean定義

public class AlertbotJob2 { 

String alertId; 
String alertName; 
String alertSubject; 
public String cronPattern; 
boolean isActive; 

public AlertbotJob2() { 
} 

public AlertbotJob2(String alertId, String alertName, String alertSubject, String cronPattern, boolean isActive) { 
    super(); 
    this.alertId = alertId; 
    this.alertName = alertName; 
    this.alertSubject = alertSubject; 
    this.cronPattern = cronPattern; 
    this.isActive = isActive; 
} 

@Scheduled(initialDelay = 60000, fixedRateString = "#{this.cronPattern}") 
public void doTheJob() { 
    System.out.println("DoSomething"); 
} 

}

例外は::式の解析に失敗しました。ネストされた例外はorg.springframework.expression.spel.SpelEvaluationExceptionです:EL1008E: 'org.springframework.beans.factory.config.BeanExpressionContext'型のオブジェクトでプロパティまたはフィールド 'this'を見つけることができません。

私はトリガー値を動的に設定しようとしています。助けてください。

答えて

0

私はこのようにSpELを使用することはできません。

myapp.scheduler.cronPattern=... 

そして、次の構文を使用します:あなたはそこにthisを使用することはできません

@Scheduled(cron = "${myapp.scheduler.cronPattern}") 
public void doTheJob() { 
    ... 
} 
0

を たぶん、より良い方法は、次のようにいくつかのプロパティであなたのcronパターンを定義することです。

あなたはBean名@someBean.cronPatternで行う必要があります。

+0

私はそのアプローチを試みましたが、うまく機能しませんでした。データベース構成を読み込んだ後、プログラムで仲間と一緒にBeanを作成しています。 プロトタイプスコープで**@someBean**.cronPatternを作成できるかどうかを調べる必要があります。 – zikzakjack

+0

いいえ; SpEL式が注釈が存在するクラスのインスタンスを直接参照する方法はありません。 –

0

解決策1:場合にハードコードパターンを使用して既知 @Scheduled(クーロン= "0 0/5 * * * MON-FRI")

解決策2:パターンは、いくつかのプロパティ に利用可能である場合@Scheduled(cron = "$ {myapp.scheduler.cronPattern}")

解決策3:このアプローチでは注釈は使用されません。代わりに、Beanは実行可能ファイルとして実装されています。次に、taskRegistrar.addCronTask(urRunnableJob、urCronPatternFromDB)を使用してスケジュールを動的に設定するためにSchedulingConfigurer.configureTasks()をオーバーライドします。 。 Cronパターンはデータベーステーブルに格納され、以下のようにプロパティとして初期化されます。

class AppConfig { 

    @Autowired 
    ConfigurableEnvironment environment; 

    private void initPropertiesMap() { 
     environment.getPropertySources() 
      .addLast(new MapPropertySource("myAppProperties", myAppProperties.getProperties())); // Prior DAO call required to read the configs from database 
    } 

    @PostConstruct 
    public void postConstruct() { 
     initPropertiesMap(); 
    } 

} 
関連する問題