Akka在停止演员

时间:2015-06-01 10:32:30

标签: scala playframework akka

我正在使用Play play.api.mvc.WebSocketakka.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)
    }
}

一旦套接字关闭,它就会发送UnsubscribeUnsubscribe收到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

2 个答案:

答案 0 :(得分:0)

不在postStop方法中,为时已晚。

但是,在收到UnsubscribeAck之前,您可以become等待UnsubscribeAck而不是在收到UnsubscribeAck时停止而不是在收到$('#Single_Line').show();时停止(或者在超时后停止,以防$(document).ready()永远不会收到。

答案 1 :(得分:0)

这实际上应该可以正常工作,因为当您订阅时,DistributedPubSubMediator会监视您的actor Terminated。在一个新项目中,它确实按预期工作,并且调解员取消订阅,因此您可能不需要做任何事情。我保持这个答案,因为它在我的项目中没有这样做,它可能会影响其他人。

我正在做的是写一个长寿的第二个演员(你可以在控制器中创建它),并让WebSocket演员与之交谈以管理订阅。这样新玩家可以传递取消订阅消息,然后它可以接收并忽略UnsubscribeAck