2

我是使用 PersistentActor 的新手,当我尝试从未来的 onComplete 调用 updateState 时,失败,没有任何事情发生,尝试调试它,我确实进行了持久调用,但没有进入 updateState

trait Event
case class Cmd(data: String)
case class Evt(data: String) extends Event

class BarActor extends PersistentActor{
  implicit val system = context.system
  implicit val executionContext = system.dispatcher
  def updateState(event: Evt): Unit ={
    println("Updating state")
    state = state.updated(event)  
    sender() ! state

  }
  def timeout(implicit ec: ExecutionContext) =
    akka.pattern.after(duration = 2 seconds, using = system.scheduler)(Future.failed(new TimeoutException("Got timed out!")))

  val receiveCommand: Receive = {
    case Cmd(data) =>

      def anotherFuture(i: Int)(implicit system: ActorSystem) = {
        val realF = Future {
          i % 2 match {
            case 0 =>
              Thread.sleep(100)
            case _ =>
              Thread.sleep(500)
          }
          i
        }
        Future.firstCompletedOf(Seq(realF, timeout))
          .recover {
          case _ => -1
        }
      }
      val res = (1 to 10).map(anotherFuture(_))
      val list = Future.sequence(res)
      list.onComplete{
        case _ =>
          persist(Evt("testing"))(updateState)
      }
  }
}
4

1 回答 1

2

你可以试试这个:

  list.onComplete {
    case _ => self ! Evt("testing")
  }

并将其添加到 receiveCommand

case evt: Evt =>
  persist(Evt("testing"))(updateStates)
于 2015-07-06T09:23:36.520 回答