복붙노트

[SPRING] 디렉토리를 폴링 할 때 중복 된 Spring 통합 서비스 활성화를 방지하는 방법

SPRING

디렉토리를 폴링 할 때 중복 된 Spring 통합 서비스 활성화를 방지하는 방법

스프링 통합 디렉토리 폴러가 있습니다.

<task:executor id="filePollingExecutor" pool-size="1" />
<int:channel id="inboundFilesChannel" datatype="java.io.File" />
<int-file:inbound-channel-adapter id="inboundFilesAdapter" 
      channel="inboundFilesChannel"
      directory="/my/files/queue"
      prevent-duplicates="true">
  <int:poller id="poller" fixed-delay="1000" 
              max-messages-per-poll="1" 
              task-executor="filePollingExecutor" />
</int-file:inbound-channel-adapter>

디렉토리에 나타나는 파일에 대한 응답으로 서비스의 메소드를 호출하는 서비스 활성기가 있습니다.

불행히도 나는 파일이 도착했을 때 서비스가 두 번 계속 호출되고 있음을 발견했다. 원래이 문제는 executor 스레드가 여러 개가 있기 때문에 발생한다고 생각했지만 위의 예에서 폴러를 풀 (pool) 크기가 1 인 taskExecutor에 연결하여 해결하려고했습니다.

내가 찾은 것은 투표 사이의 지연을 늘림으로써 문제를 해결할 수 있다는 것입니다. 나는 그것이 파일을 처리하는 데 걸리는 시간보다 길다는 것이 핵심이라고 생각한다.

<int:poller id="poller" fixed-delay="10000" 
            max-messages-per-poll="100" 
            task-executor="filePollingExecutor" />

그러나, 그것은 마치 고치기보다는 오히려 더러움처럼 느껴집니다.

중복을 방지하기 위해 사용해야하는 구성이 누락 되었습니까?

Nio-Locker를 사용해 보았을 때 주목할만한 가치가 있지만, 처리 과정에서 파일에 첨부 된 이메일을 보내는 것이 문제입니다. 파일 잠금은 파일이 잠금 기간 동안 읽을 수 없게 됨으로 인해 파일 잠금이 수행되는 것을 막았습니다.

해결법

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

    1.이 답변은 위에 언급 된 Gary Russell의 팁을 기반으로합니다.

    이 답변은 위에 언급 된 Gary Russell의 팁을 기반으로합니다.

    파일을 두 번 처리하는 이유는 루트 및 웹 구성이 파일 시스템 리스너를 초기화하고 따라서 각 파일을 두 번 처리하기 때문입니다.

    파일 컨텍스트에서 파일 수신기를 사용하지 않으려는 나의 접근 방식은 다음과 같습니다.

    먼저 "웹"패키지 아래에서 클래스를 선택하는 웹 구성을 정의하십시오.

    @Configuration
    @ComponentScan(basePackages = { "com.myapp.web" })
    @EnableWebMvc
    public class WebConfig extends WebMvcConfigurerAdapter {
        @Override
        public void configureDefaultServletHandling(
                DefaultServletHandlerConfigurer configurer) {
            configurer.enable();
        }
    }
    

    "웹"패키지에없는 빈을로드하는 별도의 루트 구성을 작성하십시오. 즉

    @Configuration
    @ComponentScan(basePackages = { "com.myapp.services" })
    public class ServicesConfig {
    }
    

    약간의 시간이 걸린 구성의 또 다른 요소는 내 서블릿 필터와 웹 보안 구성이 웹 컨텍스트가 아닌 '루트'컨텍스트에 있어야한다는 것입니다.

  2. from https://stackoverflow.com/questions/25184355/how-to-prevent-duplicate-spring-integration-service-activations-when-polling-dir by cc-by-sa and MIT license