我正在使用Spring Boot和Scheduling。
在Spring中,为什么这会正常工作(该方法每5秒调用一次) -
//@Bean
@Scheduled(fixedRate = 5000)
public void foo() {
System.out.println("bar");
}
但这不是(该方法不会每5秒调用一次) -
@Bean
@Scheduled(fixedRate = 5000)
public void foo() {
System.out.println("bar");
}
答案 0 :(得分:1)
@Bean
注释用于基于Java的配置,以注释构造bean的方法。这只是错误的注释,不应该存在。
答案 1 :(得分:1)
@Bean
注释用于定义bean实例,并且必须返回结果。 @Scheduled
注释属于 bean方法,而不是bean本身,并且该方法必须返回void。另外,不要忘记通过将@EnableScheduling
放在@Configuration
个类之上来启用计划。例如:
<强> MyConfig.java 强>
@Configuration
@EnableScheduling
public class MyConfig
{
}
<强> MyScheduledJob.java 强>
@Component
public class MyScheduledJob
{
@Scheduled(fixedRate = 5000)
public void doSomething() // Note: Should only return void
{
System.out.println(Instant.now() + ": MyScheduledJob.doSomething() invoked.");
}
}
输出:
2017-01-28T03:08:04.760Z: MyScheduledJob.doSomething() invoked.
2017-01-28T03:08:09.756Z: MyScheduledJob.doSomething() invoked.
2017-01-28T03:08:14.755Z: MyScheduledJob.doSomething() invoked.
2017-01-28T03:08:19.758Z: MyScheduledJob.doSomething() invoked.
答案 2 :(得分:0)
您在该方法上使用的两个注释组合起来没有多大意义。
@Bean用于为应用程序中的自动装配依赖项创建单例。 http://docs.spring.io/spring-javaconfig/docs/1.0.0.M4/reference/html/ch02s02.html
@Scheduled用于计划重新运行的任务。
https://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html
这没有意义的原因在于,通常,您的Bean在应用程序启动时创建并自动装入其依赖项(完成一次)。相比之下,Schedule意味着你希望这种情况经常发生。