ApplicationListener <contextrefreshedevent>的实现可防止注册@Scheduled&amp; @Async方法</contextrefreshedevent>

时间:2013-05-29 09:09:06

标签: spring

我有一个Service类,我希望在应用程序上下文初始化之后调用一个方法,并且所有bean和&amp;注释已分别初始化和注册:

    @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"/>

对于为什么会发生这种情况的任何见解都将不胜感激。

由于

1 个答案:

答案 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。