2016-10-02 16 views
2

私はPlay & Akkaを使用してWebサービスを構築しましたが、今ではWebサービスがクライアントである別のWebサービスを統合する必要があります。 (関連するルートファイル付き)Akkaアクターと再生フレームワークでWebServiceを使用する

私のデフォルトコントローラが

class myController @Inject() (implicit val messagesApi: MessagesApi, 
    config: play.api.Configuration) extends Controller with I18nSupport { 
// Actions 
} 

のように見えるこれは、大規模なアクター・システムをスピンアップし、すべてが良いです。

俳優の一人は、以下のように定義される -

class ActorMgr (jobId: Long, 
    config: Config) extends Actor with ActorLogging { 
// Actor specific stuff 
} 

私の問題は、私は今、この俳優から新しいWebサービスを呼び出すために必要があるということです。このWebサービスは、このアクタの結果を記録するデータベースです。

私が見て上記の手順を1として(とりわけ)

  1. https://playframework.com/documentation/2.5.x/ScalaWS
  2. Dependency injection with abstract class and object in Play Framework 2.5

からの指示に従ってきた、私は私が必要とするクラスにWSClientを注入することになっていますそれにアクセスする。

私はこの作品

class DbController @Inject() (ws: WSClient) extends Controller { 
    def post = Action { 
     // access webservice 
    } 
} 

以下のように、第2のコントローラに依存性注入を解決することができるよ、と私はそれがルートににマッピングされているURLにアクセスして、「ポスト」のアクションを実行することができますしたがって、Webサービスにアクセスします。私は今も2つのコントローラーを持っています。

私の問題は、ActorMgr(Akka Actor)からWebサービスコントローラーの「ポスト」メソッドにアクセスすることです。どのように私はそれを有効にするのですか?

+0

にあなたはここを参照してください、俳優を作成するために、依存性注入を使用することができます。https://www.playframework.com/documentation/2.5.x/ScalaAkka#依存関係注入アクター – Haspemulator

+0

Haspemulator、あなたの応答に感謝します。それは私の元の質問の部分(私はどのように依存関係を俳優に注入するのか)に答えましたが、私の問題は解決しませんでした。私は私の質問の一部を再構成したので、それはより明確です。 –

+0

ここに最後に何をしたのですか? –

答えて

0

多くの研究の末、私はここで結果を更新したいと思っていました。私は以下のように私の特定の問題を解決することができましたが、ここにはもっと多くのことがあります。

最初の私の具体的な解決策 -

代わりのDbController、I以下のようにwraped私のサービスおよび必要な場合、それを注射し -

trait Db { 
    def post 
} 

class InfluxDb @Inject() (ws: WSClient) extends Db { 
    val logger = LoggerFactory.getLogger(classOf[InfluxDb]) 
    logger.info("InfluxDb: Initiatlized")  

    def post = { 


    val req = ws.url("http://localhost:9086/write") 
       .withQueryString("db" -> "db1") 
       .withHeaders("Content-Type" -> "application/json") 
       .post("job_id,command=PUT value=99") 

    logger.debug("InfluxDb: Post")  
    } 
} 

は、原料を注入すると、私の問題のトンを与えた、と述べました。

  1. Guiceのアッカ&を使用して、トップレベルの役者
  2. をPlayframework +アッカ+ Guiceのを使用し、注入Playframework
  3. を使用していない - 私は最終的にいくつかの明確なユースここに例があることに気づきました
  4. Playframework + Akka + Guiceを使用して子供の俳優を注入する
  5. playframework + Akka + Guiceを使用していますが、「injectin g "あなたのトップレベルの俳優&アクターシステム。

上記のそれぞれを解決する方法は次のとおりです。 (2)&についてguice akka tutorial

  • を参照してください(3) - - (4)これは、あなたが意志
  • もう少しトリッキーであるためPlayframework Documentation

  • を参照してください(1)については

    1. "IndirectActorProducer"を拡張してからActorRefを作成する必要があります。問題は、 "小道具"がGuiceとのインターフェース方法を知らないことです。これは、(1)のソリューションの一部でもあります。

      以下のサンプルコードは、4つの使用例をすべて示し、コンパイルしています。下のコード

      ParentActor - Case(3)を使用するChildActor、Case(4)を使用するParentActor_2 & ChildActor_2を参照してください。

      // play imports 
      import play.api.mvc._ 
      import play.api.Logger 
      import play.api.mvc.Results 
      
      // actor imports 
      import akka.actor.{Actor, ActorSystem, ActorRef, Props, IndirectActorProducer} 
      
      // DI imports 
      import com.google.inject.{Injector, AbstractModule, Key, Provides} 
      import javax.inject._ 
      import com.google.inject.assistedinject.Assisted 
      import play.libs.akka.AkkaGuiceSupport 
      import play.api.libs.concurrent.InjectedActorSupport 
      
      
      class MainCntrlr @Inject() (injector : Injector, 
                @Named("PActor") pa: ActorRef, 
                cfP: ParentActor_2.Factory) 
                extends Controller { 
          Logger.debug("MainCntrlr: created")  
      
          val pa_2 = ActorSystem("test") 
             .actorOf(Props(classOf[GuiceActorProducer], injector, "PActor_2"), "PA_2") 
      
          pa ! 12    
          pa_2 ! 100 
      
          def index   = Action { Ok (views.html.index.render()) } 
      } 
      
      
      class ParentActor @Inject() (cf: ChildActor.Factory) extends Actor with InjectedActorSupport { 
          Logger.debug("ParentActor: created") 
          val cactor = injectedChild(cf(2),"childActor") 
          cactor ! 10 
      
          def receive = { case _ => Logger.debug("ParentActor received msg") } 
      } 
      
      
      object ChildActor { trait Factory { def apply(i: Int) : Actor } } 
      class ChildActor @Inject()(i: Injector, @Assisted v: Int) extends Actor { 
          Logger.debug("ChildActor: created with value " + v.toString) 
      
          def receive = { case _ => Logger.debug("ChildActor received msg") } 
      } 
      
      class ParentModule extends AbstractModule with AkkaGuiceSupport { 
          def configure() = { 
          bindActor(classOf[ParentActor],"PActor") 
          bindActorFactory(classOf[ChildActor], classOf[ChildActor.Factory]) 
          bindActorFactory(classOf[ParentActor_2], classOf[ParentActor_2.Factory]) 
          bindActorFactory(classOf[ChildActor_2], classOf[ChildActor_2.Factory]) 
          } 
      } 
      
      
      object ParentActor_2 { trait Factory { def apply() : Actor } } 
      class ParentActor_2 @Inject() (cf: ChildActor_2.Factory) extends Actor with InjectedActorSupport { 
          Logger.debug("ParentActor_2: created") 
          val cactor = injectedChild(cf(4),"childActor_2") 
          cactor ! 10 
      
          def receive = { case _ => Logger.debug("ParentActor_2 received msg") } 
      } 
      
      
      object ChildActor_2 { trait Factory { def apply(i: Int) : Actor } } 
      class ChildActor_2 @Inject() (i: Injector, @Assisted v: Int) extends Actor { 
          Logger.debug("ChildActor_2: created with value " + v.toString) 
      
          def receive = { case _ => Logger.debug("ChildActor_2 received msg") } 
      } 
      
      
      class GuiceActorProducer(val injector: Injector, val actorName: String) 
           extends IndirectActorProducer { 
      
          override def actorClass = classOf[ParentActor_2] 
          override def produce() = 
          injector.getBinding(Key.get(classOf[ParentActor_2])).getProvider.get() 
      } 
      

      そして、私のapplication.conf

      play.modules.enabled += "package.ParentModule" 
      
  • 関連する問題