首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Akka:如何在重启时获取儿童演员

Akka是一种基于Actor模型的并发编程框架,用于构建可扩展、高并发、分布式的应用程序。在Akka中,Actor是并发执行的基本单元,它们通过消息传递进行通信和协作。

当涉及到重启时,Akka提供了一种机制来处理Actor的异常情况,即通过监督策略来管理Actor的生命周期。当一个Actor发生异常时,监督者Actor可以根据指定的策略来决定如何处理异常。其中一个常见的策略是重启,即停止异常的Actor并重新创建一个新的Actor来代替它。

在Akka中,子Actor是由父Actor创建和监督的。当子Actor发生异常并被重启时,父Actor可以通过监督机制来获取新创建的子Actor的引用。这可以通过在父Actor中重写preRestart方法来实现。在preRestart方法中,父Actor可以保存新创建的子Actor的引用,以便在重启后继续使用它。

以下是一个示例代码,展示了如何在重启时获取新创建的子Actor的引用:

代码语言:txt
复制
import akka.actor.{Actor, ActorRef, ActorSystem, Props}

class ParentActor extends Actor {
  var childActor: ActorRef = _

  override def preStart(): Unit = {
    childActor = context.actorOf(Props[ChildActor], "childActor")
  }

  override def preRestart(reason: Throwable, message: Option[Any]): Unit = {
    childActor = context.actorOf(Props[ChildActor], "childActor")
  }

  override def receive: Receive = {
    case msg =>
      childActor ! msg
  }
}

class ChildActor extends Actor {
  override def receive: Receive = {
    case msg =>
      // 处理消息
  }
}

val system = ActorSystem("MySystem")
val parentActor = system.actorOf(Props[ParentActor], "parentActor")

// 发送消息给父Actor
parentActor ! "Hello"

// 当子Actor发生异常并被重启后,可以继续使用新创建的子Actor
parentActor ! "World"

在上述示例中,ParentActor是父Actor,它在preStart方法中创建了一个子ActorChildActor。当子Actor发生异常并被重启时,preRestart方法会重新创建一个新的子Actor。父Actor可以在preRestart方法中获取新创建的子Actor的引用,并在重启后继续使用它。

需要注意的是,上述示例是使用Scala编写的Akka代码。如果使用其他编程语言,可以参考相应的Akka文档和示例代码来实现相似的功能。

关于Akka的更多信息和详细介绍,您可以访问腾讯云的Akka产品页面:Akka - 腾讯云

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

.NET环境大规模使用OpenTracing

使用OpenTracing以低成本了解复杂性 Akka.NET和大规模分布式演员的问题在于,在任何特定时间,你的系统每秒都可以进行数千万次交互,看起来与此太相似: ?...其中存在的问题是:这种位置透明性,使得演员如此擅长以可扩展的方式分配工作,这可能会使他们在生产中出现问题进行调试非常令人沮丧:知道出现问题的地点和时间变成一个非凡问题,尤其是当你有数百万次这样的操作一直在发生...Akka.NET应用程序不作为单线程,单体进程存在,它们是高度并发且通常是分布式的进程。因此.NET中常见的传统跟踪工具,Intellitrace,通常无法帮助我们回答系统内部“出了什么问题?”。...但我们遇到了一个小问题:我们的客户无法接受单一供应商的解决方案作应用程序性能监视,他们肯定不会接受只适用于Akka.NET,而不适用于其他重要的.NET技术,ASP.NET Core和SignalR。...每次演员发送或接收消息,我们都会创建一个新的Span,并将跟踪标识符传播到我们在演员之间传递的每条消息中,包括通过网络传递。

1.1K10
  • 比较.NET 平台下 四种流行Actor框架

    缺点 没有明确地支持传统的行为体层次结构 没有可用的商业支持 对于我们的口味来说,"通过属性进行配置 "和其他自动魔法还是有点太多了 Akka.Net Akka.Net是来自Java生态系统的Akka...为另一个框架的近似移植,Akka.Net带来了原版的所有好主意,但也带来了有争议的设计决定(例如HOCON配置)。 Akka.Net主要集中在传统角色和监督层次的使用案例上。...它还使用现有的集群提供者,Consul、Zookeeper,甚至是原生的Kubernetes APIs。你可以选择适合你的用例和基础设施的实现。...行为体应该把它的状态保存在内存中,只有在需要才与持久化存储进行交互。如果你使用Dapr SDK之一,状态会被缓存在内存中,否则你必须自己实现一个类似的解决方案。 缺点是,边车的方法会引入开销。...看起来,Dapr的虚拟演员实现并不是为了高吞吐量的场景。 展示的应用程序,eShopOnDapr,使用虚拟角色来实现一个持久的工作流(流程管理器模式),这是一个有趣的用例。

    22610

    Akka(2):Actor生命周期管理 - 监控和监视

    同样,任何Actor在重启(Restart)也必须递归式地重启直属子级,因为重启一个Actor需要先停止再启动,我们必须肯定在停止不会产生孤儿Actor。...造成一个Actor需要重启的原因可能有下面几个: 1、在处理某特定消息造成了系统性的异常,必须通过重启来清理系统错误 2、内部状态毁坏,必须通过重启来重新构建状态 3、在处理消息无法使用到一些依赖资源...为了应付更复杂的重启方式,Akka提供了一种逐步延时重启策略(BackoffSupervisor)。...、当一个子级Actor因为异常造成失败中断再重启用onFailure。...所以在处理异常我们应该使用onFailure。 我们看到BackoffSupervior提供了更详细的重启方式支持。

    2.4K80

    Windows环境下Flink消费Kafka实现热词统计

    注意下这个地方:ParameterTool.fromArgs(args);我们所有的关于KafkaConsumerConfig的配置,都是通过启动参数传入的,然后Flink提供了一个从args中获取参数的工具类...如果此值大于1,则单个TaskManager将获取函数或运算符的多个实例。这样,TaskManager可以使用多个CPU内核,但同时,可用内存在不同的操作员或功能实例之间划分。...当然,如果你修改了配置文件,Flink Server是需要重启的。...重启成功后,可以在大盘看到,如下图箭头: 一切就绪后,在kafka-console-producer窗口中输入字符串回车,就会在flink job窗口中看到相关的信息了,效果前文一样,如图:...关于架构&运维部 凯京研发中心架构&运维部的工作主要分两大部分,架构部分主要负责框架中间件的研究,dubbo、apollo、skywalking、xxljob、分布式事务等、公司内开源项目(https

    25040

    计算与推断思维 六、可视化

    例如,一个演员可能会出现在一些高收入的动作电影或喜剧中( Meet Fockers),也可能是优秀但不会吸引大量人群的小众电影。 因此,演员的每部电影的平均收入值可能相对较低。...造成这种矛盾的一个原因是,人们在经济衰退往往会去看电影。 “经济低迷时期,美国人涌向电影”,“纽约时报”于 2009 年 2 月说。...当使用这种方法绘制,直方图被称为在密度刻度上绘制。 在这个刻度上: 每个条形的面积等于相应桶中的数据值的百分比。 直方图中所有条形的总面积为 100%。...当然,2014 年的 14 岁儿童大部分都是 2010 年的 10 岁儿童。为了看到这一点,请查看 14 岁的金色图表和 10 岁的蓝色图表。...与该州儿童人口的比较表明,未来几年拉美裔人口的比例可能会更高。 在加州儿童中,50% 属于拉美裔。

    2.8K20

    Akka 指南 之「Akka 和 Java 内存模型」

    Akka 和 Java 内存模型 使用 LightBend 平台(包括 Scala 和 Akka)的一个主要好处是简化了并发软件的编写过程。...本文讨论了 LightBend 平台,特别是 Akka何在并发应用程序中处理共享内存。 Java 内存模型 在 Java 5 之前,Java 内存模型(JMM)是定义有问题的。...这些规则的两个例子是: 监视器锁规则:在每次后续获取同一锁之前,都会释放一个锁。 volatile变量规则:volatile变量的写入发生在同一volatile变量的每次后续读取之前。...如果 Actor 在处理消息更改其内部状态,并在稍后处理另一条消息访问该状态。重要的是要认识到,对于 Actor 模型,你不能保证同一线程将对不同的消息执行相同的 Actor。...关闭内部 Actor 状态并将其暴露给其他线程 import akka.actor.{ Actor, ActorRef } import akka.pattern.ask import akka.util.Timeout

    99420

    Akka 指南 之「第 1 部分: Actor 的体系结构」

    当代码执行时,输出包括第一个 Actor 的引用,以及匹配printit模式创建的子 Actor 的引用。...Actor 的生命周期 Actor 在被创建就会出现,然后在用户请求被停止。每当一个 Actor 被停止,它的所有子 Actor 也会被递归地停止。...事实上,在处理初级多线程代码,一个通常被忽视的困难是各种并发资源的生命周期管理。...在这个例子中,我们使用了preStart()和postStop()钩子,这是重启后和重启前默认调用的钩子,因此我们无法区分 Actor 内部是第一次启动还是重启。...接下来,我们将会把这些知识应该到我们的示例中,获取设备 Actor 的信息。稍后,我们将讨论如何管理小组中的 Actor。

    1K20

    Scala Actors迁移指南

    使用restart方法——Akka不提供显式的重启actors,因此上述例子我们不能提供平滑迁移。用户必须更改系统,所以没有使用重启方法(restart method)。...这降低了在同一刻引入多个bug的可能性,同样降低了bug的复杂程度。 在Scala方面迁移完成后,用户应该改变import语句并变成使用Akka库。...对下列方法的用户需要找到一个解决方案: getState()——Akka中的actors 默认情况下由其监管actors(supervising actors)负责管理和重启。...restart() - 显式的重启一个Scala actor。在Akka中没有相应的功能。 所有其他Actor方法需要转换为两个ActorRef中的方法。转换是通过下面描述的规则。...然而,不像Scala的Exit消息包含结束的原因,Akka的watching 返回Terminated(a: ActorRef)消息,只包含ActorRef。获取结束原因的功能无法被移植。

    1K20

    Akka(13): 分布式运算:Cluster-Sharding-运算的集群分片

    Akka-Cluster还可以根据整个集群中节点的增减按当前集群节点情况进行分片在集群节点调动来重新配载(rebalance),包括在某些节点因故脱离集群把节点上的所有Actor在其它在线节点上重新构建...case msg@ _ => calcActor.forward(msg) } } 我们看到:Calculator是一个普通的PersisitentActor,内部状态可以实现持久化,Actor重启可以恢复状态...这个eid的第一个字节代表shard-id,这样我们可以直接指定目标entity所在分片或者随意任选一个shard-id:Random.NextInt(9).toString。...下面的代码示范了如何在一个集群节点上部署分片: package clustersharding.shard import akka.persistence.journal.leveldb._ import...++= Seq( "com.typesafe.akka" %% "akka-actor" % akkaversion, "com.typesafe.akka" %% "akka-remote"

    1.5K80

    Akka(3): Actor监管 - 细述BackoffSupervisor

    [INFO] [05/29/2017 16:11:48.177] [testSystem-akka.actor.default-dispatcher-2] [akka://testSystem/user...selectedChild 上面我们向supervisor发送了一个BackoffSupervisor.GetCurrentChild消息用来获取子级Actor。...在构建上面例子里的Supervisor的Props定义了监管策略(SupervisorStrategy)对InnerChild产生的异常ChildException进行Restart处理。...注意:我们同时把ChildException改成了一个带参数的class,因为我们可能需要在重启之前获取造成异常的消息,如下: def decider: PartialFunction[Throwable...下面我们来解决失踪消息的问题:首先是如何重新发送造成异常的消息,我们可以在监管策略中重启前发送: def decider: PartialFunction[Throwable, SupervisorStrategy.Directive

    89860

    Akka 指南 之「集群的使用方法」

    联接到种子节点 注释:当在云系统上启动集群 Kubernetes、AWS、Google Cloud,、Azure、Mesos 或其他维护 DNS 或其他发现节点的方式,你可能希望使用开源「Akka...有时,不订阅集群事件,只使用Cluster.get(system).state()获取完整成员状态是很方便的。请注意,此状态不一定与发布到集群订阅的事件同步。...如何在达到群集大小时启动 一个常见的用例是在集群已经初始化、成员已经加入并且集群已经达到一定的大小之后启动 Actor。...如果在系统加载遇到可疑的误报,你应该为集群 Actor 定义一个单独的调度程序,「Cluster Dispatcher」中所述的。 如何测试?...JMX 信息可以用普通的 JMX 控制台, JConsole 或 JVisualVM 显示。

    4.7K60

    移动AR应用《Wonderscope》,把卧室变成孩子的“故事书”

    借助手机或平板电脑,用户即能看到栩栩生的数字角色融入至现实背景。这也意味着,虚拟的童话故事走入了真实生活。...Betty站在一架老式双翼飞机的机顶上,被带到了几百英尺的高空中;第二位是好莱坞电影史上第一位特技女演员Helen Gibson,应用展示了其表演特技摩托的场景;第三位是世界上第一位通过走钢丝,穿过尼亚加拉大瀑布的人...当孩子大声朗读段落,语音识别系统将使用本地存储的机器学习模型,来触发相应的内容动作。 ?...虽然儿童图书销售依然强势,但AR为“向儿童讲故事”提供了新的可能。 此前,App Store中也曾出现过相似的应用《Bookful》。...该应用提供的AR内容为经典儿童故事,《彼得兔的故事》和《本杰明兔子》。如今,《Wonderscope》和《Bookful》都已上线,家长也多了一项让孩子开心度过假期的新安排。

    1.6K20

    聊聊Akka

    另外,当JVM崩溃,为了避免Actor状态的丢失,我们可以借助持久化方案来对状态进行持久化操作。...监管策略(SupervisorStrategy) Actor系统是一个层级结构,当任务被某个Actor分摊到子Actor,父Actor就拥有监管子Actor的义务。...在监管,我们需要根据不同的情况选择不同的处理方案(比如停止、重启、恢复或者失败上溯)和策略(比如1 vs 1、1 vs N策略)。...当程序出错, JVM崩溃,任何关键状态的丢失,对我们后续的业务来讲都可能是致命的打击,所以状态数据的持久化变得非常重要。Akka提供了Actor状态的持久化方案,以便我们在必要恢复数据。...Lagom就是这样一款微服务框架,它基于异步的消息驱动,对分布式集群、持久化( JPA、NoSql)都有良好的支持。同时,它也拥有完整的集成开发环境,非常便于在线部署和管理。

    2.2K30

    Akka 指南 之「第 3 部分: 使用设备 Actors」

    -- sbt --> libraryDependencies += "com.typesafe.akka" %% "akka-actor" % "2.5.19" 简介 在前面的主题中,我们解释了如何在大范围...(in the large)内查看 Actor 系统,也就是说,如何表示组件,如何在层次结构中排列 Actor。...从设备 Actor 获取当前温度的协议很简单。Actor: 等待当前温度的请求。 对请求作出响应,并答复: 包含当前温度,或者 指示温度尚不可用。 我们需要两条消息,一条用于请求,一条用于回复。...此外,当在同一个 JVM 中发送,如果一个 Actor 在处理消息由于编程错误而失败,则效果与处理消息由于远程主机崩溃而导致远程网络请求失败的效果相同。...该词直接强调,此保证仅在与tell运算符直接发送到最终目的地适用,而在使用中介不适用。 如果: Actor A1 向 A2 发送消息M1、M2和M3。

    59230
    领券