Scala 如果参与者在一段时间内没有收到消息,您如何关闭它?

Scala 如果参与者在一段时间内没有收到消息,您如何关闭它?,scala,akka,actor,Scala,Akka,Actor,当前代码如下: case object LatestMessageSignal class MessageCheckpoint(implicit ec: ExecutionContext) extends Actor with ActorLogging with Timers { override def receive: Receive = { case LatestMessageSignal => awaitLatestMessageSignal() } pr

当前代码如下:

case object LatestMessageSignal

class MessageCheckpoint(implicit ec: ExecutionContext) extends Actor with ActorLogging with Timers {

  override def receive: Receive = {
    case LatestMessageSignal => awaitLatestMessageSignal()
  }

  private def awaitLatestMessageSignal(): Unit = {
    import scala.concurrent.duration._
    context.system.scheduler.scheduleOnce(30.seconds) {
      context.stop(self)
    }
  }

}

当参与者收到
LatestMessageSignal
消息时,它将调用
waitlatestmessagesignal()
方法,该方法将等待30秒,然后停止参与者。

据我所知,您希望保持
MessageCheckpoint
活动,并在30秒内没有新消息到达时停止它

此参与者将保持活动状态,直到您向其发送消息,并在30秒不活动后停止


case对象LatestMessageSignal
类MessageCheckpoint使用ActorLogging扩展了Actor{
覆盖def postStop():单位={
super.postStop()
log.info(“停止”)
}
覆盖def接收:接收=接收带计时器(无)
专用def receiveWithTimer(计时器:选项[可取消]):接收={
case LatestMessageSignal=>
timer.foreach(u.cancel())
变成(receiveWithTimer(选项(initiateTimer()))
}
专用def InitiateTime():可取消={
导入context.dispatcher
log.info(“启动新毒丸计时器”)
context.system.scheduler.scheduleOnce(30.s,self,toxingpill)
}
}
我想演员可以放弃当前处理消息时,另一个新的消息来,并将处理最新的消息,而不是


这是不可能的。我认为您假设方法
waitlatestMessageSignal
正在阻止参与者。此方法是非阻塞的,它将创建一个计时器并立即返回。消息的处理速度非常快,actor将为下一条消息做好准备。Actor一次只处理一条消息,无法取消消息处理

看起来你想在30秒不活动后停止该演员?如果是这样,你可以使用

例如:

case object LatestMessageSignal

class MessageCheckpoint(implicit ec: ExecutionContext) extends Actor with ActorLogging with Timers {

  context.setReceiveTimeout(30.seconds)

  override def receive: Receive = {
    case ReceivedTimeout => context.stop(self)
  }

}

30秒不活动后,您是否试图阻止演员?如果是这样,您可以使用
setReceiveTimeout
。此问题需要编辑标题,因为问题代码的作用(以及答案)与标题完全无关。但在你们有机会澄清你们的问题之前,我不想建议任何修改。谢谢你们的回答,很抱歉我的问题不清楚。场景是:1)我想在30秒内没有收到新消息时停止参与者。2) 当参与者停止时,我想检查它是否停止。你真的不必检查它是否停止,如果你调用
context.stop(self)
,那么它就停止了。如果您真的想亲自查看,可以尝试在消息停止后向参与者发送消息(您应该看到一个关于消息进入“死信队列”的日志条目)。实际上,我希望从参与者外部通知参与者停止。例如,当参与者在30秒不活动后停止时,从参与者系统之外,它应该知道参与者已经停止,然后做相应的事情。完全忘记这一点。而且比我想象的要短suggested@IvanStanislavciuc我们的解决方案是不同的,不清楚最初的问题想要什么。我的解决方案将在任何消息上重置超时,而你的解决方案仅在
LatestMessageSignal
上重置超时。我想我应该把这个备选方案放在这里,以防它足以满足问题海报的需要。