2015-01-13 13 views
6

Tôi đang cố gắng tạo một dịch vụ nhỏ để chấp nhận tải lên tệp, giải nén tệp và sau đó xóa tệp đã tải lên. Ba bước đó phải được xích lại như tương lai. Tôi đang sử dụng thư viện Google Guava.Làm thế nào để chuỗi tương lai ổi?

Quy trình làm việc là:

Tương lai để tải xuống tệp, nếu hoạt động hoàn thành, sau đó giải nén tệp trong tương lai. Nếu giải nén được thực hiện, một tương lai để xóa tệp đã tải lên ban đầu.

Nhưng thành thật mà nói, không rõ ràng với tôi làm thế nào tôi sẽ chuỗi các tương lai, và thậm chí làm thế nào để tạo ra chúng theo cách của ổi. Tài liệu chỉ đơn giản là ngắn gọn và không rõ ràng. Ok, có phương pháp transform nhưng không có ví dụ cụ thể nào cả. Phương pháp chain không được chấp nhận.

Tôi bỏ lỡ RxJava thư viện.

+0

Tương lai không hoạt động. Runnables làm. –

+0

@BrettOkken Làm thế nào để chuỗi runnable theo cách của ổi? – Chiron

+0

có thể trùng lặp của [Có thể chuỗi cuộc gọi không đồng bộ bằng cách sử dụng Ổi?] (Http://stackoverflow.com/questions/8191891/is-it-possible-to-chain-async-calls-using-guava) – Joe

Trả lời

2

Ổi mở rộng giao diện Future với ListenableFuture cho mục đích này.

Something như thế này nên làm việc:

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

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

tôi sẽ bao gồm xóa tập tin trong unzipper, vì nó là một hành động gần ngay lập tức, và nó sẽ làm phức tạp mã để tách nó.

2

Futures.transform không phải là một chuỗi lưu loát như RxJava, nhưng bạn vẫn có thể sử dụng nó để thiết lập Future s phụ thuộc vào nhau. Dưới đây là một ví dụ cụ thể:

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 

Ví dụ này giả fileDownloader.download() trả về một thể hiện của FileClass, fileUpzipper.unzip() trả về một UnzippedFileClass vv Nếu FileDownloader.download() thay vì trả về một ListenableFuture<FileClass>, sử dụng AsyncFunction thay vì Function.

Ví dụ này cũng sử dụng Java 8 lambdas cho ngắn gọn. Nếu bạn không sử dụng Java 8, vượt qua trong việc triển khai mang tính chất của hàm hoặc AsyncFunction thay vì:

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

Thông tin thêm về transform đây: http://docs.guava-libraries.googlecode.com/git-history/release/javadoc/com/google/common/util/concurrent/Futures.html#transform (di chuyển hoặc tìm kiếm "cải tạo" - sâu liên kết dường như đang bị hỏng)

Các vấn đề liên quan