Во-первых, вам нужна мера, чтобы предотвратить работу, пока данные не поступают.Вы можете сделать это,
- Получение обратного вызова при поступлении пакетов, который продвигает ваш конечный автомат.Используйте это, если ваш IO API имеет обратные вызовы.
- Блокировка в
some-thing-happening
до прибытия пакета.Используйте это, если API разрешает это, и обратного вызова нет. - Записывайте входящие пакеты в BlockingQueue и считывайте их с вашего конечного автомата.Это эмулирует 2.
Во-вторых, вы можете смоделировать свое состояние в качестве агента:
(def state (agent {}))
Таким образом, вы можете сказать
(defn update-state [state data]
; e.g.
(merge state data))
;; in the state machine
(send state correct data)
, который обновляет ваше состояние в отдельном потоке.
Вы даже можете отправлять пакеты агенту непосредственно с того места, где вы их читаете, и внедрять конечный автомат в update-state
.