2012-03-29 6 views
2

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)

+0

Kommen Bytes als Aktor-Nachricht, also können Sie sie zählen und entscheiden, den Status zu wechseln? –

+0

Nein: - \ Es gehört zum Status des Akteurs, zu wissen, wie viele Bytes er bisher verbraucht hat. –

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 ... –