Akka FSM通过非时间测量的“超时”(斯卡拉)
问题描述:
我试图在Akka中使用FSM来模拟协议的状态(握手,传输,有效负载解码等)。我想定义类似于超时的东西,但是以“已处理字节”的形式定义(例如,如果在处理完n
字节后我仍处于相同状态,请离开此处)。简单地说,我想重新定义stateTimeout
属性的行为。任何想法如何地道地实现这一点?Akka FSM通过非时间测量的“超时”(斯卡拉)
答
假设你有一个特定的状态X
和这就决定了“时间到了”,你可以做这样的事情的方法def isDone(x: D): Boolean
:
when(X) (({
case Event(...) => ...
...
}: StateFunction) andThen {
case State(_, data, _, _, _) if isDone(data) => // return new state
case x => x
})
不幸的是类型归属是必要的,andThen需要一个完整的功能1 ,这比我想要的更加冗长。我发现这很有用,会考虑如何使它更容易。
+0
你总是可以将两部分分成几个方法... – 2012-03-29 23:48:10
字节是否作为actor消息进来,所以你可以数它们并决定切换状态? – 2012-03-29 14:09:20
否: - \它是演员状态的一部分,知道到目前为止消耗了多少字节。 – 2012-03-29 14:12:40