2017-02-10 4 views
0

Spring Integration File Support 튜토리얼을 통해 코드를 작성했으며 특정 위치에서 파일을 폴링하고 추가 처리합니다. 나는 다음과 같은 내 bean.xml이 때문에 폴링 목적을 위해 내가 봄 통합의 인바운드 및 아웃 바운드 채널 어댑터를 사용하고 있습니다 :SFTP 인바운드/아웃 바운드 채널 어댑터에 대해 별도의 채널 선언이있는 이유와 단순한 파일 인바운드/아웃 바운드 채널 어댑터가 필요한 이유는 무엇입니까?

 <?xml version="1.0" encoding="UTF-8"?> 
     <beans xmlns="http://www.springframework.org/schema/beans" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xmlns:integration="http://www.springframework.org/schema/integration" 
      xmlns:file="http://www.springframework.org/schema/integration/file" 
      xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd 
        http://www.springframework.org/schema/integration 
        http://www.springframework.org/schema/integration/spring-integration.xsd 
        http://www.springframework.org/schema/integration/file 
        http://www.springframework.org/schema/integration/file/spring-integration-file.xsd"> 
      <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" /> 
      <file:inbound-channel-adapter id="filesIn" 
       directory="file:${java.io.tmpdir}/input"> 
       <integration:poller id="poller" fixed-rate="60000" /> 
      </file:inbound-channel-adapter> 
      <integration:service-activator 
       input-channel="filesIn" output-channel="filesOut" ref="handler" /> 
      <file:outbound-channel-adapter id="filesOut" 
       directory="file:${java.io.tmpdir}/archive" delete-source-files="true"> 
      </file:outbound-channel-adapter> 
      <bean id="handler" class="com.m.c.Handler" /> 
     </beans> 

이제 내 주요 클래스는 다음과 같습니다

@SpringBootConfiguration 
    @EnableScheduling 
    public class App{ 
     private static final Log LOGGER = LogFactory.getLog(App.class); 

     public static void main(String[] args) 
     { 
      SpringApplication.run(App.class, args); 
     } 

     @Scheduled(fixedDelay = 60000) 
     public static void display() throws InvalidFormatException, IOException{ 
      ApplicationContext context = new ClassPathXmlApplicationContext("/spring/integration/bean.xml", App.class); 
      File inDir = (File) new DirectFieldAccessor(context.getBean(FileReadingMessageSource.class)).getPropertyValue("directory"); 
      LiteralExpression expression = (LiteralExpression) new DirectFieldAccessor(context.getBean(FileWritingMessageHandler.class)).getPropertyValue("destinationDirectoryExpression"); 
      File outDir = new File(expression.getValue()); 
      LOGGER.info("Input directory is: " + inDir.getAbsolutePath()); 
      LOGGER.info("Archive directory is: " + outDir.getAbsolutePath()); 
      LOGGER.info("==================================================="); 
     } 
    } 

파일을 처리하기위한 처리기 클래스가 있는데, 이것은 잘 작동합니다.

이제는 SFTP 원격 서버에 대해 동일한 메커니즘을 만들고 해당 위치에서 파일을 폴링하고 처리 된 파일을 다른 SFTP 위치에 저장하려고합니다.

그래서 bean.xml을 적절하게 구성하고 SFTP 용 인바운드 및 아웃 바운드 채널 어댑터를 작성했습니다. 서비스 액티베이터 부분에 와서 인바운드 및 아웃 바운드 채널 어댑터 용으로 별도의 채널을 구성하고 ID가 제대로 작동하는 간단한 파일 폴러에 표시되지 않은 service-activator에 ID를 제공해야한다는 사실을 발견했습니다. 그렇다면 인바운드 및 아웃 바운드 채널 어댑터에는 왜 개별 채널이 필요합니까? 그리고 만약 그들이 필요하다면 우리는 스케줄 된 파일 폴링 서비스에 대해 어떻게 구현할 것인가?

+0

SFTP에 대해 비슷한 설정으로 모의 테스트 케이스를 실행했으며 내 암시 적 채널에 대한 이의 제기가 없습니다. 따라서 새 구성에 문제가있을 수 있습니다. –

답변

-1

문제의 구성이 표시되지 않아서 사용자가 요구하는 것이 확실하지 않지만 채널 어댑터의 channel은 선택 사항입니다. 생략하면 채널 이름은 id과 동일합니다. 그러나 항상 채널이 있습니다. 실제로 채널을 선언해야하는지 여부는 소비자 측에 따라 다릅니다.

아웃 바운드 어댑터에서 channel을 명시 적으로 사용하는 경우 채널을 선언해야합니다. 인바운드 어댑터에서는 서비스 활성화자가 입력 채널을 자동으로 선언하기 때문에 인바운드 어댑터에는 필요하지 않습니다.