2017-09-25 96 views
0

(更新/修復在底部)我正在使用PlayFramework 2.x來創建一個使用actor的簡單WebSocket應用程序。我能夠使事情工作(發送回顯ping),但我只是想知道爲什麼WebSocket在短時間(大約30秒)後斷開連接,如果沒有發送或接收任何內容?我有一個長時間運行(5-20​​分鐘)的過程,我需要使用websocket在通知結束時發送回去。爲什麼我的Akka WebSocket Actor斷線/死機?

我放了一個postStop,看看演員是否停下來,確實被擊中。也許我只是不明白演員的生命週期?由於沒有父母演員,我無法在文件中找到爲什麼演員會在此案中被殺害的任何內容。

控制器:

public WebSocket socket() { 
    return WebSocket.Text.accept(request -> 
      ActorFlow.actorRef(
        WebSocketActor::props, 
        actorSystem, materializer 
      ) 
    ); 
} 

演員

public class WebSocketActor extends AbstractActor { 
public static Props props(ActorRef out) { 
    return Props.create(WebSocketActor.class, out); 
} 

private final ActorRef out; 

public WebSocketActor(ActorRef out) { 
    this.out = out; 
    ActorSystem actorSystem = context().system(); 
} 

@Override 
public Receive createReceive() { 

    return receiveBuilder() 
      .match(String.class, message -> 
        out.tell("Message: " + message, self()) 
      ) 
    } 

public void postStop() { 
    System.out.println("I'm dying over here!"); 
} 

} 

更新:謝謝@chunjef。實際上,我確實必須設置空閒超時,但也必須以生產模式啓動,因爲某些application.config值不在dev模式下使用。爲什麼他們這樣設置我不知道,而且很令人沮喪。根據官方文檔:

注意:在dev模式下,當您使用run命令時,服務器將不會拾取您的 application.conf設置。這是 ,因爲在開發模式下,服務器在應用程序類路徑 可用之前啓動。您還需要使用其他幾個選項來代替 。

回答

1

在代碼中,演員的生命週期是聯繫在一起的WebSocket連接:當連接被關閉,自動播放停止的演員。而且你的連接正在關閉,因爲它太長時間不活動了。

從阿卡HTTP documentation(阿卡HTTP是在播放底層引擎):

無效WebSocket連接將根據idle-timeout settings被丟棄。如果您需要保持非活動連接處於活動狀態,則可以調整空閒超時或定期注入「保持活動」消息。

可以更改idle-timeout設置在上述鏈接中描述或改變等效Play設置描述here(播放設置將會覆蓋阿卡HTTP設置)。例如,要通過Play配置完全禁用超時:

idleTimeout = infinite