2016-04-27 1 views
2

Je suis nouveau pour Akka, j'utilise la version Akka 2.3.3 pour créer des acteurs. Je vais créer un acteur à distance et essayer d'accéder avec le client. Chaque fois que je vais exécuter des essais cas, l'exception suivante lancera:Akka Acteur: Exception d'acteur à distance "Futures a expiré après"

[INFO] [04/27/2016 07:51:23.727] [Localsystem-akka.actor.default-dispatcher-3] [akka://Localsystem/deadLetters] Message [com.harmeetsingh13.chapter2.messages.SetRequest] from Actor[akka://Localsystem/temp/$a] to Actor[akka://Localsystem/deadLetters] was not delivered. [1] 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'. 
[INFO] [04/27/2016 07:51:23.745] [Localsystem-akka.actor.default-dispatcher-3] [akka://Localsystem/deadLetters] Message [com.harmeetsingh13.chapter2.messages.GetRequest] from Actor[akka://Localsystem/temp/$b] to Actor[akka://Localsystem/deadLetters] was not delivered. [2] 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'. 

Futures timed out after [10 seconds] 
java.util.concurrent.TimeoutException: Futures timed out after [10 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 com.harmeetsingh13.chapter2.SClientIntegrationSpec$$anonfun$1$$anonfun$apply$mcV$sp$1.apply$mcV$sp(SClientIntegrationSpec.scala:18) 
at com.harmeetsingh13.chapter2.SClientIntegrationSpec$$anonfun$1$$anonfun$apply$mcV$sp$1.apply(SClientIntegrationSpec.scala:15) 
at com.harmeetsingh13.chapter2.SClientIntegrationSpec$$anonfun$1$$anonfun$apply$mcV$sp$1.apply(SClientIntegrationSpec.scala:15) 
at org.scalatest.Transformer$$anonfun$apply$1.apply$mcV$sp(Transformer.scala:22) 
at org.scalatest.OutcomeOf$class.outcomeOf(OutcomeOf.scala:85) 
at org.scalatest.OutcomeOf$.outcomeOf(OutcomeOf.scala:104) 
at org.scalatest.Transformer.apply(Transformer.scala:22) 
at org.scalatest.Transformer.apply(Transformer.scala:20) 
at org.scalatest.FunSpecLike$$anon$1.apply(FunSpecLike.scala:422) 
at org.scalatest.Suite$class.withFixture(Suite.scala:1122) 
at com.harmeetsingh13.chapter2.SClientIntegrationSpec.withFixture(SClientIntegrationSpec.scala:11) 
at org.scalatest.FunSpecLike$class.invokeWithFixture$1(FunSpecLike.scala:419) 
at org.scalatest.FunSpecLike$$anonfun$runTest$1.apply(FunSpecLike.scala:431) 
at org.scalatest.FunSpecLike$$anonfun$runTest$1.apply(FunSpecLike.scala:431) 
at org.scalatest.SuperEngine.runTestImpl(Engine.scala:306) 
at org.scalatest.FunSpecLike$class.runTest(FunSpecLike.scala:431) 
at com.harmeetsingh13.chapter2.SClientIntegrationSpec.runTest(SClientIntegrationSpec.scala:11) 
at org.scalatest.FunSpecLike$$anonfun$runTests$1.apply(FunSpecLike.scala:464) 
at org.scalatest.FunSpecLike$$anonfun$runTests$1.apply(FunSpecLike.scala:464) 
at org.scalatest.SuperEngine$$anonfun$traverseSubNodes$1$1.apply(Engine.scala:413) 
at org.scalatest.SuperEngine$$anonfun$traverseSubNodes$1$1.apply(Engine.scala:401) 
............ 

Mon code serveur comme ci-dessous: Main.scala

object Main extends App{ 


private val configFile = getClass.getClassLoader.getResource("application.conf").getFile; 
private val config = ConfigFactory.parseFile(new File(configFile)) 

val system = ActorSystem("SimpleClientServer", config) 
system.actorOf(Props[AkkadmeyDB], name = "akkademy-db") 
} 

application.conf:

akka{ 
actor{ 
    provider = "akka.remote.RemoteActorRefProvider" 
} 
remote{ 
enabled-transports = ["akka.remote.netty.tcp"] 
    netty.tcp { 
    hostname = "127.0.0.1" 
    port = 2552 
    } 
    log-sent-messages = on 
    log-received-messages = on 
} 
} 
Catégorie d'acteur:

Code client comme ci-dessous: SClient.scala

class SClient(remoteIp: String) { 

    private implicit val timeout = Timeout(10 seconds) 
    private implicit val system = ActorSystem("Localsystem") 
    private val remoteAddress = s"akka.tcp://[email protected]$remoteIp/user/akkademy-db"; 
    private val remoteDb = system.actorSelection(remoteAddress) 

    def set(key: String, value: Object) = { 
    remoteDb ? SetRequest(key, value) 
    } 

    def get(key: String) = { 
    remoteDb ? GetRequest(key) 
    } 
} 

SClientIntegrationSpec.scala Cas de test:

class SClientIntegrationSpec extends FunSpecLike with Matchers { 

    val client = new SClient("127.0.0.1:2552") 
    describe("akkadment-db-client"){ 
    it("should set a value"){ 
     client.set("jame", new Integer(1313)) 
     val futureResult = client.get("james") 
     val result = Await.result(futureResult, 10 seconds) 
     result should equal (1313) 
    } 
    } 
} 

Quand je vois les journaux de ma demande à distance, cela semble, la demande a frappé n » t aller au serveur. Quel est le problème dans mon exemple de code en cours d'exécution?

+1

hey, il est jason goodwin - J'ai vu votre tweet. Pouvez-vous pousser votre code à github? J'ai vérifié tous les exemples de travail avant publication qui sont postés sur mon github. Je vais vous donner un coup de main. – JasonG

+0

Salut @JasonG merci pour votre réponse. Je n'utilise pas de code téléchargé de votre dépôt, je crée le mien en fonction de vos chapitres. Diviser le code en deux serveurs de référentiel et client. Dans Serveur Repo, allez au chapitre 2 du paquet https://github.com/harmeetsingh0013/Akka-practice-using-scala et au client https://github.com/harmeetsingh0013/Akka-practice-using-scala-client. Comme je le dis ci-dessus, le code du serveur est en cours d'exécution, mais quand j'essaie d'exécuter le cas de test client, alors j'ai obtenu et exception comme mentionné ci-dessus. –

+0

merci, je vais vérifier plus tard et revenir à vous. – JasonG

Répondre

3

Pour résoudre les problèmes ci-dessus, nous devons suivre deux étapes qui sont metnion ci-dessous:

  1. Quand je suis en train de créer un code de serveur, je suis excluais application.conf de mon application serveur, c'est pourquoi, l'application client ne capable de se connecter avec le serveur. Le code utilisent en built.sbt est comme ci-dessous:

    mappings in (Compile, packageBin) ~= { _.filterNot { case (_, name) => 
    Seq("application.conf").contains(name) 
    }} 
    

Après avoir commenté le code ci-dessus, le client voir avec succès le serveur.

  1. Dans le chapitre 2 Learning Scalajasongoodwin expliquer le code du système d'acteur client et le serveur. Mais il y a quelques errata dans le livre et la configuration application.conf manquante pour le client. Parce que lorsque nous exécutons les deux codes dans le même PC, nous sommes déjà confrontés à une exception de liaison de port car par défaut les acteurs utilisent le port 2552 pour accéder et nous définissons déjà ce port pour notre application serveur. Ainsi, application.conf besoin aussi pour le client comme ci-dessous:

    akka { 
        actor { 
        provider = "akka.remote.RemoteActorRefProvider" 
        } 
        remote { 
        enabled-transports = ["akka.remote.netty.tcp"] 
        netty.tcp { 
         hostname = "127.0.0.1" 
         port = 0 
        } 
        log-sent-messages = on 
        log-received-messages = on 
        } 
    } 
    

Ici Port 0 tout port gratuit.

Ensuite, le code ci-dessus s'exécute correctement.

+0

Je vous recommande fortement de suivre l'exemple de code donné dans github plutôt que d'écrire vous-même. Cela vous fera économiser beaucoup de temps. Je fais la même chose pour les échantillons de code Java et cela a été un bon voyage jusqu'à présent. Oui, vous avez raison, le fichier application.conf pour le code client n'a pas été mentionné dans le livre. Le point à noter que le client et le serveur sont tous deux identiques et nécessitent la configuration à distance pour être activé. – Neeraj

+0

Merci beaucoup. –

1

Il existe également un fichier application.conf dans le projet client qui n'est pas mentionné dans le livre. Assurez-vous que vous créez ce fichier dans le dossier des ressources avec le contenu suivant:

akka { 
    actor { 
    provider = "akka.remote.RemoteActorRefProvider" 
    } 
} 

Voir la official github repo

+0

Oui, cela fonctionne. Notez simplement que si vous exécutez l'exemple Java, vous devrez peut-être configurer le port "remote.netty.tcp.port = 0" comme indiqué dans l'exemple Java de GitHub, sinon la première fois que vous exécuterez le test fonctionne bien, mais si vous relancez sans rebondir Activator, il échouera sur les essais suivants. Ce paramètre n'est pas dans l'exemple Scala, ce qui était un peu déroutant pour moi au début. Je ne sais pas si c'est un oubli, ou si ce n'est pas nécessaire avec Scala. https://github.com/jasongoodwin/learning-akka/blob/master/ch2/akkademy-db-client-java/src/main/resources/application.conf – rscarter