1

私は両方を提供することになっているプロジェクトを始めています:

  • シンプルなhttpAPIと
  • その他の機能(低レベルのネットワークを含む)。

これが、「その他の機能」を(新しい)Playフレームワークプロジェクトと統合し、その場でのコンパイルやその他の利点を利用したい理由です。アプリケーションの大部分(ビジネスロジックとサーバーの負荷の両方の観点から)は、プロジェクトの非Web部分にあります。

だから私の質問は、これらのモジュールを両方とも1つのScalaアプリケーションにパックするにはどうすればよいですか?

私が見つけた最善のアプローチは、非WebパーツをPlayプロジェクトのプラグインとして扱うことです。ただし、アプリケーションの大部分がそのような「プラグイン」になってしまう可能性があることを考えると、これが正しいアプローチであるかどうかはわかりません。

2つの部分を別々のアプリケーションとしてデプロイすることを考えましたが、うまくいくとは思えません。アプリケーションで(とりわけ)キャッシュ、構成、およびデータベース接続を共有したいので、実際にそれらを分離するべきではありません。

私はまだScalaもPlayも経験していないので、ご意見をいただければ幸いです。

4

1 に答える 1

5

Akkaアクターシステムを使用して、既存のビジネスロジックとネットワークサービスを統合することをお勧めします。複数のAkkaアクターシステムを簡単に追加して、Playアプリケーションの完全なシステムに統合できます。Playには、利用できる内部アクターシステムも付属しています。

したがって、既存のロジックをアクターシステム自体にラップすることも、既存のシステムとの統合を処理する小さなアクターシステムを構築し、Playアプリケーションのロード時にそれらのコネクターをアクターシステムとして起動することもできます。

Playアプリケーションのロード時に内部アクターシステムをロードする方法の例を次に示します。

object Global extends GlobalSettings {

  override def onStart(app: Application) {
    Logger.info("Application starting...")
    lazy val enabled = Play.configuration.getString("external-service").filter(_ == "enabled").isDefined

    // Start External service
    enabled match {
      case true => {
        Logger.info("External service is enabled.")
        Akka.system.actorOf(Props[ExternalServiceClient], name = "serviceClient")
      }
      case false => {
        Logger.info("External service is disabled.")
      }
    }
  }

  override def onStop(app: Application) {
    Logger.info("Application shutdown...")
  }
}

必要に応じて、アプリケーション内に新しいアクターシステムをロードして、次のようにすることもできます。

  import akka.actor.ActorSystem

  val eventSystem = ActorSystem("events")

  // Start a service using the ActorSystem
  val eventService = EventService(eventSystem)

  // Create an Actor in the ActorSystem
  val eventActor = eventSystem.actorOf(Props[EventActor], name = "eventactor")

Play Akkaの統合について詳しくは、こちらをご覧ください。Playには、 ScalaAsyncなどの機能を備えた組み込みのアクターシステムを利用できる組み込みの機能もあります。したがって、外部サービスが主にHTTPベースのサービスである場合は、このアプローチが最適な場合があります。外部サービス用のアクターシステムを構築する場合は、ここで説明されているように、リモートアクターとしてアクセスできます。AkkaRemoting

于 2012-11-04T18:03:04.090 に答える