2015-05-12 2 views
1

У меня есть актер, который имеет изменяемое состояние. В моем методе приема я рисую соответствие сообщениям и вызываю некоторые службы, которые возвращают будущее. Это Будущее изменило бы состояние в моем экземпляре Актера. Является ли это состояние безопасным потоком? Поскольку будущее будет выполняться в другом потоке, является ли состояние моего актера гарантированным потоком?Безопасность Akka с фьючерсами

+0

Вы можете использовать pipeTo для работы с фьючерсами и изменчивым состоянием внутри актера. –

+0

Как насчет создания context.become? – sparkr

+0

@ user3102968 context.become все еще не решает проблему при изменении внутреннего изменчивого состояния. К этому времени актер может обрабатывать другое сообщение, и у вас будет состояние гонки, когда будущее также изменит внутреннее состояние. Также, если мой ответ является решением, пожалуйста, отметьте его как принято, спасибо. –

ответ

7

Нет, это не будет потокобезопасным, как вы правильно предполагали. Фьючерсы выполняются в любом потоке, который предоставляет контекст выполнения.

Путь к решению этого - передать его обратно тому же актеру. Все входные данные актера всегда должны быть сообщениями. Вы можете найти documentation here.

Некоторые примеры кода:

import akka.pattern.pipe 

//... inside the Actor somewhere: 
val futureResult: Future[YourType] = something.thatReturnsAFuture() 
futureResult.pipeTo(self) 

А затем изменить ваш получить блок, так что результат будет обработан после завершения в будущем, и он отправляется обратно в этот актер:

case result: YourType => //... 
Смежные вопросы