web-dev-qa-db-ja.com

Spring Schedulerが機能しない

Springのアノテーションベースのタスクスケジューラに問題があります-機能しません。問題はここにはありません...

application-context.xml

<task:scheduler id="taskScheduler" />
<task:executor id="taskExecutor" pool-size="1" />
<task:annotation-driven executor="taskExecutor" scheduler="taskScheduler" />

@Service
public final class SchedulingTest {

    private static final Logger logger = Logger.getLogger(SchedulingTest.class);

    @Scheduled(fixedRate = 1000)
    public void test() {
        logger.debug(">>> Scheduled test service <<<");
    }

}
22
user219882

task:annotation-drivenアプローチを使用したいが、@ Scheduledアノテーションが機能しない場合は、コンテキストxmlでcontext:component-scanが欠落している可能性があります。この行がないと、Springは注釈を検索する場所を推測できません。

<context:component-scan base-package="..." />
24

アノテーション駆動型タスクのSpring @Configuration(非XML構成)

WebMvcConfigクラスに@EnableSchedulingを追加するだけです


    import org.springframework.context.annotation.Configuration;
    import org.springframework.scheduling.annotation.EnableAsync;
    import org.springframework.scheduling.annotation.EnableScheduling;
    import org.springframework.web.servlet.config.annotation.EnableWebMvc;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

    @Configuration
    @EnableWebMvc
    @EnableAsync
    @EnableScheduling
    public class WebMvcConfig implements WebMvcConfigurer {
       /** Annotations config Stuff ... **/
    }

47
ahll

これは、Spring LazyがデフォルトでBeanを初期化するために発生します。

このアノテーションを配置して、Beanの遅延初期化を無効にします

@Lazy(false)

@Componentの上に。

4

dispatcher-servlet.xmlがある場合は、設定をそこに移動します。それは私のために働き、私はこの記事にコメントを残しました: https://stackoverflow.com/a/11632536/5461

3
Hazhir

ようやく解決策を見つけました。

application-context.xml

_<bean id="schedulingTest" class="...SchedulingTest" />

<task:scheduled-tasks>
    <task:scheduled ref="schedulingTest" method="test" cron="* * * * * ?"/>
</task:scheduled-tasks>
_

アノテーションなしのtest()メソッド。これにより、毎秒メソッドが実行され、完全に機能します。

3
user219882

私にとって、Spring 5で機能したソリューションは、@Componentアノテーション付きメソッドを持つクラスに@Scheduledを追加する必要があるというものでした。

2
nabeel

また、そのBeanに対してlazy-initがfalseであることを確認するか、Beanでdefault-lazy-init="false"を使用する必要があります。

それで問題は解決しました。

1
Amir M

私の解決策は、applicationContext.xmlに追加することでした。

<task:annotation-driven/>

次のschemaLocationを使用:

http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd
1
Joao Gavazzi

スケジューラを構成した後、メインクラスに@ EnableSchedulingを追加します。 **enter image description here**

0
pasindupa

次の理由がありました:サービスにはインターフェースが必要です(トランザクションアノテーションのため)-IDEこのtxアノテーションもインターフェースに追加されました。しかし、@ Scheduledはサービスクラスの実装にありました-そしてSpringはそれを無視しましたインターフェースにはアノテーションしか存在しないと思ったので、クラスの実装にのみアノテーションがあるように注意してください!

0
Strinder

私はdispatcher-servlet.xmlを更新する必要がありました

<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/task
            http://www.springframework.org/schema/task/spring-task-4.3.xsd"></beans>

以下のBean定義:

<bean id="scheduledTasks" class="com.vish.services.scheduler.ScheduledTasks"></bean>
0
vishsodhani

@Configurationで注釈が付けられた任意のスプリングブート構成クラスに@EnableSchedulingを追加し、スケジュールジョブを実行するメソッドに@Scheduled注釈を追加します。

0
Hany Sakr