2015-01-13 2 views
6

파일 업로드를 허용하고 압축을 풀고 업로드 된 파일을 삭제하는 작은 서비스를 만들려고합니다. 이 세 단계는 미래로 묶여 있어야합니다. Google 구아바 라이브러리를 사용하고 있습니다.구아바 선물을 묶는 방법은 무엇입니까?

워크 플로우는 다음 작업이 후, 파일을 압축 해제 할 수있는 미래를 완료하면

미래는, 파일을 다운로드 할 수 있습니다. 압축이 풀린 경우, 원래의 업로드 된 파일을 삭제할 수 있습니다.

솔직히 말해서 내가 미래를 연결하는 방법과 구아바의 방식으로 어떻게 만들지는 명확하지 않습니다. 문서는 간결하고 명확하지 않습니다. 좋습니다, transform 방법이 있지만 구체적인 예는 없습니다. chain 메소드가 사용되지 않습니다.

RxJava 라이브러리가 누락되었습니다.

+0

선물은 업무를 수행하지 않습니다. Runnables 할. –

+0

@BrettOkken 구아바의 방식으로 주행 체인을 연결하는 방법은 무엇입니까? – Chiron

+0

가능한 중복 [구아바를 사용하여 비동기 호출을 연결할 수 있습니까?] (http://stackoverflow.com/questions/8191891/is-it-possible-to-chain-async-call-using-guava) – Joe

답변

2

구아바는이 목적으로 Future 인터페이스를 ListenableFuture으로 확장합니다.

Runnable downloader, unzipper; 
ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newCachedThreadPool()); 

service.submit(downloader).addListener(unzipper, service); 

가 나는 그것이 거의 순간적인 행동 때문에, unzipper에서 파일을 삭제 포함 할 것, 그리고 그것을 분리하는 코드를 복잡하게 할이 같은

뭔가 작동합니다.

2

Futures.transform은 RxJava와 같이 유창하게 체인으로 연결되지 않지만 계속해서 서로 의존하는 Future을 설정할 수 있습니다. 여기에 구체적인 예는 다음과 같습니다

final ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newCachedThreadPool()); 

final ListenableFuture<FileClass> fileFuture = service.submit(() -> fileDownloader.download()) 
final ListenableFuture<UnzippedFileClass> unzippedFileFuture = Futures.transform(fileFuture, 
     //need to cast this lambda 
     (Function<FileClass, UnzippedFileClass>) file -> fileUnzipper.unzip(file)); 
final ListenableFuture<Void> deletedFileFuture = Futures.transform(unzippedFileFuture, 
     (Function<UnzippedFileClass, Void>) unzippedFile -> fileDeleter.delete(unzippedFile)); 
deletedFileFuture.get(); //or however you want to wait for the result 

이 예는 FileClass의 인스턴스를 돌려 fileDownloader.download() 가정, fileUpzipper.unzip()FileDownloader.download() 대신 ListenableFuture<FileClass>을 반환하는 경우가 UnzippedFileClassAsyncFunction 대신 Function를 사용하여 반환합니다.

이 예제에서는 간략하게 Java 8 람다를 사용합니다. 자바 8을 사용하지 않는 경우, 대신 기능 또는 AsyncFunction의 익명 구현에 전달합니다

Futures.transform(fileFuture, new AsyncFunction<FileClass, UpzippedFileClass>() { 
     @Override 
     public ListenableFuture<UnzippedFileClass> apply(final FileClass input) throws Exception { 
      return fileUnzipper.unzip(); 
     } 
    }); 

더 많은 정보를 원하시면 여기 transform에 : http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/util/concurrent/Futures.html#transform이 (스크롤 또는 "변환"을 검색 - 딥 링크는 현재 깨져서 표시)

관련 문제