Ich habe versucht, die FSM in Akka zu verwenden, um die Zustände eines Protokolls (Handshake, Übertragung, Nutzlastdekodierung ...) zu modellieren. Ich möchte etwas definieren, das einem Timeout ähnelt, aber in Bezug auf "verarbeitete Bytes" (z. B. wenn ich nach der Verarbeitung von n
Bytes im gleichen Zustand bin, gehe hier raus). Einfach ausgedrückt, möchte ich das Verhalten von stateTimeout
Eigenschaft neu definieren. Irgendwelche Ideen, um dies idiomatisch zu erreichen?Akka FSM "Timeout" über eine Maßnahme, die keine Zeit ist (in Scala)
2
A
Antwort
1
Angenommen, Sie haben einen bestimmten Zustand X
und ein Verfahren def isDone(x: D): Boolean
die, dass „die Zeit ist um“ bestimmt, Sie so etwas wie dies tun können:
when(X) (({
case Event(...) => ...
...
}: StateFunction) andThen {
case State(_, data, _, _, _) if isDone(data) => // return new state
case x => x
})
Leider ist der Typ Zuschreibung ist notwendig, und andthen nimmt eine vollständige Function1 , macht es ein wenig ausschweifender, als ich es möchte. Ich sehe, dass dies nützlich ist, wird darüber nachdenken, wie es einfacher zu machen.
+0
können Sie die beiden Teile immer in Methoden teilen ... –
Kommen Bytes als Aktor-Nachricht, also können Sie sie zählen und entscheiden, den Status zu wechseln? –
Nein: - \ Es gehört zum Status des Akteurs, zu wissen, wie viele Bytes er bisher verbraucht hat. –