2011-01-27 136 views
13

我有一个问题,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 <<<"); 
    } 

} 
+0

我没有得到任何错误,我希望记录>>>计划测试服务<<<`没有发生的消息... – user219882 2011-01-27 14:20:49

+1

是您的记录器配置正确,日志级别是否正确? – 2011-01-27 14:24:24

回答

21

如果你想使用task:annotation-driven的方法,你的@Scheduled注解不起作用,那么你很可能在你的上下文xml中错过了context:component-scan。 没有这条线,春天无法猜测在哪里搜索您的注释。

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

你救了我的生命Serkan Arikusu!竖起大拇指! – TchiYuan 2013-01-22 03:24:37

3

我终于找到了解决办法。

应用的context.xml

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

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

和不具有注释的test()方法。这种方法每秒运行一次,并且完美地工作。

+1

由于您离开了“任务:注解驱动”方法,因此这确实可行。你我看看失败线的另一个答案。干杯 – 2012-06-22 14:10:54

1

你还应该检查lazy-init为该bean的false或在beans中使用default-lazy-init="false"

这解决了我的问题。

0

这是默认春天,因为发生懒初始化豆。

禁用延迟初始化为bean通过将该注释

@Lazy(false) 

@Component的顶部。

0

我们有以下原因: 服务需要一个接口(由于事务注释) - IDE还将此tx注释添加到接口。但@Scheduled是在实现服务类 - 而Spring忽略它,因为它认为只有注释存在于界面上。所以要小心只对实现类有注释!