Scala 通过消息访问Akka参与者的状态
我试图通过消息传递访问特定参与者的状态。我不知道的是如何检索演员的状态。这里,我需要访问节点state1的state变量。我希望避免在代码中使用承诺/未来。如果我想这样做,我应该如何修改这段代码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
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。我能描述它的最好方式是,它“中断”了超过特定数量的参与者,我希望使用尽可能多的参与者。请注意,您不必将多行
大小写
括在大括号中,只需在大小写
行后缩进几行就足够了。我不知道,感谢您的建议,我创建主参与者只是为了让我的问题更清楚,节点是我实现中唯一的类,状态的通信和传递发生在这些节点参与者之间。这个解决方案似乎也能解决这个问题。