2016-06-07 6 views
0

Если я отключу строку A, приложение HelloRemote не сможет получить сообщение «привет мир», похоже, если мы выключим локальную актерскую систему слишком быстро, сообщение не будет отправлено на удаленный?Что предлагает способ отключения удаленного клиента akka

Конечно, местный актер мог ждать сообщения от пульта, чтобы подтвердить уже полученное сообщение, но если мы добавим такой код, процесс будет синхронным, я не хочу, чтобы вещь стала чем-то вроде RPC.

Я просто хочу сделать его асинхронным, а также не хочу тратить время на «Thread.sleep (3000)», я хочу, чтобы клиент закрыл как можно скорее, какое-либо предложение?

HelloRemote.scala

package remote 

import akka.actor._ 

object HelloRemote extends App { 
    val system = ActorSystem("HelloRemoteSystem") 
    val remoteActor = system.actorOf(Props[RemoteActor], name = "RemoteActor") 
} 

class RemoteActor extends Actor { 
    def receive = { 
    case msg: String => 
     println(s"received message '$msg'") 
    } 
} 

Local.scala

package local 

import akka.actor._ 

object Local extends App { 
    val system = ActorSystem("LocalSystem") 
    val localActor = system.actorOf(Props[LocalActor], name = "LocalActor") 
    localActor ! "START" 
} 

class LocalActor extends Actor { 
    val remote = context.actorSelection(
    "akka.tcp://[email protected]:5150/user/RemoteActor") 

    def receive = { 
    case "START" => 
     remote ! "hello world" 
     Thread.sleep(3000) // Line A 
     context.stop(self) 
     context.system.shutdown 
    } 
} 

Кроме того, паста application.conf для легкой попытки.

отдаленная часть:

akka { 
     actor { 
     provider = "akka.remote.RemoteActorRefProvider" 
     } 
     remote { 
     netty.tcp { 
      hostname = "127.0.0.1" 
      port = 5150 
     } 
     log-remote-lifecycle-events = off 
     } 
     log-dead-letters = off 
     log-dead-letters-during-shutdown = off 
    } 

локальная часть:

akka { 
     actor { 
     provider = "akka.remote.RemoteActorRefProvider" 
     } 
     remote { 
     log-remote-lifecycle-events = off 
     } 
     log-dead-letters = off 
     log-dead-letters-during-shutdown = off 
    } 
+0

Вместо 'context.stop (само)', вы можете отправить сообщение 'PoisonPill' для себя, удалить линии А и при получении' PoisonPill' сообщение вы могли бы выключить систему – curious

+0

@ curious, интересно, как я могу сделать свое действие после себя! PoisonPill, похоже, akka справится с этим сообщением сам по себе, поэтому что-то вроде следующего не работает. case PoisonPill => println («wow») – lagom

+0

Исправить, создать «случайный объект» для пользовательского сообщения типа «KillLocal» и отправить его «самому» и после получения «KillLocal» do 'context.stop (self)'; 'context.system.shutdown' – curious

ответ

0

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

Как это:

sender ! Kill 

вы можете прочитать здесь http://doc.akka.io/docs/akka/snapshot/scala/actors.html#Killing_an_Actor

Или вы можете выбрать какое-то сообщение «секрет», что сказать местным актером, чтобы сделать что-то, прежде чем остановить себя.

Краткое описание. Удаленная часть:

class RemoteActor extends Actor { 
    def receive = { 
    case msg: String => 
       println(s"received message '$msg'") 
       sender ! "secretWord" 
    }  
} 

Местная часть:

class LocalActor extends Actor { 
    val remote = context.actorSelection(
    "akka.tcp://[email protected]:5150/user/RemoteActor") 

    def receive = { 
     case "START" => 
      remote ! "hello world" 
     case "secretWord" => 
     context.stop() 
    } 

    def postStop(): Unit = { 
    //do something here 
    } 
} 
+0

OP уже упоминал, что он не хочет, чтобы локальный актер ждал подтверждение от удаленного актера, а затем действовать на него, – curious

+0

Я думаю, что он не может этого сделать, не получая сообщения от удаленного актера. Еще одна вещь, которую я могу предложить, это «спросить», но в этом случае нам нужно подождать ответа от удаленного актера. Если кто-нибудь сейчас, как это сделать, скажите нам, пожалуйста. –

+0

После отправки сообщения удаленному игроку вы можете отправить «PoisonPill» в себя, который будет служить цели. – curious