playframework - Akka 远程 actor 无法在 Play!应用程序

标签 playframework playframework-2.0 akka actor playframework-2.1

我正在测试两个 Play 之间 Akka 远程角色的使用! v2.1-RC4 应用程序。

这是我来自 App1 的代码

override def onStart( app: Application ) {

val system = ActorSystem("App1System", ConfigFactory.load.getConfig("app1"))
val remoteActor = Akka.system().actorFor("akka://App2System@127.0.0.1:9003/user/app2Actor")
println(s"remote actor : ${remoteActor.path}")

val jobsActor = Akka.system.actorOf(Props(new Actor {
  def receive = {
    case "Job1" => { println("\nsending Job #1 at regular intervals to App2\n"); remoteActor ! "Job1" } 
    case "Job2" => { println("\n... sending doing job #2, 7 seconds after start, only once\n"); remoteActor ! "Job2" }
  }
}), "app1Actor")

// Repeat every 5 seconds, start 5 seconds after start
Akka.system.scheduler.schedule(
  5 seconds,
  5 seconds,
  jobsActor,
  "Job1"
)

// do only once, 7 seconds after start
Akka.system.scheduler.scheduleOnce(7 seconds, jobsActor, "Job2")
}

这是 App1 的配置文件:

 akka {
  actor {
    provider = "akka.remote.RemoteActorRefProvider"
  }
  remote {
    transport = "akka.remote.netty.NettyRemoteTransport"
    netty {
      hostname = "127.0.0.1"
      port = 9002
    }
  }
}

app1 {
  include "common"
}

来自 App2 的代码:

    override def onStart( app: Application ) {

    val system = ActorSystem("App2System", ConfigFactory.load.getConfig("app2"))
    val app2Actor = Akka.system.actorOf(Props(new Actor {
      def receive = {
        case "Job1" => println("App 2: doing Job #1 at regular intervals")
        case "Job2" => println("App 2: ... doing job #2, 7 seconds after start, only once")
        case _ => println("App 2 recieved other message")
      }
    }), "app2Actor")

    println(s"app 2 actor : ${app2Actor.path}")

  }

来自 App2 的配置:

akka {
  actor {
    provider = "akka.remote.RemoteActorRefProvider"
  }

  remote {
  transport = "akka.remote.netty.NettyRemoteTransport"
    netty {
      hostname = "127.0.0.1"
      port = 9003
    }
  }
}

app2 {
  include "common"
}

我已按照链接 Akka - Remoting 中的说明进行操作

App1 的控制台输出:

[info] application - Application started
[INFO] [02/06/2013 21:56:49.570] [New I/O  worker #1] [NettyRemoteTransport(akka://application@127.0.0.1:9002)] RemoteServerStarted@akka://application@127.0.0.1:9002
[info] play - Starting application default Akka system.
remote actor : akka://App2System@127.0.0.1:9003/user/app2Actor
[info] play - Application started (Dev)

sending Job #1 at regular intervals to App2

[INFO] [02/06/2013 21:56:54.918] [application-akka.actor.default-dispatcher-5] [NettyRemoteTransport(akka://application@127.0.0.1:9002)] RemoteClientStarted@akka://App2System@127.0.0.1:9003

... sending doing job #2, 7 seconds after start, only once 
sending Job #1 at regular intervalsto App2
sending Job #1 at regular intervalsto App2
sending Job #1 at regular intervalsto App2

[info] application - Application stopped
[info] play - Shutdown application default Akka system.
[INFO] [02/06/2013 21:57:10.619] [application-akka.actor.default-dispatcher-16] [NettyRemoteTransport(akka://application@127.0.0.1:9002)] RemoteClientShutdown@akka://App2System@127.0.0.1:9003
[INFO] [02/06/2013 21:57:10.635] [application-akka.actor.default-dispatcher-16] [NettyRemoteTransport(akka://application@127.0.0.1:9002)] RemoteServerShutdown@akka://application@127.0.0.1:9002

App2 的控制台输出:

[info] play - Listening for HTTP on /0:0:0:0:0:0:0:0:9001

(Server started, use Ctrl+D to stop and go back to the console...)

[info] Compiling 6 Scala sources and 1 Java source to /home/rudy/development/projects/Actor/target/scala-2.10/classes...
[info] application - Actor Application started
[INFO] [02/06/2013 21:50:41.899] [New I/O  worker #1] [NettyRemoteTransport(akka://application@127.0.0.1:9003)] RemoteServerStarted@akka://application@127.0.0.1:9003
[info] play - Starting application default Akka system.
app 2 actor : akka://application/user/app2Actor
[info] play - Application started (Dev)
[INFO] [02/06/2013 21:56:54.961] [application-10] [NettyRemoteTransport(akka://application@127.0.0.1:9003)] RemoteClientStarted@akka://application@127.0.0.1:9002
[INFO] [02/06/2013 21:57:10.626] [application-7] [NettyRemoteTransport(akka://application@127.0.0.1:9003)] RemoteClientShutdown@akka://application@127.0.0.1:9002

我可以看到 App1 能够在路径上找到 App2 Actor(没有 DeadLetter),但是我希望在 App2 控制台上看到的消息都没有出现。

不确定我哪里出错了。

最佳答案

Akka.system 是 Play 提供的 Actor 系统,您将其与您自己的 Actor 系统混在一起。尝试只使用您自己的 Actor 系统,即将代码更改为:

val remoteActor = system.actorFor
val jobsActor = system.actorOf
system.scheduler.schedule

val app2Actor = system.actorOf

关于playframework - Akka 远程 actor 无法在 Play!应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14731553/

相关文章:

mysql - FlywayDB : Migration fails with "Error executing statement", 但手动运行迁移 SQL 代码有效

playframework - 玩! textmate 的 bundle 给了我错误

playframework - 无法在 Play 框架项目中加载依赖项

scala - Akka 不会使用命令行参数覆盖 application.conf

java - Play Framework 的 Eclipse 运行配置

scala - Play Framework/Scala 表单中特定于字段的错误消息

java - 在 Facebook Connect 中获取 access_token

java - Play 2.2 框架中打开的文件(套接字)过多

scala - 使用 TestActorRef 测试 actor 崩溃

java - 如何在 Play Framework 模板中使用我自己的 Iterable