복붙노트

[SPRING] Apache Camel - 시작시 작업을 한 번만 실행하도록 트리거

SPRING

Apache Camel - 시작시 작업을 한 번만 실행하도록 트리거

저는 Camel & Spring을 사용하는 Java 프로젝트를 작업 중입니다. Spring이 일을 끝내고 Camel이 모든 라우트를 빌드 한 후에 싱글 톤 bean에서 initialize 메소드를 트리거하려고합니다.

우리는 @Component 스프링 주석으로부터 픽업하는 다른 클래스들에 동적 인 연결을 가지고 있기 때문에 클래스 생성시 메소드를 호출 할 수 없다. 그리고이 클래스들이 아직로드되지 않았을 때, 실제로 init 메소드를 건설자.

Camel 시동이 완료된 직후에 한 번만 실행될 메소드를 호출하려면 어떻게해야합니까?

감사!

해결법

  1. ==============================

    1.CamelContext가 모든 경로 등을 시작한 후에 Bean을 호출해야한다면 Ben과 같이 타이머가있는 경로를 사용할 것을 제안 할 수 있습니다.

    CamelContext가 모든 경로 등을 시작한 후에 Bean을 호출해야한다면 Ben과 같이 타이머가있는 경로를 사용할 것을 제안 할 수 있습니다.

    가능한 더 나은 대안은 Camel의 EventNotifier API를 사용하는 것입니다. 그리고 나서 CamelContextStartedEvent에 대한 로직을 시작합니다. EventNotifier API에 대한 자세한 내용은 http://camel.apache.org/eventnotifier-to-log-details-about-all-sent-exchanges.html을 참조하십시오.

  2. ==============================

    2.약간의 유연성을 제공하는 또 다른 간단한 옵션은 repeatCount = 1 및 모든 값을 초기화 할 수있을만큼 지연된 값으로 낙타 타이머를 사용하는 것입니다. 지연 / 재시도 등에 대한 기본 예외 처리를 추가 할 수도 있습니다.

    약간의 유연성을 제공하는 또 다른 간단한 옵션은 repeatCount = 1 및 모든 값을 초기화 할 수있을만큼 지연된 값으로 낙타 타이머를 사용하는 것입니다. 지연 / 재시도 등에 대한 기본 예외 처리를 추가 할 수도 있습니다.

    from("timer://runOnce?repeatCount=1&delay=5000").to("bean:runOnceBean");
    
  3. ==============================

    3.한 가지 해결책은 CamelContextConfiguration.java와 RoutesCollector.java의 두 파일 (PR https://github.com/apache/camel/pull/684 참조)을 패치하는 것입니다.

    한 가지 해결책은 CamelContextConfiguration.java와 RoutesCollector.java의 두 파일 (PR https://github.com/apache/camel/pull/684 참조)을 패치하는 것입니다.

    CamelContextConfiguration에 메소드를 추가합니다.

    void afterApplicationStart(CamelContext camelContext);
    

    그리고 RoutesCollector의 onApplicationEvent에서 다음과 같이 추가합니다.

            if (camelContextConfigurations != null) {
                for (CamelContextConfiguration camelContextConfiguration : camelContextConfigurations) {
                    camelContextConfiguration.afterApplicationStart(camelContext);
                }
            }
    

    이 날짜의 최신 버전을 사용하는 경우 if (camelContextConfigurations! = null)을 생략 할 수 있습니다.

    그런 다음 코드를 추가하기 위해 다음과 같이 Spring 빈을 작성하십시오.

    @Bean
    CamelContextConfiguration contextConfiguration() {
        return new CamelContextConfiguration() {
    
            @Override
            public void beforeApplicationStart(CamelContext camelContext) {
            }
    
            @Override
            public void afterApplicationStart(CamelContext camelContext) {
                // Put your code here
            }
        };
    }
    

    업데이트 :이 끌어 오기 요청이 병합되었습니다.

  4. ==============================

    4.bean의 메소드에 논리를 추가하고 @PostConstruct로 주석을 달아라 -이 bean이 완전히 초기화되고 모든 의존성이 설정되면 spring은이 메소드를 호출 할 것이다.

    bean의 메소드에 논리를 추가하고 @PostConstruct로 주석을 달아라 -이 bean이 완전히 초기화되고 모든 의존성이 설정되면 spring은이 메소드를 호출 할 것이다.

    @Component
    class SomeClass {
    
     @PostConstruct
     void init() {
     }
    
    }
    

    전체 봄 애플리케이션 컨텍스트가 완전히 초기화 된 후에 로직을 호출해야하는 경우 LifeCycle 인터페이스를 구현하여이를 수행 할 수 있습니다.

  5. ==============================

    5.싱글 톤 빈에 낙타 컨텍스트를 삽입 해보십시오. 문맥이 완전히 초기화 될 때까지 분사가 일어나지 않을 것입니다 ... 모든 경로의 구축을 포함합니다. 단점은 빈 내에 실제로 컨텍스트가 필요하지 않을 수도 있다는 것입니다. 싱글 톤 빈 의존성을 스프링 설정 파일의 camelContext 초기화에 연결하는 아이디어로 머리를 감싸고 있지만 실제로 작동하는지 확신 할 수 없습니다.

    싱글 톤 빈에 낙타 컨텍스트를 삽입 해보십시오. 문맥이 완전히 초기화 될 때까지 분사가 일어나지 않을 것입니다 ... 모든 경로의 구축을 포함합니다. 단점은 빈 내에 실제로 컨텍스트가 필요하지 않을 수도 있다는 것입니다. 싱글 톤 빈 의존성을 스프링 설정 파일의 camelContext 초기화에 연결하는 아이디어로 머리를 감싸고 있지만 실제로 작동하는지 확신 할 수 없습니다.

  6. ==============================

    6.이것 이전에 이미 대답에 암시 된 것처럼, 낙타 문제보다는 오히려 봄입니다. Spring에서는 단순히 InitializingBean을 구현하고 menthod afterPropertiesSet을 구현할 수있다. 이것은 배선이 완료 될 때 호출됩니다.

    이것 이전에 이미 대답에 암시 된 것처럼, 낙타 문제보다는 오히려 봄입니다. Spring에서는 단순히 InitializingBean을 구현하고 menthod afterPropertiesSet을 구현할 수있다. 이것은 배선이 완료 될 때 호출됩니다.

  7. ==============================

    7.http://camel.apache.org/configuring-route-startup-ordering-and-autostartup.html에서 문서화 된 Camel의 시작 순서 기능을 사용할 수 있습니다. -

    http://camel.apache.org/configuring-route-startup-ordering-and-autostartup.html에서 문서화 된 Camel의 시작 순서 기능을 사용할 수 있습니다. -

    <route startupOrder="1" id="thisOneGoesFirst">    
      <from uri="seda:foo"/>
      <to uri="mock:result"/>
    </route>
    <route startupOrder="2" id="thisOneGoesSecond">
      <from uri="direct:start"/>
      <to uri="seda:foo"/>
    </route> 
    <route id="thisOneGoesLast">
      <from uri="direct:bar"/>
      <to uri="seda:bar"/>
    </route>
    

    startupOrder 속성이있는 라우트는 순서대로 실행되고 startupOrder가없는 모든 라우트보다 먼저 실행됩니다. 따라서 경로를 시작하기 전이나 후에 타이머 소비자와 같은 경로를 통해 원하는 시점을 알 수 있습니다.

  8. from https://stackoverflow.com/questions/7714211/apache-camel-triggering-a-task-on-startup-to-run-only-once by cc-by-sa and MIT license