2

我有一个服务类,我希望在初始化应用程序上下文并分别初始化和注册所有 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"/>

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

谢谢

4

1 回答 1

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。

于 2013-05-29T09:16:56.233 回答