问题描述
我遇到了经典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 (将#修改为@)