【问题标题】:Calling Akka actor from Play controller从 Play 控制器调用 Akka 演员
【发布时间】:2014-06-27 10:55:57
【问题描述】:

我一直在使用distributed worker pattern,但在从网络请求推送工作时遇到了问题。

示例项目有一个前端:

val mediator = DistributedPubSubExtension(context.system).mediator

  def receive = {
    case work =>
      log.info("Frontend received: " + work.toString())
      implicit val timeout = Timeout(5.seconds)
      (mediator ? Send("/user/master/active", work, localAffinity = false)) map {
        case Master.Ack(_) => Ok
      } recover { case _ => NotOk } pipeTo sender
  }

还有一个 WorkProducer:

override def preStart(): Unit =
    scheduler.scheduleOnce(5.seconds, self, Tick)

def receive = {
    case Tick =>
      n += 1
      log.info("Produced work: {}", n)
      val work = Work(nextWorkId(), n)
      frontend ! work
      context.become(waitAccepted(work), discardOld = false)

  }

当我从 Play Framework 控制器直接发送到前端时,这一切都很好:

def multiply(num: Long) = Action {
    implicit request =>
        implicit val timeout = Timeout(5.seconds)
        val frontend = core.Main.frontend
        frontend ! num
        Ok
  }

消息似乎丢失了。前端收到消息,但下游的演员似乎没有。

我已修改播放配置以使用 ClusterActorRefProvider

play {
  akka {
    extensions = ["akka.contrib.pattern.ClusterReceptionistExtension"]    
    actor.provider = "akka.cluster.ClusterActorRefProvider"
    remote.netty.tcp.port=0
        }
}

但无济于事。

【问题讨论】:

    标签: playframework akka akka-cluster


    【解决方案1】:

    我一直是布偶,没有发送正确的信息,控制器应该是这样的:

    def multiply(num: Long) = Action {
        implicit request =>
            implicit val timeout = Timeout(5.seconds)
            val frontend = core.Main.frontend
            val work = Work(nextWorkId(), num)
            frontend ! work
            Ok
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-28
      • 1970-01-01
      • 2012-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多