2016-09-06 6 views
4

Java 8素晴らしいフィーチャーCompletableFutureを使用して、この新しいフィーチャーの例外を使用して古い非同期コードを変換したいと思います。しかし、チェックされた例外は私を悩ますものです。ここに私のコードです。CompletableFutureでチェック例外が発生しました

CompletableFuture<Void> asyncTaskCompletableFuture = 
       CompletableFuture.supplyAsync(t -> processor.process(taskParam)); 

processメソッドのシグネチャ:

public void process(Message msg) throws MyException; 

私はComletableFutureでそのチェック例外に対処するにはどうすればよいですか?

+2

がhttp://stackoverflow.com/questions/18198176/java-8-lambda-function-that-throws-を参照してください。例外はおそらく複写として閉じられる – mtj

+3

@mjtこのAPIは例外の特定の処理を持っているため、この質問はCompletableFutureのコンテキストで議論する価値があると思います。 –

+1

リンクされた質問はより一般的であり、したがって、この質問も網羅しています。 – Tunaki

答えて

2

私はこの方法で試しましたが、問題を解決する良い方法かどうかはわかりません。

サプライヤーのFunctionalInterfaceで
@FunctionalInterface 
public interface RiskEngineFuncMessageProcessor<Void> extends Supplier<Void> { 
    @Override 
    default Void get() { 
     try { 
      return acceptThrows(); 
     } catch (final Exception e) { 
      throw new RuntimeException(e); 
     } 
    } 

    Void acceptThrows() throws Exception; 

、私は例外をラップすることができます。

final MyFuncProcessor<Void> func =() -> { 
      processor.process(taskParam); 
      return null; 
     }; 

     CompletableFuture<Void> asyncTaskCompletableFuture = 
       CompletableFuture.supplyAsync(func) 
         .thenAccept(act -> { 
          finishTask(); 
         }) 
         .exceptionally(exp -> { 
          log.error("Failed to consume task", exp); 
          failTask(exp.getMessage()); 
          return null; 
         }); 
+1

'Void'はJDKのクラスです。インターフェイス定義の型パラメータ名として使用しないでください。削除するか(ここでは役に立たないように)、別の名前を使用してください。一文字の名前がよく使われています。 'T 'は' Supplier'インターフェース定義で使われている名前であることをお勧めします。 –

+2

また、結果を返す必要はないと思われるので、おそらく['runAsync()'](https://docs.oracle.com/javase/8/docs/api/java/util/concurrent /completableFuture.html#runAsync-java.lang.Runnable-)、 'supplyAsync()'、 '' thenRun() '](https://docs.oracle.com/javase/8/docs/api/java)を参照してください。 /util/concurrent/CompletableFuture.html#thenRun-java.lang.Runnable-) 'thenAccept()'の代わりに使用します。 –

+2

不特定の 'RuntimeException'の代わりに[' CompletionException'](https://docs.oracle.com/javase/8/docs/api/?java/util/concurrent/CompletionException.html)を投げることをお勧めします。 'CompletableFuture'でスムーズに作業します。 – Holger

関連する問題