我有一个服务类,我希望在初始化应用程序上下文并分别初始化和注册所有 bean 和注释后调用一个方法:
@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"/>
任何有关为什么会发生这种情况的见解都将不胜感激。
谢谢