(更新/修复底部)我使用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设置将不会被服务器选中。这是 因为在开发模式下,服务器在应用程序类路径之前启动 是可用的。您还需要使用其他几个选项 代替。
答案 0 :(得分:1)
在您的代码中,actor的生命周期与WebSocket连接相关联:当连接关闭时,Play会自动停止actor。而且你的联系正在关闭,因为它已经无效了很长时间。
来自Akka HTTP documentation(Akka HTTP是Play中的底层引擎):
将根据idle-timeout settings删除非活动WebSocket连接。如果您需要保持非活动连接处于活动状态,您可以调整空闲超时或定期注入“保持活动”消息。
您可以按照上述链接中的说明更改idle-timeout
设置,或更改描述here的等效播放设置(播放设置将覆盖Akka HTTP设置)。例如,要通过Play配置完全禁用超时:
idleTimeout = infinite