2017-01-27 7 views
0

私はSpringブートとスケジューリングを使用しています。なぜSpring @ Scheduledは@Beanで動作しないのですか

春に

、なぜ(メソッドが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

奇妙な質問!なぜあなたはそれをしたいですか? Spring beanは、デフォルトではシングルトンです。 –

答えて

0

@Bean注釈は、Beanを構築するメソッドに注釈を付けるためにJavaベースの設定に使用されます。それは間違った注釈であり、そこにはいけません。

0

あなたがそのメソッドに置いている2つの注釈は、まとめるのはあまり意味がありません。

@Beanは、アプリケーション全体で犠牲者を自動発信するためのシングルトンを作成するために使用されます。 http://docs.spring.io/spring-javaconfig/docs/1.0.0.M4/reference/html/ch02s02.html

@スケジューリングは、再実行のタスクをスケジュールするために使用されます。
https://docs.spring.io/spring/docs/current/spring-framework-reference/html/scheduling.html

これは理にかなっていない理由は、一般に、Beanはアプリケーションの起動時に作成され、依存関係にautowired(1回実行)されるからです。対照的に、スケジュールは、これが通常のリズムで起こることを望むことを意味します。

0

注釈は、Beanインスタンスを定義するために使用され、結果を返す必要があります。 @Scheduled注釈はのBeanメソッドに属し、Bean自体ではなく、そのメソッドはvoidを返す必要があります。また、@Configurationクラスのいずれかに@EnableSchedulingを入れてスケジューリングを有効にすることを忘れないでください。たとえば、次のように

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. 
関連する問題