一段时间后,FSM actor停止触发状态超时消息

问题描述

我遇到了经典actor文档中的FSM示例问题,该actor将消息累积在一起直到达到一定的超时时间。

class BatchHandler(implicit inj: Injector)
  extends FSM[BatchHandler.State,BatchHandler.Data] with Injectable with AppLogging {

  private val batchTime: FiniteDuration = 10.seconds

  startWith(BatchHandler.Idle,BatchHandler.Uninitialized)

  when(BatchHandler.Idle) {
    case Event(BatchHandler.SetTarget(target),Uninitialized) =>
      stay.using(Todo(target,Vector.empty))
  }

  onTransition {
    case Active -> BatchHandler.Idle =>
      stateData match {
        case Todo(target,queue) =>
          context.actorSelection(target) ! Batch(queue)
        case _                => // nothing to do
      }
  }

  when(Active,stateTimeout = batchTime) {
    case Event(Flush | StateTimeout,t: Todo) =>
      goto(BatchHandler.Idle).using(t.copy(queue = Vector.empty))
  }

  whenUnhandled {
    // common code for both states
    case Event(BatchHandler.Queue(obj),t @ Todo(_,v)) =>
      goto(Active).using(t.copy(queue = v :+ obj))

    case Event(e,s) =>
      stay
  }

  initialize()

}

用于 Active 状态的 stateTimeout 参数可以工作几分钟,并且我看到已排队的消息被发送到目标。过了一会儿,actor一直处于 Active 状态,并最终在大约2K消息时刷新,而不考虑10s超时。

我正在使用 akkaVersion =“ 2.5.23” 。我在较旧的版本中发现了一些问题,例如https://groups.google.com/forum/#!topic/akka-user/NsAoqPZ2Svo,但现在应该已经解决了。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...