5

春にスケジュールを設定したいメソッドがあります-その点については、@Scheduled注釈を使用しています-より正確には、cron式を使用しています。私の cron 式は、scheduler.properties というプロパティ ファイルにあります。プレースホルダーとして使用すると、@Scheduled(cron="${cron}")すべてがうまく機能します。しかし、 SpEL ( ) を使用したいのですが、機能しません@Scheduled(cron="#{scheduler['cron']}")- 次の例外がスローされます:java.lang.IllegalArgumentException: cron expression must consist of 6 fields (found 1 in #{scheduler['cron']})

ここで何が間違っていますか?

編集: プロパティ ファイルからの私の cron 式は次のとおりです。cron=0 0/1 * * * ?

これが私が得るスタックトレースです: java.lang.IllegalArgumentException: cron expression must consist of 6 fields (found 1 in #{scheduler['cron']}) at org.springframework.scheduling.support.CronSequenceGenerator.parse(CronSequenceGenerator.java:233) at org.springframework.scheduling.support.CronSequenceGenerator.<init>(CronSequenceGenerator.java:81) at org.springframework.scheduling.support.CronTrigger.<init>(CronTrigger.java:54) at org.springframework.scheduling.support.CronTrigger.<init>(CronTrigger.java:44) at org.springframework.scheduling.config.ScheduledTaskRegistrar.afterPropertiesSet(ScheduledTaskRegistrar.java:188) at org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.onApplicationEvent(ScheduledAnnotationBeanPostProcessor.java:209) at org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.onApplicationEvent(ScheduledAnnotationBeanPostProcessor.java:1) at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:97) at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:324) at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:929) at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:467) at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:384) at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:283) at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111) at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4723) at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5226) at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5221) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334) at java.util.concurrent.FutureTask.run(FutureTask.java:166) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) at java.lang.Thread.run(Thread.java:722)

2 番目の編集: 春は、実際の cron 式自体の insraed の cron experssion "#{scheduler['cron']}" として、次の文字列を解析しようとしているようです。

4

4 に答える 4

3

エラー メッセージによると、プロパティ ファイルの cron 式の値が正しくありません。

期待される構文に準拠していません。

値には 6 つのフィールドが含まれ、次のようになります。

* 10 * * * *

この例外をスローするコードは次のとおりです

/**
 * Parse the given pattern expression.
 */
private void parse(String expression) throws IllegalArgumentException {
    String[] fields = StringUtils.tokenizeToStringArray(expression, " ");
    if (fields.length != 6) {
        throw new IllegalArgumentException(String.format(""
                + "cron expression must consist of 6 fields (found %d in %s)", fields.length, expression));
    }

Annotation で spEL を使用して cron 構成を外部化できない場合があります。

別の方法として、XML を使用するか、cron 式を使用します。

http://forum.springsource.org/showthread.php?91203-Scheduled-and-externalization-of-configuration-for-fixedDelay-and-fixedRate-problem

于 2012-05-01T07:22:28.137 に答える
1

プロパティ ファイルでは常に次のように指定します。周波数の間のスペースに注意してください。

毎日午前 9 時に更新ジョブを実行する

job.cron.rate=0 0 9 * * *

パターン例:

* "0 0 * * * *" = the top of every hour of every day.
* "*/10 * * * * *" = every ten seconds.
* "0 0 8-10 * * *" = 8, 9 and 10 o'clock of every day.
* "0 0/30 8-10 * * *" = 8:00, 8:30, 9:00, 9:30 and 10 o'clock every day.
* "0 0 9-17 * * MON-FRI" = on the hour nine-to-five weekdays
* "0 0 0 25 12 ?" = every Christmas Day at midnight

コードで次のように使用します。

@Scheduled(cron = "${job.cron.rate}")    
public void perform() throws InterruptedException {
}
于 2015-03-20T18:18:05.787 に答える
1

同様の問題があり、context:property-placeholder を使用してプロパティ ファイルを読み取ることで解決しました

<util:properties id="applicationProps" location="/WEB-INF/classes/properties/application.properties" /> **<context:property-placeholder properties-ref="applicationProps" />**

それが誰かを助けることを願っています!!

于 2015-11-03T04:20:10.943 に答える
0

できます。私は理解するのに何日も費やしました...しかし、これは実際に機能します。

  1. JAVA_HOME などの場合と同様に、環境変数を設定する必要があります。
  2. IDE を閉じます。

export cron_scheduler_expression="0 19 21 * * *"

次に、使用している IDE、Eclipse、または NetBeans を再起動します。

@Scheduled(cron = "${cron_scheduler_expression}")
public void runSchedulerTask(){

}
于 2016-09-22T15:06:05.203 に答える