我有一个Service类,我希望在应用程序上下文初始化之后调用一个方法,并且所有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事件)方法中调用 generatFlights()方法,则注释方法会正常注册并且相应的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"/>
对于为什么会发生这种情况的任何见解都将不胜感激。
由于
答案 0 :(得分:1)
这可能是由generateFlights()
方法中的无限循环引起的。这可能会阻止程序的执行被交还给Spring。
private void generateFlights(){
while(true){ //Never going to stop
try{
List<FlightJson> jsons = service.parseJSONFeed();
checkHexcodeAndMappings(jsons);
updateSquark(jsons);
Thread.sleep(10000);
}catch(InterruptedException e){
e.printStackTrace();
}
}
}
如果您需要每秒执行此方法,请尝试将@Scheduled
添加到方法中。
@Scheduled(fixedDelay = 1000)
private void generateFlights(){
try{
List<FlightJson> jsons = service.parseJSONFeed();
checkHexcodeAndMappings(jsons);
updateSquark(jsons);
}catch(Exception e){
e.printStackTrace();
}
}
}
为此,必须将包含此方法的类注册为Spring Bean。