티스토리 뷰

  • 개요
    • 디렉토리에 파일이 생성되는 경우에 감시하는 라이브러리로써 spring-integration을 사용하고 있다.
    • 설정 방법은 간단한데 IntegrationFlow를 반환하는 빈을 설정하면 된다.
    • 복수개의 디렉토리를 감시하는 경우 아래와 같이 복수개로 설정하면 된다.
    • @Bean
      public IntegrationFlow integrationFlow1() {
          return IntegrationFlow
                  .from(Files.inboundAdapter(new File("c:/inbound1"))
                          , e -> e.poller(Pollers.fixedDelay(1000).maxMessagesPerPoll(10)))
                  .handle(message -> System.out.println(message.getPayload()))
                  .get();
      }
      
      @Bean
      public IntegrationFlow integrationFlow2() {
          return IntegrationFlow
                  .from(Files.inboundAdapter(new File("c:/inbound2"))
                          , e -> e.poller(Pollers.fixedDelay(1000).maxMessagesPerPoll(10)))
                  .handle(message -> System.out.println(message.getPayload()))
                  .get();
      }
      
      @Bean
      public IntegrationFlow integrationFlow3() {
          return IntegrationFlow
                  .from(Files.inboundAdapter(new File("c:/inbound3"))
                          , e -> e.poller(Pollers.fixedDelay(1000).maxMessagesPerPoll(10)))
                  .handle(message -> System.out.println(message.getPayload()))
                  .get();
      }​
    • 서버로써 기동할 때는 문제가 없는데, 테스트코드 실행시 IntegrationFlow를 하나로 특정할 수 없다는 아래와 같은 메시지가 나와버린다.
    • Caused by: java.lang.IllegalStateException: 
      Unable to register mock bean org.springframework.integration.dsl.IntegrationFlow 
      expected a single matching bean to replace but found 
      [integrationFlow1, integrationFlow2, integrationFlow3]
  • 해결방법
    • 아래와 같은 Test용 설정을 만들어서 IntegrationFlow의 Primary를 만든다.
    • import org.springframework.boot.test.context.TestConfiguration;
      import org.springframework.context.annotation.Bean;
      import org.springframework.context.annotation.Primary;
      import org.springframework.integration.dsl.IntegrationFlow;
      
      @TestConfiguration
      public class IntegrationFlowTestConfig {
          @Primary
          @Bean
          public IntegrationFlow noActionIntegrationFlow() {
              return null;
          }
      }​
    • IntegrationFlow는 감시만 할 뿐, 로직은 별도의 핸들러가 처리하기 때문에 문제가 없을 것으로 보인다.