2016-12-06 1 views
0

je l'acteur suivant:ne sait pas si les temps futurs sur ou échoue immédiatement

class SomeActor extends Actor with ActorLogging { 
    override def receive: Receive = { 
    case StartMessage => 
    //check if the job is still running 
    val address = url("http://mywebsite.com") 
    val status: Future[String] = Await.ready(Http(address OK as.String), 1 second) 
    val now = Calendar.getInstance().getTime() 
    println("TIME NOW: " + now) 

    status onComplete { 
    case Success(message) => sender ! SomeMessage(message) 
    case Failure(_) => { 
     val then = Calendar.getInstance().getTime() 
     sender ! SomeMessage("Not running") 
     println("TIME THEN: " + then) 
    } 
    } 

Et je teste comme ceci:

it should "check the id of a submitted job" in new Scope { 
    myActorRef ! StartMessage 
    expectMsg(SomeMessage("Not running")) 
    } 

Le problème est que je reçois

java.lang.AssertionError: assertion failed: timeout (3 seconds) during expectMsg while waiting for SomeMessage(Not running) 

Donc, il semble que mon avenir se termine, ce qui ne devrait pas être le cas puisque je l'attends seulement 1 seconde.

Cependant, ceci est également imprimé.

TIME NOW: Tue Dec 06 13:39:13 GMT 2016 
TIME THEN: Tue Dec 06 13:39:13 GMT 2016 

De cela, il semble que le futur échoue immédiatement après le démarrage.

Alors, c'est quoi?

+0

N'attendez dans un 'Actor'. Mieux vaut éviter d'imbriquer async 'Future' code de production dans un' Actor'. Les mauvaises choses arrivent toujours. – wheaties

Répondre

0

j'avais la « fermeture sur l'expéditeur » problème, ce qui est très bien expliqué ici:

http://helenaedelson.com/?p=879

Fondamentalement, je répondais au sender dans un autre thread, de sorte que l'objet sender peut ne pas être le même que celui du fil principal.

J'ai juste besoin d'ajouter au début:

val requestor = sender 

et change aussi:

requestor ! SomeMessage(message) 

et

requestor ! SomeMessage("Not running")