转到相同状态后,FSM actor没有触发onTransition [英] FSM actor is not firing onTransition after goto to the same state

查看:74
本文介绍了转到相同状态后,FSM actor没有触发onTransition的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

根据 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()
}


推荐答案

问题已报告,将在版本2.4

这篇关于转到相同状态后,FSM actor没有触发onTransition的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆