Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 通过消息访问Akka参与者的状态_Scala_Akka - Fatal编程技术网

Scala 通过消息访问Akka参与者的状态

Scala 通过消息访问Akka参与者的状态,scala,akka,Scala,Akka,我试图通过消息传递访问特定参与者的状态。我不知道的是如何检索演员的状态。这里,我需要访问节点state1的state变量。我希望避免在代码中使用承诺/未来。如果我想这样做,我应该如何修改这段代码 class Node extends Actor { val state1:Int = 4 def receive = { case getState => { sender ! ??? //How should I send th

我试图通过消息传递访问特定参与者的状态。我不知道的是如何检索演员的状态。这里,我需要访问节点state1的state变量。我希望避免在代码中使用承诺/未来。如果我想这样做,我应该如何修改这段代码

class Node extends Actor {
   val state1:Int = 4

      def receive = {
          case getState => {
             sender ! ??? //How should I send the 'state1' to the sender?
          }
       }
}

class Master extends Actor {

  def recieve = {
    case someCase(node_actor:ActorRef) => {
      // My aim here is to get the "state1" from node actor into var 's'
      var s:Int = node_actor ! getState
    } 
  }
}

actor的设计完美地避免了手动处理scala.concurrent.事物。 只需将请求和响应处理分为不同的
receive
案例:

class Node extends Actor {
  import Node._
  val state1: Int = 4

  def receive: Receive = {
    case getState =>
      sender ! State(state1)

  }
}

class Master extends Actor {
  import Master._
  def receive: Receive = {
    case Action(node) =>
      // My aim here is to get the "state1" from node actor into var 's'
      node ! Node.GetState

    case Node.State(state) =>
      // do something with state
  }
}

object Master {
  case class Action(node: ActorRef)
}

object Node {
  case object GetState
  case class State(state: Int)
}
有时,你也可以计算一些中间值,在得到答案之前不想做任何事情,但无法实现也是不可接受的。因此,您可以在单独的
Receive
中等待节点响应,同时隐藏传入消息,如下所示:

class Master extends Actor with Stash {
  import Master._
  def receive: Receive = {
    case Action(node) =>
      val intermediate = scala.util.Random.nextLong()
      node ! Node.GetState
      context.become(waitingForState(calc = intermediate), discardOld = false)
  }

  def waitingForState(calc: Long): Receive = {
    case Node.State(state) =>
      // do something with state and calc
      context.unbecome()
      unstashAll()
    case _ => stash()
  }
}

你能写下为什么要避免使用future吗?这是实际实现中的一个限制,它阻止我使用future。我能描述它的最好方式是,它“中断”了超过特定数量的参与者,我希望使用尽可能多的参与者。请注意,您不必将多行
大小写
括在大括号中,只需在
大小写
行后缩进几行就足够了。我不知道,感谢您的建议,我创建主参与者只是为了让我的问题更清楚,节点是我实现中唯一的类,状态的通信和传递发生在这些节点参与者之间。这个解决方案似乎也能解决这个问题。