2017-09-25 78 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