我正在使用Play play.api.mvc.WebSocket
与akka.contrib.pattern.DistributedPubSub
事件相结合,这已经很好了。
class SomeSocketActor(out: ActorRef) extends Actor {
val mediator = DistributedPubSubExtension(context.system).mediator
mediator ! Subscribe("some_group", self)
def receive: Actor.Receive = {
case SubscribeAck(Subscribe("some_group", None, `self`)) =>
context become ready
}
def ready: Actor.Receive = {
// ...
}
override def postStop(): Unit = {
mediator ! Unsubscribe("some_group", self)
}
}
一旦套接字关闭,它就会发送Unsubscribe
。 Unsubscribe
收到DistributedPubSubMediator
后,会以UnsubscribeAck
回复。然而,因为在那一刻(在postStop
之后),演员已经停止并且UnsubscribeAck
移动了Akkas死信邮箱,我的日志被垃圾邮件发送如下:
信息 [akka.contrib.pattern.DistributedPubSubMediator $ UnsubscribeAck]来自 演员[akka:// application / user / distributedPubSubMediator#261175455]来 演员[akka:// application / system / websockets / 24 / handler#325798268]是 没送到。 [1]遇到死信。这个日志记录可以 使用配置设置关闭或调整 'akka.log-dead-letters'和'akka.log-dead-letters-during-shutdown'。
我知道我可以按照日志消息中的建议,但这似乎不是一个好习惯。有没有办法告诉postStop
方法中的演员在停止之前等待UnsubscribeAck
?
答案 0 :(得分:0)
不在postStop
方法中,为时已晚。
但是,在收到UnsubscribeAck
之前,您可以become
等待UnsubscribeAck
而不是在收到UnsubscribeAck
时停止而不是在收到$('#Single_Line').show();
时停止(或者在超时后停止,以防$(document).ready()
永远不会收到。
答案 1 :(得分:0)
这实际上应该可以正常工作,因为当您订阅时,DistributedPubSubMediator会监视您的actor Terminated
。在一个新项目中,它确实按预期工作,并且调解员取消订阅,因此您可能不需要做任何事情。我保持这个答案,因为它在我的项目中没有这样做,它可能会影响其他人。
我正在做的是写一个长寿的第二个演员(你可以在控制器中创建它),并让WebSocket演员与之交谈以管理订阅。这样新玩家可以传递取消订阅消息,然后它可以接收并忽略UnsubscribeAck
。