Как реализовать асинхронные взаимозависимые отменяемые операции с актерами? - PullRequest
2 голосов
/ 31 августа 2011

Я довольно новичок в модели актера, поэтому я думаю, что уже существуют устоявшиеся шаблоны, обращающиеся к моему обычному сценарию с такими прекрасными составными абстракциями, как актеры и фьючерсы.

У меня есть асинхронные операции со следующими требованиями:

  • Они используют устаревшую систему, отправляя низкоуровневый запрос и затем отслеживая состояние объекта с помощью опроса. Таким образом, результат фактической операции доступен только с отложенным способом, запрашивающие должны быть уведомлены, когда наблюдаемое состояние достигает желаемого состояния.
  • Эти операции могут быть выполнены только после завершения некоторых других операций, которые они должны ожидать параллельно.
  • Операции можно отменить. Конечно, уже выполненные запросы низкого уровня не могут быть отменены; отмена означает, что не выдает фактическую операцию после операций, от которых мы зависим, и, конечно, она должна распространяться рекурсивно (если мы ожидаем зависимости и у нее есть несколько ожидающих операций, не выдают их).

Я думаю о Фьючерсах: первое требование может быть решено, например, с помощью map / flatMap от Akka, второй с комбинатором traverse без процедурного поддержания зависимостей / иждивенцев. Но я не могу придумать решение для отмены ; фьючерсы не могут быть отменены, и если они составлены, их компоненты недоступны. Как инкапсулировать «отменить операцию current » функциональным способом? Поддерживает ли это какая-либо из сред Actor для Scala?

Ответы [ 2 ]

3 голосов
/ 31 августа 2011

Использовать прослушиватели: https://github.com/jboner/akka/blob/release-1.2/akka-actor/src/main/scala/akka/routing/Listeners.scala

Создать актера, который использует прослушиватели для передачи состояния опроса всем слушателям.Затем вы можете использовать цикл передачи сообщений для повторного запуска опроса.

class MyActor extends Actor with Listeners {

  override def preStart {
    self ! 'poll //Start looping on start
  }

  def receive = listenerManagement orElse {
    case 'poll => val result = pollYourExternalDude()
    gossip(result)
    self ! 'poll //Loop
  }
}

Затем вы можете остановить актера, используя либо остановку, либо отправку PoisonPill.

Помогает ли это?

0 голосов
/ 17 января 2012

Guava's ListenableFuture s отмены поддержки до уровня, когда связаны вместе (но не когда объединены из коллекции ).

...