每次都不处理akka persist函数

时间:2017-11-06 08:54:23

标签: akka persistence

我使用akka的PersistentActor在群集中进行分片以跟踪我的状态。我有一个'房间',我可以通过以下代码更新:

case UpdateRoom(id, room, userId) => ((ret: ActorRef) => {
  (userRegion ? GetRoleForRoom(userId, id)).mapTo[String] map { role =>
    if (role == "owner") {
      state = Some(room)
      ret ! Success(room)
      eventRegion ! RoomEventPackage(id, RoomUpdated(room))
      println("works")
      persist(RoomUpdated(room))(e => println("this doesn't always fire")
    } else {
      ret ! Failure(InsufficientRights(role, "Update Room"))
    }
  }

问题是persist只能在其他时间工作,而函数的其余部分按预期工作。 (“作品”每次都会被打印出来,“这并不总是一直发射”,而是两次)。 我总是要两次触发更新命令来存储我的事件,但是它似乎存储了两次我发出命令。

我错过了akka persist的重要部分吗?

1 个答案:

答案 0 :(得分:1)

我认为你在Actor的世界中犯了一个严重的错误:从外部访问演员(可变)状态。在您的情况下,这种情况会在Future / ask返回的?的回调中发生两次:

  • 更新状态时:state = Some(room)
  • 致电persist

Actor内处理询问并随后修改演员状态的唯一安全方法是从ask的回调向同一个演员发送消息,为此,你可以使用{{1} }。

使用代码的简化版本来说明:

pipeTo

另见:https://doc.akka.io/docs/akka/2.5.6/scala/general/jmm.html#actors-and-shared-mutable-state