scala - Akka FSM Goto future

标签 scala akka fsm

我正在尝试将来更改 FSM 状态,但我不起作用..
我想我正在寻找类似 pipeTo 的方法。

When(State.Waiting) {
   case Event(anyMsg, anyData) =>
      asyncCode.map(res =>
         if (res == 1) {
            goto(State.Working) using Data.MyData
         } else {
            stay() replying "bad response"
         }

      )
}

转到命令 被执行 但 fsm 不会将状态更改为 State.Working

我自己找到了这个工作
When(State.Waiting) {
   case Event(anyMsg, anyData) =>
      asyncCode.map(res =>
         if (res == 1) {
            self ! "do job"
         } else {
            stay() replying "bad response"
         }

      )
   case Event("do job", anyData) => {
      goto(State.Working) using Data.MyData
   }
}

可能有更好的想法来解决问题

最佳答案

将来不要改变你的 Actor 的状态或任何不在主“线程”内的东西。
解决问题的正确方法是向 self 发送一条消息,它只会改变状态,例如

When(State.Waiting) {
  case Event(anyMsg, anyData) =>
    asyncCode.map(res =>
      if (res == 1) {
        self ! GoToWorking(Data.MyData)
      } else {
        self ! Stay
      }
    )
    goto(State.WaitingForResponse)
}

When (State.WaitingForResponse) {
  case Event(GoToWorking(data), _) =>
    goto(State.Working) using data
  case Event(Stay,_) =>
    stay()
}

关于scala - Akka FSM Goto future ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29489564/

相关文章:

scala - 不带 UDF 的 Spark 数据集的加权平均值

scala - 在 Scala 2.8 中,如何向文件写入(追加)一行?我应该使用 Java 类(class)还是为此使用原生的 Scala 函数?

Scala Akka Streams 合并过滤器和映射

delay - 带定时器时钟周期延迟的 vhdl-fsm

c++ - Boost fsm 和 Boost 状态图路径位置

generics - 如何在 Scala 中设置多个类型界限?

scala - Scala 中的聚合列表值

java - Akka 与 Java 7 的 future

java - 在 java 中使用 play framewok 和 akka 映射诊断上下文日志记录