2015-06-26 26 views
5

Mam aktora z zachowania:wychodzący strumień połączenie zamknięte

def receive: Receive = { 
    case Info(message) => 
     val res = send("INFO:" + message) 
     installAckHook(res) 
    case Warning(message) => 
     val res = send("WARNING:" + message) 
     installAckHook(res) 
    case Error(message) => 
     val res = send("ERROR:" + message) 
     installAckHook(res) 
    } 

private def installAckHook[T](fut: Future[T]): Unit = { 
    val answerTo = sender() 

    fut.onComplete { 
     case Success(_) => answerTo ! "OK" 
     case Failure(ex) => answerTo ! ex 
    } 
    } 


    private def send(message: String): Future[HttpResponse] = { 
    import context.system 
    val payload: Payload = Payload(text = message, 
     username = slackConfig.username, icon_url = slackConfig.iconUrl, 
     icon_emoji = slackConfig.iconEmoji, channel = slackConfig.channel) 
     .validate 
    Http().singleRequest(RequestBuilding.Post(slackConfig.hookAddress, payload)) 
    } 

a test

val actorRef = system.actorOf(SlackHookActor.props(SlackEndpointConfig(WebHookUrl,iconEmoji = Some(":ghost:")))) 
actorRef ! Error("Some error message") 
actorRef ! Warning("Some warning message") 
actorRef ! Info("Some info message") 
receiveN(3) 

iw sposobie afterAll() robię zamknięcie w systemie aktora wykorzystaniem TestKit.

To działa, wniosek dotrze do serwera, ale są błędy z Akka strumieni część:

[ERROR] [06/26/2015 11:34:55.118] [SlackHookTestingSystem-akka.actor.default-dispatcher-10] [ActorSystem(SlackHookTestingSystem)] Outgoing request stream error (akka.stream.AbruptTerminationException) 
[ERROR] [06/26/2015 11:34:55.120] [SlackHookTestingSystem-akka.actor.default-dispatcher-13] [ActorSystem(SlackHookTestingSystem)] Outgoing request stream error (akka.stream.AbruptTerminationException) 
[ERROR] [06/26/2015 11:34:55.121] [SlackHookTestingSystem-akka.actor.default-dispatcher-8] [ActorSystem(SlackHookTestingSystem)] Outgoing request stream error (akka.stream.AbruptTerminationException) 

Wydaje się, ponieważ mam Future zakończyła połączenie wychodzące powinny być już zamknięte, więc jest to błąd, czy też brakuje mi czegoś?

+0

mam ten sam problem. Dzięki za pomoc. – jiangok

+0

Potrzebujemy wzoru wyłączenia dla akka-stream. Ponieważ aktorzy przepływu są implicite, nie wiem, czy dobrze jest zastosować techniki wymienione w letitcrash.com/post/30165507578/shutdown-patterns-in-akka-2. – jiangok

+0

Rewizja za lenistwo. Ani nagłówek, ani znaczniki nie dają użytecznych kontekstów. – mc0e

Odpowiedz

2

Trzeba również wyłączyć baseny połączenie HTTP, coś jak

Http().shutdownAllConnectionPools().onComplete{ _ => 
    system.shutdown() 
} 

Może Akka http testkit zapewnia pewne pomocników

+5

Zaczyna to rodzić się pytanie, co należy zamknąć, co? Mamy pulę połączeń, systemy aktorów i materializator aktorów. Powinno to być jak najbliższa pula http -> zamknij materializację -> zamknij system? – almendar

Powiązane problemy