Скала актеров и общее государство - PullRequest
2 голосов
/ 13 февраля 2011

Я пытаюсь реализовать актер диспетчера, который либо обрабатывает запрос, либо делегирует обработку другому актору в случае сбоя (на самом деле это алгоритм экспоненциального отката). У актера-диспетчера есть логическая переменная, которая используется для определения способа маршрутизации обработки.

Правильно ли поддерживать какое-то состояние в актере? Какие проблемы могут возникнуть? Должен ли я использовать Transactor (Акка) или STM, чтобы избежать проблем? (Я использую актеров Акки)

class DispatcherActor extends Actor {

   var backoff = false

   def receive = {
    case SendMessage(registrationId, message) => {
      if (backoff) {
        //put on the queue
        backoffManagerActor ! AddMessageToQueue(message)
      } else {
        httpClient.sendNotificationToClient(message, this)
      }
    }
    case BackoffCompleted => //set backoff to false
      backoff = false
    }

   def otherMethod = {
      backoff=true
   } 
}

1 Ответ

4 голосов
/ 13 февраля 2011

Актеры должны поддерживать состояние, но о них легче рассуждать, если они только изменяют это состояние в ответ на сообщения или свои внутренние действия;если другие лица хотят, чтобы они изменили состояние, они должны отправить сообщение.

В вашем случае я бы изменил

def otherMethod { backoff = true }

на, в пределах приема,

case BeginBackoff => backoff = true

и пусть тот, кто собирался вызвать другой метод, отправит BeginBackoff вместо этого.(Если вам нужно преимущественно обработать сообщения об отказе, вы должны использовать двухуровневый прием, который продемонстрировали другие, например, в ответ на ваш предыдущий вопрос об актерах.)

...