【问题标题】:Akka remote actors cannot communicate between Play! applicationsAkka 远程 Actor 无法在 Play 之间进行通信!应用
【发布时间】:2013-02-06 14:32:40
【问题描述】:

我正在测试两个 Play 之间 Akka 远程 Actor 的使用! 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 控制台上看到的消息都没有出现。

不知道我在哪里出错了。

【问题讨论】:

    标签: playframework playframework-2.0 akka actor playframework-2.1


    【解决方案1】:

    Akka.system 是 Play 提供的演员系统,你把它和你自己的演员系统混在一起了。尝试只使用你自己的actor系统,即将代码更改为:

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

    【讨论】:

    • 太棒了!我一回家就测试。谢谢帕特里克。进行远程处理时是否需要创建新的参与者系统?不能播放默认演员系统?
    • 是的,您应该能够为此使用 Play 的默认演员系统,在这种情况下,您必须在 application.conf 中的“顶级”配置远程处理(即设置 akka.remote.*在那里)。
    • 嗯,我做了些改动,简单测试了一下,还是没有得到预期的结果,app2还是没有在console上打印任何东西,等我有更多的时间调试之后再恢复。
    猜你喜欢
    • 2015-07-01
    • 2020-05-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2015-09-09
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多