Тайм-аут Akka FSM из-за меры, которая не является временем (в Scala)

Я пытался использовать FSM в Akka для моделирования состояний протокола (рукопожатие, передача, декодирование полезной нагрузки...). Я хочу определить что-то вроде тайм-аута, но с точки зрения «обработанных байтов» (например, если я остаюсь в том же состоянии после обработки n байтов, уходите отсюда). Проще говоря, я хотел бы переопределить поведение свойства stateTimeout. Любые идеи о том, как идиоматически достичь этого?


person Hugo Sereno Ferreira    schedule 29.03.2012    source источник
comment
Поступают ли байты в виде сообщения актора, чтобы вы могли их подсчитать и принять решение о переключении состояния?   -  person Peter Schmitz    schedule 29.03.2012
comment
Нет :-\ Это часть состояния актера, чтобы знать, сколько байтов он использовал до сих пор.   -  person Hugo Sereno Ferreira    schedule 29.03.2012


Ответы (1)


Предполагая, что у вас есть определенное состояние 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 принимает полную функцию Function1, что делает его немного более подробным, чем мне бы хотелось. Вижу, что это полезно, буду думать, как упростить.

person Roland Kuhn    schedule 29.03.2012