我的Spring基于注释的任务调度程序有问题 - 我无法使其工作,我在这里看不到任何问题...
应用程序的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 5中工作的解决方案是我必须将@Component
添加到具有@Scheduled
注释方法的类中。
只需在@Configuration注释的任何spring boot配置类中添加@EnableScheduling
Spring @Configuration (non-xml configuration) for annotation-driven tasks
只需在WebMvcConfig类上添加@EnableScheduling即可
@Configuration
@EnableWebMvc
@EnableAsync
@EnableScheduling
public class WebMvcConfig extends WebMvcConfigurerAdapter {
/** Annotations config Stuff ... **/
}
我终于找到了解决方案。
应用程序的context.xml
<bean id="schedulingTest" class="...SchedulingTest" />
<task:scheduled-tasks>
<task:scheduled ref="schedulingTest" method="test" cron="* * * * * ?"/>
</task:scheduled-tasks>
和没有注释的test()
方法。这每秒运行一次方法并且运行完美。
如果你有dispatcher-servlet.xml那么移动你的配置。它对我有用,我在这篇文章中留下了评论:https://stackoverflow.com/a/11632536/546130
您还应该检查lazy-init对于该bean是否为false或在bean中使用default-lazy-init="false"
。
这解决了我的问题。
发生这种情况是因为默认情况下Spring lazy初始化bean。
通过放置此批注来禁用bean的延迟初始化
@Lazy(false)
在你的@Component
之上。
我的解决方案是在applicationContext.xml中添加:
<task:annotation-driven/>
使用以下schemaLocation:
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd
我们有以下原因:服务需要一个接口(由于Transaction注释) - 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>