FSM actor 在转到相同状态后不会触发 onTransition

2024-01-14

根据Akka FSM 文档 http://doc.akka.io/docs/akka/snapshot/scala/fsm.html:

笔记 可以使用 goto(S) 或stay() 实现相同状态转换(当前处于状态 S 时)。它们之间的区别在于 goto(S) 将发出一个可由 onTransition 处理的事件 S->S 事件,而stay() 则不会。

我通过扩展 FSM 创建了 actor。当我的 actor 处于状态数据 Data3 的“On”状态时,它会切换到状态数据 Data2 的状态“On”。我使用 Data2 来使用“goto(On)”。我预计将执行“onTransition On->On”方法,但事实并非如此。应该发出事件 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()
}

This issue https://www.assembla.com/spaces/akka/tickets/3970#/activity/ticket:已报告并将修复2.4版本 https://groups.google.com/forum/#!topic/akka-user/zPJOLe0V760

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FSM actor 在转到相同状态后不会触发 onTransition 的相关文章

随机推荐

  • html 表格内的间距

    如何增加此表 第 1 行 第 1 单元格 中的空间 table border 1 tr td Row 1 cell 1 td td Row 1 cell 2 td tr table 请在此处检查图像 http img227 imagesha
  • 如何使用 XSLT 生成 HTML 表单?

    我有一张表格要填写
  • 您可以在 GAE 灵活环境中使用部分 vCPU 吗?

    我正在将应用程序从 GCE 转换为 GAE Flex 它目前在 g1 small 实例中运行 这足以满足我的需求 但是当我尝试在我的实例中指定 g1 small 实例时app yaml resources cpu 0 5 memory gb
  • java - arraylist 检查元素是否存在,忽略大小写

    您好 我有一个数组列表 它存储字符串值 我想检查列表中是否存在某个字符串 在这里我想忽略区分大小写 code public static ArrayList lt String gt arrFoodItems new ArrayList l
  • 使用 GCC 和 GDB (CodeBlocks)“警告:无法找到值 XXX 值的虚拟表的链接器符号”

    我收到一个运行时错误 内存无法写入 在通过调试器检查后 导致标题中出现警告 标头如下 组件 h ifndef COMPONENTE H define COMPONENTE H using namespace std class compon
  • 如何将 .chm 帮助文件添加到 Lazarus 构建的应用程序中?

    我可以在网上找到的唯一文档将我指向一个名为的演示应用程序Ihelp在我的 Lazarus 版本 v1 2 4 中似乎不存在 我已经创建了 chm 帮助文件 只是想让它在用户按 F1 或从弹出菜单中选择 帮助 时可用 FCL中有一个CHM组件
  • vector::iterator - 无效? [复制]

    这个问题在这里已经有答案了 可能的重复 g 不是类型 错误 https stackoverflow com questions 1301380 g is not a type error 以下内容无法编译 1 template
  • 当锁屏出现时 Android 启动意图

    我正在尝试开发替代锁屏 因为我需要一个意图过滤器来监听屏幕关闭 但问题是我不知道要使用哪个属性以及要给出哪个值 也在做同样的事情 这就是问题 https stackoverflow com questions 10800683 androi
  • 为什么使用 Java 套接字永远无法到达输入流的末尾?

    我正在用 Java 编写一个简单的代理 我无法将整个给定请求读入字节数组 具体来说 在下面的循环中 即使客户端已发送了它将发送的所有数据 即永远不会到达流的末尾 对 read 的调用也会阻塞 由于在读取完整的输入之前我无法确定是否是开始写入
  • 如何让数据对齐到html表格行的顶部

    我有这个 html 表 其中表中有一个单元格rowSpan 3 因此 在第一列中 我有 3 行带有输入 在第二列中 我有一张显示跨越所有 3 列的图片 我试图弄清楚浏览器如何计算出如何为第一列中的每一行垂直分配间距 然后我想变得 紧 这样所
  • 使用本地文件在远程数据库中执行 COPY 命令

    我正在尝试执行 PostgresCOPY命令 COPY warehouse terminal test table FROM C file csv DELIMITERS E t CSV HEADER QUOTE E ESCAPE E NUL
  • 使用 Json.NET 从 Json String 反序列化嵌套 DataSet

    我尝试使用 Json NET 从 JSON 字符串反序列化数据集 Json 字符串包含我想要使用的状态 消息和表 status ok message table column1 value1 column2 value2 column1 v
  • 该网站如何知道我正在打开另一个选项卡?

    当我登录一个网站 这是我大学的 学习系统 时 我发现我无法打开打开同一网站的新选项卡 当我这样做时 该网站不知何故会意识到并显示以下消息 该网站到底如何知道我在计算机上打开了哪些选项卡 据我所知 前端代码不应该访问我的私人浏览器信息 该网站
  • Jquery hasClass + If 语句

    我希望以下 loadContent 函数仅在单击的链接具有特定类时加载目标 div 这是我到目前为止所想出的 function loadContent targetDIV sourceURL if this hasClass done ta
  • 如何清理 TeamCity 中旧的失败构建?

    我们在 TeamCity 中确实有数百个失败的构建 由于旧的失败设置重试 数量特别高 现在浏览历史记录非常痛苦 我只想清理旧的失败构建 TeamCity 中有办法做到这一点吗 正常的清理策略只允许在上次成功构建之前的 X 天进行清理 在 T
  • 执行默认信号处理程序

    我编写了一个应用程序 其中我为 linux 中的不同信号注册了多个信号处理程序 进程接收到信号后 控制权将转移到我注册的信号处理程序 在这个信号处理程序中 我做了一些我需要做的工作 然后我想调用默认信号处理程序 即SIF DFL or SI
  • Bash - 文件意外结束[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我一直在编写 bash 脚本来对程序运行测试 但我似乎无法找到语法错 误 当我使用 x 时 它告诉我它正在等待 但我找不到它 请参
  • 禁用 JSHint 警告:需要赋值或函数调用,但看到的是表达式 [重复]

    这个问题在这里已经有答案了 我有以下几行 imageUrl data imageUrl imageUrl 对于这一行 JSHint 抱怨道 Expected an assignment or function call and instea
  • 在非管理员用户下从远程运行 PS cmdlet - 访问被拒绝

    我正在尝试通过 Invoke Command 远程运行 Get ScheduledTask 该用户是非管理员 但属于 远程管理用户 的一部分 PS 远程处理工作正常 在本地运行命令效果很好 但是通过 Invoke Command 运行它会出
  • FSM actor 在转到相同状态后不会触发 onTransition

    根据Akka FSM 文档 http doc akka io docs akka snapshot scala fsm html 笔记 可以使用 goto S 或stay 实现相同状态转换 当前处于状态 S 时 它们之间的区别在于 goto