scala - 转到相同状态后,FSM actor 未触发 onTransition

标签 scala akka

根据 Akka FSM docs :

Note Same-state transitions can be implemented (when currently in state S) using goto(S) or stay(). The difference between those being that goto(S) will emit an event S->S event that can be handled by onTransition, whereas stay() will not.

我通过扩展 FSM 创建了 actor。当我的 actor 处于状态数据 Data3 的“On”状态时,它会切换到状态数据 Data2 的“On”状态。我使用“使用 Data2 的 goto(On)”。我预计将执行方法“onTransition On->On”,但事实并非如此。应该发出 Event On->On。 这是我运行此 actor 时的输出:

Off, event Message! with state Data1
onTransition: Off->On Data3
On, timeout with Data3
On, timeout with Data2
On, timeout with Data1
onTransition: On ->Off Data1

知道我做错了什么吗?

这是来源:

import akka.actor.FSM
import scala.concurrent.duration._

trait State
case object On extends State
case object Off extends State

sealed trait Data
case object Data1 extends Data
case object Data2 extends Data
case object Data3 extends Data

class SomeFsm extends FSM[State,Data] {

  startWith(Off,Data1)

  when(On,stateTimeout = 1 second) {
    case Event(StateTimeout,Data3) => println("On, timeout with Data3");goto(On) using Data2
    case Event(StateTimeout,Data2) => println("On, timeout with Data2");goto(On) using Data1
    case Event(StateTimeout,Data1) => println("On, timeout with Data1");goto(Off) using Data1
  }

  when(Off){
    case Event(m,s) => println(s"Off, event $m with state $s");goto(On) using Data3
  }

  whenUnhandled{
    case Event(e, s) =>
      log.warning("received unhandled request {} in state {}/{}", e, stateName, s)
      stay()
  }

  onTransition{
    case On -> On =>
      print("onTransition: ")
      nextStateData match {
      case Data3=> println("On ->On (Data3")
      case Data2=> println("On ->On (Data2")
      case Data1=> println("On ->On (Data1")
    }
    case On-> Off => println(s"onTransition: On ->Off $nextStateData")
    case Off-> On => println(s"onTransition: Off->On $nextStateData")
  }

  initialize()
}

最佳答案

issue已报告并将在 version 2.4 中修复

关于scala - 转到相同状态后,FSM actor 未触发 onTransition,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27356655/

相关文章:

java - 如何在 Spark (Scala) 中合并 2 个数据帧?

scala - 为什么 Scala 没有为每个 monad 定义返回/单元函数(与 Haskell 相比)?

scala - 需要帮助了解此代码中 ->、{} 和 () 的用法

java - 在 Akka 中从客户端向服务器发送毒丸

scala - 选择Akka还是Spark进行并行处理?

java - 在 Play 上强制执行 SSL!框架

scala - Scala 的 SQL DSL

multithreading - 多线程方法与 Akka Actor 模型

scala - 值 resolveOne 不是 akka.actor.ActorSelection 的成员

java - Play Framework 2 - 如何在不调用 .get() 的情况下等待多个 WS 响应?