ListenableFuture
私たちのアプリケーションには、次のように、ベースのAPIを実装する多くのサービスがあります。
public interface MyService {
ListenableFuture<Thing> getMyThing();
ListenableFuture<?> putMyThing(Thing thing);
}
私たちのドメインモデルはまったくスレッドセーフではないため、前述のサービスを除いて、ほとんどのコードをよく知られたシングルスレッドで実行しますExecutor
。Future
サービスが、生成するに追加されたリスナーがその上で呼び出されることを保証できれば、それは素晴らしいことだと思いますExecutor
。
もちろん、を呼び出すかListenableFuture.addListener
、適切な引数を使用して、サービスのクライアントでこれを強制することはできますが、私が目指しているのは、クライアントコードの複雑さとエラーの可能性を正確に減らすことなので、リスナーが欲しいですこれらのメソッドが引数を渡さずに呼び出されたときに、よく知られている場所で発生する呼び出し。Futures.addCallback
Futures.transform
Executor
Executor
Executor
したがって、今のところ、私はサービスのメソッドを次のように実装しています。
class MyServiceImpl {
private Executor executor; /* the "main" executor */
public ListenableFuture<Thing> getMyThing() {
ListenableFuture<Thing> future = ...; /* actual service call */
return Futures.transform(future, Functions.<Thing>identity(), executor );
}
}
まず、これも機能しますか?Guavaの情報源からはそう思われますが、何らかの確認ができてうれしいので、これを単体テストすることを考えるのに少し苦労しています。
さらに、「サービスは指定されたスレッド(デフォルト)でコールバックする」パターン全体の有用性/コストの比率について少し心配しています。誰かがこのようなことを経験したことがありますか?このアプローチに隠れた落とし穴はありますか?