복붙노트

[SPRING] 어떻게 봄 통합에서 병렬 및 동 기적으로 처리 하는가?

SPRING

어떻게 봄 통합에서 병렬 및 동 기적으로 처리 하는가?

Spring 통합에서 스레드를 가진 자신의 코드를 생성하지 않고 (즉, ExecutorService가 작업자를 실행 및 제출) 작업자를 제출하지 않고 채널을 동기식 상태로 유지 (메시지 전송 후 승인 확인)하면서 동시에 더 많은 메시지를 처리 ​​(병렬 처리) 할 수 있습니까? ? FTP를 통해 파일을 업로드하고 싶지만 코드에 자체 스레드를 만들지 않고 동시에 더 많은 파일을 업로드하고 싶습니다. 모든 파일이 업로드 될 때를 알아야합니다. (동기식이기를 바랍니다.) 스프링 통합 구성을 통해 가능합니까? 그렇다면 어떻게해야합니까?

해결법

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

    1.음, 다음과 같은 흐름이 필요해 보입니다.

    음, 다음과 같은 흐름이 필요해 보입니다.

    뭔가 명확하지 않은 경우 알려주세요.

    최신 정보

    이 같은:

    @Configuration
    @EnableIntegration
    @IntegrationComponentScan
    public class Configuration {
    
        @Bean
        public IntegrationFlow uploadFiles() {
            return f ->
                       f.split()
                           .handle(Ftp.outboundGateway(this.ftpSessionFactory,
                               AbstractRemoteFileOutboundGateway.Command.PUT, "'remoteDirectory'"))
                           .aggregate();
        }
    
    }
    
    @MessagingGateway(defaultRequestChannel = "uploadFiles.input") 
    interface FtpUploadGateway {
    
        List<String> upload(List<File> filesToUpload);
    
    }
    
  2. ==============================

    2.이것은 @Async 작업 처리를 사용하여 Spring에서 매우 가능합니다.

    이것은 @Async 작업 처리를 사용하여 Spring에서 매우 가능합니다.

    먼저 비동기 적으로 작업을 수행 할 서비스를 만듭니다. 여기서 비동기 실행을 위해 spring으로 스캔되고 표시되는 performTask 메소드에서 @Async 주석을 기록합니다.

    import java.util.concurrent.Future;
    
    import org.springframework.scheduling.annotation.Async;
    import org.springframework.scheduling.annotation.AsyncResult;
    import org.springframework.stereotype.Service;
    
    @Service
    public class AsyncTask {
    
        @Async
        public Future<Result> performTask(String someArgument) {
            // put the business logic here and collect the result below
            Result result = new Result(); // this is some custom bean holding your result
            return new AsyncResult<Result>(result);
        }
    }
    

    그런 다음 위의 서비스를 호출 할 구성 요소를 만듭니다 (선택 사항 - 다른 기존 서비스에서도 가능).

    import java.util.concurrent.Future;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    @Component
    public class AsyncClass {
    
        @Autowired
        private AsyncTask asyncTask;
    
        public void doAsyncOperation() throws Exception {
    
        List<Future<Result>> futures = new ArrayList<Future<Result>>();
    
        for (int i = 1; i < 10; i++) {
            // Simulate multiple calls
            Future<Result > future = doAsync(String.valueOf(i));            
            futures.add(future);
        }
    
        for (Future<Result > future : futures) {
                // fetch the result
                Result result = future.get();
                // process the result
        }
    }
    
        private Future<Result> doAsync(final String someArgument) {
    
            // this will immediately return with a placeholder Future object which
            // can be used later to fetch the result
            Future<Result> future = asyncTask.performAsync(someArgument);
            return future;
        }
    }
    

    비동기를 활성화하는 데 필요한 샘플 XML 구성은 다음과 같습니다 (주석 기반 구성의 경우 @EnableAsync 사용).

    <task:annotation-driven executor="myExecutor" />
    <task:executor id="myExecutor" pool-size="30" rejection-policy="CALLER_RUNS"/>
    

    자세한 문서는 여기를 참조하십시오.

  3. from https://stackoverflow.com/questions/25741262/how-to-process-in-parallel-and-synchronously-in-spring-integration by cc-by-sa and MIT license