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?
N'attendez dans un 'Actor'. Mieux vaut éviter d'imbriquer async 'Future' code de production dans un' Actor'. Les mauvaises choses arrivent toujours. – wheaties