簡體   English   中英

通過消息訪問Akka Actor的狀態

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM