2

アプリケーションコンテキストが初期化され、すべての 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"/>

なぜこれが起こっているのかについての洞察をいただければ幸いです。

ありがとう

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 に答える