アプリケーションコンテキストが初期化され、すべての Bean と注釈がそれぞれ初期化および登録された後にメソッドを呼び出したい Service クラスがあります。
@Service
public class EventGenerator implements ApplicationListener<ContextRefreshedEvent>{
static Logger logger = Logger.getLogger(EventGenerator.class);
@Autowired
private JsonQueryService service;
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
generateFlights();
}
@Async
private void generateFlights(){
while(true){
try{
List<FlightJson> jsons = service.parseJSONFeed();
checkHexcodeAndMappings(jsons);
updateSquark(jsons);
Thread.sleep(10000);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
}
アプリケーションには、他の @Scheduled および @Async アノテーションもあります。私が理解していないのは、generateFlights()メソッドを呼び出すと、アプリケーション内のすべての @Scheduled および @Async アノテーションが登録されない理由です。
onApplicationEvent(ContextRefreshedEvent event)メソッド内でgenerateFlights()メソッドを呼び出さない場合、アノテーション付きメソッドは正常に登録され、それぞれの cron タスク / 非同期メソッドは正常に実行されます。
ルート アプリケーション コンテキスト本体は次のとおりです (名前空間宣言なし)。
<context:component-scan base-package="com.atlaschase.product.core">
<context:exclude-filter type="regex"
expression="com.atlaschase.product.core.bootstrap.populators.*" />
<context:exclude-filter type="regex"
expression="com.atlaschase.product.core.services.jms.*" />
<context:exclude-filter type="regex"
expression="com.atlaschase.product.core.services.processor.*" />
<context:exclude-filter type="regex"
expression="com.atlaschase.product.core.services.remote.*" />
</context:component-scan>
<import resource="classpath:core-properties.xml" />
<import resource="classpath:core-datasource.xml" />
<import resource="classpath:core-task-scheduler.xml" />
エグゼキューター構成の詳細を含むcore-task-scheduler.xmlアプリケーション コンテキストを次に示します (ここでも、名前空間は省略されています)。
<task:annotation-driven executor="executor" scheduler="scheduler"/>
<task:executor id="executor" pool-size="1"/>
<task:scheduler id="scheduler" pool-size="5"/>
なぜこれが起こっているのかについての洞察をいただければ幸いです。
ありがとう