2015-02-05 2 views
1

Прецедент это:Использование спрея клиента (SendReceive) в качестве актера

  1. актера связывают опрыскивать IO - прием и обработка всех входящих запросов HTTP, поступающие через указанный порт.
  2. Для каждого входящего запроса актеру необходимо отправить исходящий асинхронный HTTP-запрос на другую внешнюю конечную точку, вернуть входящий ответ и отправить ответ обратно отправителю.

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

Интересно, как можно использовать этот случай использования, не нарушая инкапсуляцию нитей актера, как актер может использовать брызг-клиент (для отправки/получения асинхронных http-событий) безопасным способом?

ответ

0

Это совершенно безопасно завершить с будущим, а не фактическое значение в spray-routing, так, например, вы можете сделать следующее:

get { 
    comlete { 
     val resultFuture: Future[Result] = ... 

     val resultFuture.onComplete {....} 

     resultFuture 
    } 
} 

Конечно, вам нужно будет убедиться, что вы справляетесь таймаутов и ошибок.

0

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

В моем понимании , существует одна и та же проблема с методом akka actor 'ask', который возвращает Future, они предоставляют предупреждение о том, чтобы не выполнять операции в изменяемом состоянии actor из обратного вызова, поскольку это может вызвать проблемы синхронизации. см: http://doc.akka.io/docs/akka/snapshot/scala/actors.html

«Предупреждение: При использовании будущих обратных вызовов, таких как OnComplete, OnSuccess и OnFailure, внутри актеров, которые необходимо тщательно избегать закрытия над ссылкой объемлющего актера, то есть не вызывать методы или доступа изменяемые государства, на включающий актера из обратного вызова.Это нарушит инкапсуляцию актера и может привести к ошибкам синхронизации и условиям гонки, потому что обратный вызов будет запланирован одновременно с окружающим актером. К сожалению, еще нет способа обнаружить эти незаконные обращения во время компиляции ».

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