为什么我的Akka WebSocket Actor断开连接/死亡?

时间:2017-09-25 21:21:53

标签: java playframework websocket akka actor

(更新/修复底部)我使用PlayFramework 2.x使用actor创建一个简单的WebSocket应用程序。我能够让事情正常工作(发送回显ping),但我只是想知道为什么WebSocket会在很短的时间内(大约30秒)断开连接,如果没有发送或收到任何内容?我有一个长时间运行(5-20​​分钟)的过程,我需要使用websocket在结束时发回通知。

我放了一个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。事实上,我确实必须设置idle-timeout,但还必须在生产模式下启动,因为某些application.config值未在dev模式下使用。为什么他们这样设置我不知道并且非常令人沮丧。根据官方文件:

  

注意:在开发模式下,当您使用run命令时,您的   server.conf设置将不会被服务器选中。这是   因为在开发模式下,服务器在应用程序类路径之前启动   是可用的。您还需要使用其他几个选项   代替。

1 个答案:

答案 0 :(得分:1)

在您的代码中,actor的生命周期与WebSocket连接相关联:当连接关闭时,Play会自动停止actor。而且你的联系正在关闭,因为它已经无效了很长时间。

来自Akka HTTP documentation(Akka HTTP是Play中的底层引擎):

  

将根据idle-timeout settings删除非活动WebSocket连接。如果您需要保持非活动连接处于活动状态,您可以调整空闲超时或定期注入“保持活动”消息。

您可以按照上述链接中的说明更改idle-timeout设置,或更改描述here的等效播放设置(播放设置将覆盖Akka HTTP设置)。例如,要通过Play配置完全禁用超时:

idleTimeout = infinite