为什么 Spring 不运行我的 @Scheduled 方法?
我有点困惑,因为我正在尝试使用 @Scheduled 注释,但 Spring 似乎没有找到我的方法。最终结果是,我用 @Scheduled
注释的方法都没有被执行。
我使用以下声明调用了 Spring 的任务魔法:
<beans> <!-- XMLNS, XSD declarations omitted for brevity -->
<context:component-scan base-package="com.mypackage"/>
<task:executor id="executor" pool-size="5"/>
<task:scheduler id="scheduler" pool-size="5"/>
<task:annotation-driven scheduler="scheduler" executor="executor"/>
</beans>
我有一个看起来像这样的接口:
package com.mypackage;
public interface MyInterface {
public void executePeriodically();
}
具有如下所示的相应实现:
package com.mypackage.impl;
// imports omitted for brevity
@Service
public class MyInterfaceImpl implements MyInterface {
@Scheduled(cron = "0/5 * * * * ?")
public void executePeriodically() {
System.out.println("The time is now : " + new Date());
}
}
现在预期的结果是我有一个非常吵闹的小家伙告诉我每 5 点是什么时间秒......但实际上我什么也没得到。我尝试过在接口方法和 impl 方法上使用注释,但这似乎没有改变任何东西。
我确信执行程序和调度程序正在初始化,因为我的日志中有以下内容:
INFO - ThreadPoolTaskExecutor - Initializing ExecutorService
INFO - XmlWebApplicationContext - Bean 'executor' is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
INFO - XmlWebApplicationContext - Bean 'executor' is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
INFO - ThreadPoolTaskScheduler - Initializing ExecutorService 'scheduler'
INFO - XmlWebApplicationContext - Bean 'scheduler' is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
我不确定关于不符合资格的那一行是否相关或转移注意力。
目前,我正在通过声明我的计划任务来解决这个问题,如下所示:
<task:scheduled-tasks>
<task:scheduled ref="sourceDocumentManagerImpl" method="deleteOldDocuments" cron="0 0 * * * ?"/>
</task:scheduled-tasks>
虽然这工作得很好,但我更愿意使用注释,因为直接在代码中查看对此的期望要方便得多方法。有人知道我可能做错了什么吗?作为记录,我正在使用 Spring 3.0.4
非常感谢!
I'm a bit befuddled because I'm trying use use @Scheduled
annotations, but Spring doesn't seem to be finding my methods. The end result is that, none of my methods annotated with @Scheduled
are being executed.
I have invoked Spring's task magic with the following declarations:
<beans> <!-- XMLNS, XSD declarations omitted for brevity -->
<context:component-scan base-package="com.mypackage"/>
<task:executor id="executor" pool-size="5"/>
<task:scheduler id="scheduler" pool-size="5"/>
<task:annotation-driven scheduler="scheduler" executor="executor"/>
</beans>
And I have an interface that looks something like this:
package com.mypackage;
public interface MyInterface {
public void executePeriodically();
}
With a corresponding impl like this:
package com.mypackage.impl;
// imports omitted for brevity
@Service
public class MyInterfaceImpl implements MyInterface {
@Scheduled(cron = "0/5 * * * * ?")
public void executePeriodically() {
System.out.println("The time is now : " + new Date());
}
}
Now the expected result is that I have a very noisy little guy telling me what time it is every 5 seconds...but in reality I get absolutely nothing. I've tried with the annotation on the interface method and on the impl method, but that doesn't seem to change anything.
I know for sure that the executor and scheduler are being initialized because I have the following in my log:
INFO - ThreadPoolTaskExecutor - Initializing ExecutorService
INFO - XmlWebApplicationContext - Bean 'executor' is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
INFO - XmlWebApplicationContext - Bean 'executor' is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
INFO - ThreadPoolTaskScheduler - Initializing ExecutorService 'scheduler'
INFO - XmlWebApplicationContext - Bean 'scheduler' is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
I'm not sure if that line about not being eligible is relevant or a red herring.
At the moment, I'm working around it by declaring my scheduled tasks like so:
<task:scheduled-tasks>
<task:scheduled ref="sourceDocumentManagerImpl" method="deleteOldDocuments" cron="0 0 * * * ?"/>
</task:scheduled-tasks>
While this works perfectly fine, I'd much rather use the annotations because it's so much more convenient to see directly in the code what the expectations are for that method. Anyone know what I could be doing wrong? For the record, I'm using Spring 3.0.4
Thanks a bunch!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(8)
添加“任务:注释驱动”?
参考http:// /howtodoinjava.com/2013/04/23/4-ways-to-schedule-tasks-in-spring-3-scheduled-example/
或
Spring @Configuration (非 xml 配置)用于注释驱动的任务
只需在 WebMvcConfig 类
引用上添加 @EnableScheduling Spring Scheduler 不起作用
add "task:annotation-driven" ?
reference http://howtodoinjava.com/2013/04/23/4-ways-to-schedule-tasks-in-spring-3-scheduled-example/
or
Spring @Configuration (non-xml configuration) for annotation-driven tasks
Just add @EnableScheduling on you WebMvcConfig class
reference Spring Scheduler does not work
所以...看起来 Spring 3.0.x(至少是 3.0.4 和 3.0.5)中存在一个问题,与发现 AOP 代理上的
@Scheduled
注释有关。我有一个切入点声明,用事务建议包装了@Scheduled
方法,这似乎是问题的根源。如果我删除建议,作业就会运行。如果我将其添加回来,Spring 将无法为我的带注释的方法找到并创建任务。所以,我要去向 Spring 人员提交一个 bug,同时我不得不手动声明我的任务。
So...it looks like there's a problem in Spring 3.0.x (at the very least 3.0.4 and 3.0.5) having to do with discovering
@Scheduled
annotations on AOP proxies. I've got a pointcut declaration wrapping the@Scheduled
method with transactional advice, and that seems to be the root of the problem. If I remove the advice, the job runs. If I add it back in, Spring fails to find and create a task for my annotated method.So, I'm going to go file a bug with the Spring folks, and in the meantime I'm stuck declaring my tasks manually.
我通过将 default-lazy-init="false" 添加到我的 applicationContext.xml 来修复它。
I fixed it by adding default-lazy-init="false" to my applicationContext.xml.
我从我的设置(有效)中看到的唯一区别是我的类是用
@Component
而不是@Service
注释的。其他要检查的事情:The only difference that I see from my setup (which works), is that my class is annotated with
@Component
rather than@Service
. Other things to check:尽管我使用的是 Spring 3.1.2,但如果我将执行程序和调度程序标记放在 ApplicationContext.xml 中,我就会遇到同样的问题。我的项目中有两个 spring 的 xml 配置文件,它们是:
因此,尝试将配置移动到 spring 读取的最后一个配置文件。就我而言,它是通过将我的配置移至dispatcher-servlet.xml开始工作的,
这是我的示例:
applicationContext.xml
dispatcher-servlet.xml
希望它有所帮助。
In spite of that I am using Spring 3.1.2, I am running into the same problem in case i place my executor and scheduler tag in ApplicationContext.xml. i have two xml configuration file for spring in my project which are :
So try to move your configuration to the last configuration file which spring reads. in my case it is start working by moving my configuration to dispatcher-servlet.xml
here is my example:
applicationContext.xml
dispatcher-servlet.xml
hope it helps.
这是一个相当老的问题,但由于谷歌搜索结果中不断出现这个问题,让我添加在 Spring 5 中对我有用的解决方案。对我来说,直到我将
@Component
添加到类中后它才起作用具有@Scheduled
带注释的方法。This is pretty old question but since this keeps up coming in google search results let me add the solution that worked for me in Spring 5. For me it didn't work until I added
@Component
to the class having@Scheduled
annotated methods.我通过删除 context:component-scan 中的 use-default-filters="false" 来解决它
我的旧配置是
我的 spring 版本 3.2.3
I Solve it by remove use-default-filters="false" in context:component-scan
my old config is
my spring version 3.2.3
我通过添加以下两个来解决:
then:
并在我的 applicationContext.xml 的 bootom 中:
I solved by adding both:
then:
and in the bootom of my applicationContext.xml: