[英]Accessing states of an Akka Actor through messages
我正在嘗試通過消息訪問特定參與者的狀態。 我不知道如何獲取演員的狀態。 在這里,我需要訪問Node的狀態變量state1。 我想避免在代碼中使用promise / futures。 如果要這樣做,應該如何修改此代碼?
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.
手動處理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()
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.