当前位置: 首页 > 知识库问答 >
问题:

处理完成后Akka停止/杀死演员

廖永长
2023-03-14

我想知道如何有效地清理在飞行中创建的akka演员。

要提供一点背景信息:

每个事件创建的演员层次结构。

主管-

在我的应用程序中,主管参与者动态创建其他参与者(在定期事件上)。我想在该事件的处理步骤完成后清理参与者。

所以,一旦处理完成,我想杀死所有的儿童演员。

  1. 我在成功完成后以与创建相反的方式传播消息(successfulProcessing)。(1)-

这是主管演员的代码。

class Supervisor extends Actor {
    def receive={
        case onEvent: OnEvent =>
            //Create child actor and send message         
        case successfulProcessing =>
            sender() ! PoisonPill
    }
    override val supervisorStrategy = AllForOneStrategy() {
        case e: Exception =>
            Stop   
    }
}

这是清理动态创建的参与者的正确方法吗。这种方法是否有任何缺点,或者是否有一种模式可以遵循?

共有2个答案

齐修贤
2023-03-14

我看到的模式是有一个演员管理其他演员。在本教程的以下示例中,actor1管理actor2,其中actor2完成所有工作。

case class StartCounting(n: Int, actor: ActorRef)
case class CountDown(n: Int)

class CountDownActor extends Actor {
  def receive = {
    case StartCounting(n, actor) =>
      println(n)
      actor ! CountDown(n-1)
    case CountDown(n) =>
      if(n > 0) {
        println(n)
        sender ! CountDown(n-1)
      } else {
        context.system.shutdown()
      }
  }
}

object Main extends App {
  val system = ActorSystem("HelloSystem")
  // default Actor constructor
  val actor1 = system.actorOf(Props[CountDownActor], name = "manager")
  val actor2 = system.actorOf(Props[CountDownActor], name = "worker")
  actor1 ! StartCounting(10, actor2)
}

你可以把它想象成递归:基本情况和归纳情况。您可以将此应用于正在管理其父级的所有兄弟角色。

蓬长恨
2023-03-14

根据Akka文件2.4.14,处理毒药/杀戮信息的更好方法是广播它们。

    ActorRef ! Broadcast(PoisonPill)

注意:使用Balancingpool时不要广播消息

 类似资料:
  • 我经常发现自己使用一个“主”角色,为子任务创建许多子角色。当子任务完成时,主角也应该停止自己。所以当时,我观察子角色并停止主角色context.children.is。 我经常使用这种模式,但因为我从未读过这方面的文章。我不确定,这是一个好主意还是失败的演员有问题。。。? 我已经读过Akka 2中的关机模式,但是这种方法在Java中似乎比我的解决方案更复杂? 以下是我针对具有两个子任务的主要参与者

  • [04/27/2014 18:09:05.518][ReadScheduler-Akka.actor.Default-Dispatcher-3][Akka://ReadScheduler/User/Collector]从参与者[Akka://ReadScheduler/User/Executor#2127791644]到参与者[Akka://ReadScheduler/User/Collector

  • 我最近开始使用java配置方式编写spring批处理程序,并使用spring批处理和starter包。我使用了分区的步骤和任务执行器来完成我的工作,我面临的问题是,一旦作业完成,批处理过程就不会停止,它一直在我的eclipse和Linux盒子中运行。我手动找到并终止作业。你能帮个忙吗。当我在没有分区步骤的情况下以单线程的方式运行作业时,这工作很好。 我的作业配置:

  • 问题内容: 我使用Ant通过Jenkins启动/关闭JBoss 5服务器。Ant java的spawn和fork设置为“ true”,因此命令在后台执行。 Jenkins成功启动服务器,等待两分钟(Jenkins中的“ sleep”命令),然后在睡眠后由于某种奇怪的原因关闭服务器。sleep命令是构建作业的最后一步。关闭显示: 我用谷歌搜索并尝试了建议的-Xrs命令,但没有帮助。这是怎么回事 问题

  • java.util.concurrent.CompletionException:Akka.Pattern.AskTimeoutException:收件人[Actor[akka:/web_server/user/MyActor#-769383443]]已终止。发送者[null]发送了类型为“com.data.model.request”的消息。 所以我重写了方法,在那里添加了一个log语句。 现在

  • 从Android API 26开始,Android系统要求“执行一些用户可以注意到的操作”的服务将自身注册为前台服务。和“前台服务必须显示通知” 我有一个播放音频文件的服务。当播放暂停时,用户应该能够滑动通知(与Google Play音乐应用程序一样)。但是如果我调用,那么我的服务会在几分钟内被系统杀死。 暂停播放时,如何允许删除通知?