转到相同状态后,FSM actor没有触发onTransition [英] FSM actor is not firing onTransition after goto to the same state
问题描述
根据 Akka FSM文档:
注意
可以使用goto(S)或stay()实现相同状态的转换(当前处于状态S时)。两者之间的区别是goto(S)会发出事件S-> S事件,可以通过onTransition处理,而stay()则不能。
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创建了演员。当我的演员的状态数据为Data3时处于打开状态时,它会切换为状态数据为Data2时处于打开状态。我使用Data2使用 goto(On)。我期望将执行方法 onTransition On-> On,但不会执行。应发出事件On-> On。
这是我运行时的输出这个演员:
I have created actor by extending FSM. When my actor is in state "On" with state data Data3, it switch to state "On" with state data Data2. I use "goto(On) using Data2. I have expected that method "onTransition On->On" will be performed but it is not. Event On->On should be emitted. Here is an output when I run this 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()
}
推荐答案
这篇关于转到相同状态后,FSM actor没有触发onTransition的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!