我使用的是Playplay.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死信邮箱和我的日志中都有这样的垃圾信息:
没有传递从Actorakka://application/user/distributedPubSubMediator#261175455到Actorakka://application/system/websockets/24/handler#325798268的消息Actorakka://application/system/websockets/24/handler#325798268。遇到1封死信。这个日志可以关闭或调整配置设置‘akka.log-死-字母’和‘akka.log-死信-在关闭。
我知道我可以遵循日志消息中的建议,但这似乎不是很好的实践。有没有办法告诉postStop方法中的参与者在停止之前等待UnsubscribeAck?
发布于 2015-06-01 11:02:41
在postStop方法中没有,这太晚了。
但是,与其在接收UnsubscribeAck之前停止,您可以只在become等待UnsubscribeAck,在收到UnsubscribeAck时停止(或者在超时之后,以防从未收到UnsubscribeAck。
发布于 2017-09-21 19:06:55
这实际上应该只是起作用,因为DistributedPubSubMediator看着你的演员在订阅时成为Terminated。在一个新的项目中,它确实按预期工作,中介为您取消订阅,因此您可能不需要做任何事情。我坚持这个答案,因为它不会在我的项目中这样做,它可能会影响到其他人。
我正在做的是编写另一个寿命较长的参与者(您可以在控制器中创建它),并让WebSocket参与者与之交谈以管理订阅。这样,新的参与者可以传递取消订阅消息,然后它可以接收和忽略UnsubscribeAck。
https://stackoverflow.com/questions/30571232
复制相似问题