Я предполагаю, что вы имеете в виду, что вам нужно «Сообщение А», чтобы вы могли обработать «Сообщение 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.
Извините за вмешательство: ваш вопрос звучит немного плохой дизайн. как правило, вы внедряете актеров в понятие безгражданства. –
Что вы хотите сказать? – Bran
Можете ли вы подробно рассказать о том, почему у вашего сообщения должен быть определенный порядок? этот подход не очень хорошо масштабируется - среди других проблем. –