2013-12-19 6 views
1

Как можно обрабатывать сообщения между исполнителями, которые будут исполнены и закончены в определенном порядке?Синхронизация сообщений актера

Другими словами, если, например, Message A хочет, чтобы его всегда принимали до Message B, как это сделать, используя akka?

+0

Извините за вмешательство: ваш вопрос звучит немного плохой дизайн. как правило, вы внедряете актеров в понятие безгражданства. –

+0

Что вы хотите сказать? – Bran

+0

Можете ли вы подробно рассказать о том, почему у вашего сообщения должен быть определенный порядок? этот подход не очень хорошо масштабируется - среди других проблем. –

ответ

0

Я предполагаю, что вы имеете в виду, что вам нужно «Сообщение А», чтобы вы могли обработать «Сообщение B». Другие альтернативы:

  • Вы хотите получить любое «сообщение A» перед «сообщением B», если в очереди есть обе - вы не можете этого сделать;
  • Вы хотите, чтобы «Message A» обрабатывалось до «Message B», если они отправлены в этом порядке - так оно работает уже от одного и того же отправителя, и вы не можете этого сделать, если отправители разные ,

Итак, отбросив эти другие варианты, вот техника. Во-первых, определить отдельные получают методы для государства, когда сообщение А ожидается и сообщение B ожидается:

def receivingA = Receive { 
    case MessageA(x) => ... 
} 

def receivingB = Receive { 
    case MessageB(y) => ... 
} 

Вы можете установить первый в качестве значения по умолчанию:

def receive = receivingA 

При получении сообщения A, вы может изменить состояние ожидать сообщение B:

case MessageA(x) => 
    // do stuff 
    become(receivingB) 

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

Теперь единственное, чего не хватает, это то, что вы собираетесь делать с сообщениями, прибывшими, когда их не ожидали. Вы не можете делать ничего, что отправит их в журнал ошибок, или вы можете сделать что-то отвергая этот метод:

def unhandled(msg: Any): Unit = message match { 
    case Terminated(target) => ... 
    case msg => ... 
} 

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

Смежные вопросы