2015-12-29 6 views
2

привет я хочу создать актера в системе актера, если его еще не создали здесь мой кодкак знать, если актер существует в системе актер или нет

val sel = actorSystem.actorSelection("akka://ActorSystem/user/ReadOnlyAdminIndexMongoActor"); 
val asker = new AskableActorSelection(sel); 

val future = asker.ask(Identify(1),Timeout(30 seconds)) 
val identity=Await.result(future, timeout.duration).asInstanceOf[ActorIdentity]   

val reference = identity.getRef 
if(reference != null){ 
    log.info("actor does not exists") 
    } 
    else 
    { 
    log.info("actor exists"+sel.toString()) 
    } 

но этот код бросает исключение

17:00:19.547 1822010 [ArteciateActorSystem-akka.actor.default-dispatcher-7] EmptyLocalActorRef INFO - Message [scala.Tuple2] from Actor[akka://ActorSystem/temp/$e] to Actor[akka://ActorSystem/user/ReadOnlyAdminIndexMongoActor] was not delivered. [5] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'. 
java.util.concurrent.TimeoutException: Futures timed out after [30 seconds] 
    at scala.concurrent.impl.Promise$DefaultPromise.ready(Promise.scala:219) 
    at scala.concurrent.impl.Promise$DefaultPromise.result(Promise.scala:223) 
    at scala.concurrent.Await$$anonfun$result$1.apply(package.scala:190) 
    at scala.concurrent.BlockContext$DefaultBlockContext$.blockOn(BlockContext.scala:53) 
    at scala.concurrent.Await$.result(package.scala:190) 
    at models.Global$.checkActor(Global.scala:71) 

это код на линии 71

val identity=Await.result(future, timeout.duration).asInstanceOf[ActorIdentity] 

, пожалуйста, помогите мне, где я ошибаюсь, а также я использую это код Link и этот Link the code givein in an accepted answer

ответ

1

Использование Identify - это правильный способ определить, существует ли действующий субъект. Получение тайм-аута запроса составляет обычно индикатор, которого нет, поскольку на него не было никакого актера. Я говорю , как правило,, поскольку загрузка сообщений и/или удаленный доступ могут привести к таймауту по другим причинам.

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

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

Упрощенная реализация этого прокси (без супервизора или простоя обработки тайм-аута) может выглядеть следующим образом:

class OnDemandProxyActor(proxyProps: Props) extends Actor { 

    def receive = waiting() 

    def waiting: Receive = { 
    case msg => 
     val target = context.actorOf(proxyProps) 
     target forward msg 
     context.become(proxying(target)) 
    } 

    def proxying(target: ActorRef): Receive = { 
    case msg => target forward msg 
    } 
} 

где proxyProps являются Props для создания вашего актера по требованию, waiting начальное состояние, в котором ни одно сообщение не имеет и, следовательно, прокси target еще не создан, и proxying - это состояние после создания target. Оба государства используют forward, чтобы отправить полученное сообщение в target, как если бы оно исходило от оригинала sender.

+0

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

+0

Сообщите мне, если приведенный выше пример объясняет это –

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