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 <<<");
}
}
task:annotation-driven
アプローチを使用したいが、@ Scheduledアノテーションが機能しない場合は、コンテキストxmlでcontext:component-scan
が欠落している可能性があります。この行がないと、Springは注釈を検索する場所を推測できません。
<context:component-scan base-package="..." />
アノテーション駆動型タスクの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 ... **/
}
これは、Spring LazyがデフォルトでBeanを初期化するために発生します。
このアノテーションを配置して、Beanの遅延初期化を無効にします
@Lazy(false)
@Component
の上に。
dispatcher-servlet.xmlがある場合は、設定をそこに移動します。それは私のために働き、私はこの記事にコメントを残しました: https://stackoverflow.com/a/11632536/5461
ようやく解決策を見つけました。
application-context.xml
_<bean id="schedulingTest" class="...SchedulingTest" />
<task:scheduled-tasks>
<task:scheduled ref="schedulingTest" method="test" cron="* * * * * ?"/>
</task:scheduled-tasks>
_
アノテーションなしのtest()
メソッド。これにより、毎秒メソッドが実行され、完全に機能します。
私にとって、Spring 5で機能したソリューションは、@Component
アノテーション付きメソッドを持つクラスに@Scheduled
を追加する必要があるというものでした。
また、そのBeanに対してlazy-initがfalseであることを確認するか、Beanでdefault-lazy-init="false"
を使用する必要があります。
それで問題は解決しました。
私の解決策は、applicationContext.xmlに追加することでした。
<task:annotation-driven/>
次のschemaLocationを使用:
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd
次の理由がありました:サービスにはインターフェースが必要です(トランザクションアノテーションのため)-IDEこのtxアノテーションもインターフェースに追加されました。しかし、@ Scheduledはサービスクラスの実装にありました-そしてSpringはそれを無視しましたインターフェースにはアノテーションしか存在しないと思ったので、クラスの実装にのみアノテーションがあるように注意してください!
私は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>
@Configurationで注釈が付けられた任意のスプリングブート構成クラスに@EnableSchedulingを追加し、スケジュールジョブを実行するメソッドに@Scheduled注釈を追加します。