2016-06-14 3 views
0

私は、データベース操作用の専用スレッドプールをplay-akka設定ファイルを介して割り当てました。今私は、このスレッドプールを必要とするサービスをアクターシステムに注入し、実行コンテキストにアクセスしています。カスタムエグゼキュータを再生アプリケーションに挿入するにはどうすればよいですか?

public class ServiceA{ 

    final Executor executionContext; 

    @Inject 
    public ServiceA(ActorSystem system) { 
     this.executionContext = system.dispatchers().lookup("akka.actor.db-context"); 
} 

しかし、これでServiceAをテストすることは難しくなります。私が代わりにしたいのは、Executorを次のように直接注入することです:

public class ServiceA{ 

    final Executor executionContext; 

    @Inject 
    public ServiceA(Executor dbExecutionCtx) { 
     this.executionContext = dbExecutionCtx; 
} 

どのようにすればいいですか?私はExeciceを注入するGuiceモジュールを作成しようとしましたが、起動されたアプリケーションがなく、クラスをバインドしているときにActorSystemにアクセスできないというエラーが出ます。

答えて

1

どこでもECを取得できるパターンを使用します。私はシングルトンにActorSystemを作成し、それを私のサービスに注入します。

私は、ActorSystems、Dispatchersなどの監視機能を備えた設計をしています。これを見て、あなたがそれを統合できるかどうかを見てください。

MyActorSystemがあなたのクラスに注入されている場合、そこからECにアクセスできます。 MyDispatcherとECの使用を見てください:

@Singleton 
public class MyActorSystem implements IMyActorSystem{ 

    ActorSystem system; 
    public MyActorSystem() { 
     system = ActorSystem.create(); 

    } 

    public ActorRef create() { 
     final ActorRef actor = system.actorOf(
       Props.create(MyWorker.class).withDispatcher("my-disp") 
     ); 
     return actor; 
    } 

    public void shutdown(){ 
     system.shutdown(); 
    } 

    public ExecutionContextExecutor getDispatcher(){ 
     return system.dispatcher(); 
    } 
    } 

    public class MyDispatcher implements IMyDispatcher { 

    MyActorSystem system; 

    @Inject public MyDispatcher(MyActorSystem system) { 
     this.system = system; 
    } 


    public CompletableFuture<Object> dispatch(final Object story) { 
     List<CompletableFuture<Object>> futureList = new ArrayList<>(); 
     final ActorRef actor = system.create(); 
     final CompletableFuture<Object> completed = FutureConverter 
       .fromScalaFuture(Patterns.ask(actor, story, 50000)).executeOn(system.getDispatcher()) 
       .thenApply(i -> (Object) i); 
     return completed; 
    } 

    public ExecutionContextExecutor getDispatcher(){ 
     return system.getDispatcher(); 
    } 
} 
+0

これは私がやったことの種類です。 getDispatcher()のようなメソッドを呼び出す必要がありますが、改善されたソリューションです。追加のメソッド呼び出しをせずにexecutorを直接注入する方法が他にもあるかどうかを調べようとしていました。 – jesukumar

関連する問題