【问题标题】:Instrumenting Akka FSM检测 Akka FSM
【发布时间】:2014-05-28 13:16:20
【问题描述】:

我喜欢采用 FSM 所需的指标,直到它达到某个状态。 我不想用指标代码向我的类发送垃圾邮件,我想添加一个特性,它覆盖某些方法并在调用该方法时发出一条消息。

例如:

trait InstrumentedActorFSM[S,D] extends Actor with FSM[S,D] {self: Actor with FSM[S,D] with Logging  =>
  startTimer // start measuring time here with Graphite

  override def stop = {
    stopTimerAndEmitMessage // emit message to graphite
    super.stop
  }
}

遗憾的是,FSM 中的所有方法都被声明为最终方法并且不能被覆盖。我可以求助于 Cake 模式并嵌入一个 FSM 来重新实现所有调用,但这感觉很笨拙。有什么好主意吗?

【问题讨论】:

    标签: scala akka fsm


    【解决方案1】:

    您可以使用 onTransition 处理程序,例如:

    trait InstrumentedActorFSM[S,D] extends Actor with FSM[S,D] { ...
    
      onTransition {
        case _ -> SomeState => stopTimerAndEmitMessage
      }
    
    }
    

    【讨论】:

    • 这对我不起作用,因为那时我将无法将 onTransition 用于其他任何事情。
    • 来自akka docs:支持多个这样的块,所有这些块都将被调用,而不仅仅是第一个匹配的块。
    • 完全正确 - 您可以注册多个 onTransition 块。
    • 酷谢谢我不知道。 'startWith' 和 'stop' 也是如此吗?
    • 找到答案的更好方法是查看 FSM.scala 源代码。所以多次 stop 和 startWith 调用只会覆盖之前的 FSM 状态。
    猜你喜欢
    • 1970-01-01
    • 2015-08-31
    • 2017-03-13
    • 2019-02-10
    • 2016-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多