为什么我的 Akka WebSocket Actor 是 disconnecting/dying?
Why is my Akka WebSocket Actor disconnecting/dying?
(底部的Update/fix)我正在使用 PlayFramework 2.x 创建一个使用 actor 的简单 WebSocket 应用程序。我能够让事情正常工作(发送 echo ping),但我只是想知道如果没有发送或接收任何内容,为什么 WebSocket 在短时间(大约 30 秒)后断开连接?我有一个很长的 运行(5-20 分钟)过程,我需要在它结束时使用 websocket 发回通知。
我放了一个 postStop 来查看 actor 是否停止并且确实被击中了。也许我只是不了解演员的生命周期?我在文档中找不到任何关于为什么在这种情况下演员会被杀死的原因,因为没有父演员。
控制器:
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 值在开发模式下未使用。为什么他们这样设置我不知道并且非常令人沮丧。根据官方文档:
Note: In dev mode, when you use the run command, your
application.conf settings will not be picked up by the server. This is
because in dev mode the server starts before the application classpath
is available. There are several other options you’ll need to use
instead.
在您的代码中,actor 的生命周期与 WebSocket 连接相关联:当连接关闭时,Play 会自动停止 actor。您的连接正在关闭,因为它处于非活动状态的时间太长。
来自 Akka HTTP documentation(Akka HTTP 是 Play 中的底层引擎):
Inactive WebSocket connections will be dropped according to the idle-timeout settings. In case you need to keep inactive connections alive, you can either tweak your idle-timeout or inject ‘keep-alive’ messages regularly.
您可以更改 idle-timeout
设置,如上文 link 所述,或更改 here 所述的等效播放设置(播放设置将覆盖 Akka HTTP 设置)。例如,要通过播放配置完全禁用超时:
idleTimeout = infinite
(底部的Update/fix)我正在使用 PlayFramework 2.x 创建一个使用 actor 的简单 WebSocket 应用程序。我能够让事情正常工作(发送 echo ping),但我只是想知道如果没有发送或接收任何内容,为什么 WebSocket 在短时间(大约 30 秒)后断开连接?我有一个很长的 运行(5-20 分钟)过程,我需要在它结束时使用 websocket 发回通知。
我放了一个 postStop 来查看 actor 是否停止并且确实被击中了。也许我只是不了解演员的生命周期?我在文档中找不到任何关于为什么在这种情况下演员会被杀死的原因,因为没有父演员。
控制器:
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 值在开发模式下未使用。为什么他们这样设置我不知道并且非常令人沮丧。根据官方文档:
Note: In dev mode, when you use the run command, your application.conf settings will not be picked up by the server. This is because in dev mode the server starts before the application classpath is available. There are several other options you’ll need to use instead.
在您的代码中,actor 的生命周期与 WebSocket 连接相关联:当连接关闭时,Play 会自动停止 actor。您的连接正在关闭,因为它处于非活动状态的时间太长。
来自 Akka HTTP documentation(Akka HTTP 是 Play 中的底层引擎):
Inactive WebSocket connections will be dropped according to the idle-timeout settings. In case you need to keep inactive connections alive, you can either tweak your idle-timeout or inject ‘keep-alive’ messages regularly.
您可以更改 idle-timeout
设置,如上文 link 所述,或更改 here 所述的等效播放设置(播放设置将覆盖 Akka HTTP 设置)。例如,要通过播放配置完全禁用超时:
idleTimeout = infinite