加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

scala – 可以在演员中使用Akka调度程序吗?

发布时间:2020-12-16 09:45:13 所属栏目:安全 来源:网络整理
导读:我想有可能让演员睡一会儿。演员应该决定自己要睡多久。由于Thread.sleep()不是推荐的方法,我想到在akka中使用调度程序。因此,我定义了一个演员是另一个演员可以注册被唤醒。 class Scheduler extends Actor { def receive = { case Sleep(duration) = con
我想有可能让演员睡一会儿。演员应该决定自己要睡多久。由于Thread.sleep()不是推荐的方法,我想到在akka中使用调度程序。因此,我定义了一个演员是另一个演员可以注册被唤醒。

class Scheduler extends Actor {

  def receive = {
    case Sleep(duration) => context.system.scheduler.scheduleOnce(duration) {
      sender ! Ring
    }
  }
}

但是发送者从来没有收到Ring消息。
所以我的问题是

>在一个演员推荐的调度计划?
>为什么发送演员永远不会收到Ring消息?
>如果这是不可能的,解决问题的推荐方法是什么?

解决方法

让我先回答标题问题:是的,可以在演员中使用调度程序。

case Sleep(duration) =>
  context.system.scheduler.scheduleOnce(duration,self,Ring)

现在问题背后的问题

你没有说出你实际想要实现的目标,所以我在这里做出一个有经验的猜测,希望演员通常做一些叫做“X”的东西 – 做一些叫做“Y”的东西,暂停一下“活动。对此的完整解决方案将是

class Sleepy extends Actor {
  def receive = {

    ... // cases doing “X”

    case Sleep(duration) =>
      case object WakeUp
      context.system.scheduler.scheduleOnce(duration,WakeUp)
      context.become({
        case WakeUp => context.unbecome()
        // drop the rest
      },discardOld = false)
  }
}

同样可以使用FSM特征和在正常和睡眠状态之间切换来实现。当然,你可以在睡觉时做任何你想要的,例如混合在Akka 2.1中的Stash特性,并在睡觉时为所有(或某些)消息调用stash(),获取WakeUp消息时,取消了所有()或者你可以做一些其他的事情。演员非常灵活。

什么演员不做

演员永远不会睡觉,他们总是处理传入的讯息。如上所示,您可以定义什么意思,但基本原则是您不能挂起一个actor,使其不会处理其邮箱中的邮件。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读