복붙노트

[SPRING] Java DSL을 사용하여 성공적인 ftp 전송 후 파일 이동

SPRING

Java DSL을 사용하여 성공적인 ftp 전송 후 파일 이동

나는 ftp가 파일을 전송하고 처리 한 다음 "아카이브"디렉토리로 다시 전송하고 마지막으로 로컬 아카이브 디렉토리로 이동하기 위해 spring-integration java dsl을 사용하여 플로우를 정의했습니다. 다음과 같이 "상당히 쉽다"는 것이 있습니다.

@Bean
public IntegrationFlow ftpInboundFlow() {
    if (ftpProperties.getEnabled() == false) {
        return null;
    }
    logger.trace("Starting ftp flow");
    return IntegrationFlows
            .from(source -> source.ftp(ftpSessionFactory()).deleteRemoteFiles(true).preserveTimestamp(true)
                    .filter(compositeWithAcceptOnceFilter())                        .remoteDirectory(ftpProperties.getRemoteDirectory())
                    .localDirectory(new File(ftpProperties.getLocalDirectory())).autoCreateLocalDirectory(true),
            consumer -> consumer.id("ftpInboundAdapter")) /* Fine from() */
            .handle(new GenericHandler<File>() {

                @Override
                @Transactional
                public Object handle(File payload, Map<String, Object> headers) {
                    logger.debug("Data arrived {} {}", payload, payload.getClass().getName());
                    return payload;
                }

            }) /* Fine GenericHandler */
            .handleWithAdapter(a -> a.ftp(ftpSessionFactory())
                    .remoteDirectory(ftpProperties.getRemoteArchiveDirectory()).autoCreateDirectory(true))              
            .get();
}

내가 추가하면

.handleWithAdapter(a -> a.file("'" + ftpProperties.getLocalArchiveDirectory() + "'")
.autoCreateDirectory(true).deleteSourceFiles(true))

ftp 아답터 설정 후에 bean 초기화 프로그램은 다음과 같은 에러 메시지로 응답합니다 :

Caused by: org.springframework.beans.factory.BeanCreationException: The 'currentComponent' (org.springframework.integration.file.remote.handler.FileTransferringMessageHandler@80bfa9d) is a one-way 'MessageHandler' and it isn't appropriate to configure 'outputChannel'. This is the end of the integration flow.

어떻게 수정해야합니까?

해결법

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

    1.해결 방법으로 파일 어댑터를 포기하는 코드를 리팩토링했습니다.

    해결 방법으로 파일 어댑터를 포기하는 코드를 리팩토링했습니다.

    @Bean
    public IntegrationFlow ftpInboundFlow() {
        return IntegrationFlows
            .from(source -> source.ftp(ftpSessionFactory()).deleteRemoteFiles(true).preserveTimestamp(true)
                    .filter(compositeWithAcceptOnceFilter())                        .remoteDirectory(ftpProperties.getRemoteDirectory())
                    .localDirectory(new File(ftpProperties.getLocalDirectory())).autoCreateLocalDirectory(true),
            consumer -> consumer.id("ftpInboundAdapter")) /* Fine from() */
            .handle(new GenericHandler<File>() {
    
                @Override
                @Transactional
                public Object handle(File payload, Map<String, Object> headers) {
                    logger.debug("Data arrived {} {}", payload, payload.getClass().getName());
                    /* handle file content here ... */
                    /* ... then move it to archive */
                    File dstFile = new File("archive", payload);
                    FileUtils.moveFile(payload, dstFile);
                    return dstFile;
                }
    
            }) /* Fine GenericHandler */
            /* Archive the remote file */
            .handleWithAdapter(a -> a.ftp(ftpSessionFactory())
                    .remoteDirectory(ftpProperties.getRemoteArchiveDirectory()).autoCreateDirectory(true))              
            .get();
    

    }

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

    2.XML 구성을 사용하여 어댑터와 같은 단방향 구성 요소에 대한 규칙이 있습니다. 또는 를 참조하십시오. Java DSL의 경우 요청 / 응답 끝점을 생성하는 팩토리 메서드에 대해 게이트웨이 접미사와 같은 규칙을 사용합니다. 그렇지 않으면 그것은 a.ftp (ftpSessionFactory ())와 같은 한 가지 방법입니다.

    XML 구성을 사용하여 어댑터와 같은 단방향 구성 요소에 대한 규칙이 있습니다. 또는 를 참조하십시오. Java DSL의 경우 요청 / 응답 끝점을 생성하는 팩토리 메서드에 대해 게이트웨이 접미사와 같은 규칙을 사용합니다. 그렇지 않으면 그것은 a.ftp (ftpSessionFactory ())와 같은 한 가지 방법입니다.

    에는 출력 채널이 없으므로 XML 구성이있는 다른 쪽에서는 다운 스트림 흐름 정의를 진행할 선택의 여지가 없습니다.

    Java DSL을 사용하면 우리는 이러한 오류를 방지 할 수있는 선택의 여지가 없습니다. 그러나 나는 거기에 당신의 흐름 정의를 위해 다른 방법으로 당신을 따라야하는 포괄적 인 예외 메시지를했다.

    그리고 당신을위한 해답은 .publishSubscribeChannel ()입니다. 여러 개의 끝점을 구독하여 동일한 메시지를 받아 들여서 다른 논리를 만들 수 있습니다.

    제발, 대부분의 SI Java DSL 기능을 줄 단위로 설명하는 기사를 찾으십시오.

  3. from https://stackoverflow.com/questions/31819189/move-file-after-successful-ftp-transfer-using-java-dsl by cc-by-sa and MIT license