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

以Akka类型将消息发送到父执行元

基础概念

Akka是一个用于构建高并发、分布式、容错系统的工具包和运行时。它基于Actor模型,其中Actor是基本的计算单元。每个Actor都有一个邮箱,用于接收消息,并且可以发送消息给其他Actor。

类型

在Akka中,消息可以是任意类型的对象。发送消息到父执行元(Parent Actor)通常涉及以下几种类型:

  1. 普通消息:简单的Java或Scala对象。
  2. 控制消息:用于管理Actor生命周期的消息,如PoisonPill(终止Actor)。
  3. 系统消息:Akka内部使用的消息,如Kill(强制终止Actor)。

应用场景

发送消息到父执行元通常用于以下场景:

  • 请求父级帮助:子Actor可能需要父级的某些资源或状态。
  • 通知父级:子Actor完成某项任务后,通知父级。
  • 错误处理:子Actor遇到错误时,通知父级进行处理。

示例代码

以下是一个简单的示例,展示如何在Akka中发送消息到父执行元:

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

class ParentActor extends Actor {
  def receive = {
    case msg => println(s"Parent received message: $msg")
  }
}

class ChildActor(parent: ActorRef) extends Actor {
  def receive = {
    case msg =>
      println(s"Child received message: $msg")
      parent ! s"Child forwards message: $msg"
  }
}

object Main extends App {
  val system = ActorSystem("MySystem")
  val parentActor = system.actorOf(Props[ParentActor], "parentActor")
  val childActor = system.actorOf(Props(classOf[ChildActor], parentActor), "childActor")

  childActor ! "Hello from Main"
}

参考链接

常见问题及解决方法

问题:消息发送失败

原因:可能是由于Actor未正确启动、邮箱已满或网络问题。

解决方法

  • 确保Actor已正确启动。
  • 检查邮箱配置,确保邮箱大小足够。
  • 检查网络连接,确保Actor之间可以通信。

问题:消息顺序不一致

原因:Akka的Actor模型是异步的,消息处理顺序可能不一致。

解决方法

  • 使用Akka的Stash特性来确保消息按顺序处理。
  • 在设计系统时,尽量避免依赖消息处理的顺序。

问题:Actor终止后消息丢失

原因:如果Actor在处理消息之前被终止,消息可能会丢失。

解决方法

  • 使用PoisonPillgracefulStop来优雅地终止Actor。
  • 在发送重要消息前,检查Actor的状态。

通过以上方法,可以有效地解决在Akka中发送消息到父执行元时可能遇到的问题。

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

相关·内容

Akka 指南 之「消息传递可靠性」

特别地: 子 Actor C消息M发送到其父 Actor P 子 Actor 因错误F导致失败 Actor P可能按M、F或F、M的顺序接收这两个事件 这样做的原因是内部系统消息有自己的邮箱,因此用户和系统消息的排队调用顺序不能保证其出列时间的顺序...最简单的形式,这需要 识别单个消息消息与确认关联的方法 一种重试机制,如果不及时确认,重新发送消息 接收者检测和丢弃重复数据的一种方法 第三个是必要的,因为消息也不能保证到达。...Akka Persistence 支持「事件源」。 带明确确认的邮箱 通过实现自定义邮箱类型,可以在接收 Actor 端重试消息处理,处理临时故障。...Actor 可以订阅事件流上的类akka.actor.DeadLetter,请参阅「事件流」了解如何执行该操作。然后,订阅的 Actor 收到(本地)系统中从那时起发布的所有死信。...同样,你可能会看到akka.actor.Terminated来自子 Actor 的消息,而如果级 Actor 在级终止时仍在监视子 Actor,则会阻止一系列死信形式出现的 Actor。

1.8K10

Akka 指南 之「Actors」

信息和不变性 重要的:消息可以是任何类型的对象,但必须是不可变的。Akka 还不能强制执行不可变性,所以必须按惯例执行。...默认情况下,这些消息发送到ActorSystem的deadLetters,但这取决于邮箱的实现。...在上面的例子中,一个定制的Manager.Shutdown消息发送到目标 Actor,启动停止 Actor 的过程。...如果任务失败或未在超时内完成,则可以为一个阶段配置recover=off中止关闭过程的其余部分。 任务通常应在系统启动后尽早注册。运行时,执行已注册的协调关闭任务,但不会运行添加得太晚的任务。...调用unstashAll()消息从stash排队到 Actor 的邮箱,直到达到邮箱的容量(如果有),请注意,stash中的消息是预先发送到邮箱的。

4.2K30
  • Akka 指南 之「Actor 引用、路径和地址」

    Actor 引用是ActorRef的一个子类型,其首要目的是支持消息发送给它所代表的 Actor。...为了在发送到其他网络节点时也可以访问,这些引用包括协议和远程寻址信息。 本地 Actor 引用的一个子类型用于路由器(即 Actor 混合在Router特性中)。...远程 Actor 引用表示可以使用远程通信访问的 Actor,即向其发送消息透明地序列化消息并将其发送到远程 JVM。...因为结果不是单个 Actor 引用,所以它具有不同的ActorSelection类型,并且不支持ActorRef执行的完整操作集。...msg 向包括当前 Actor 在内的所有兄弟姐妹 Actor 发送msg。对于使用actorSelection获取的引用,遍历监督层次结构执行消息发送。

    1.7K20

    Akka 指南 之「集群分片」

    「集群分片」项目,了解 Akka 集群分片的实际使用情况。...SR1S2的缓冲消息发送到SR2。 到达SR1的S2的所有传入消息都可以由SR1处理,而不需要SC。它将消息转发到SR2。...所有实体终止后,拥有实体的ShardRegion确认已向协调器完成移交。此后,协调器将回复分片位置的请求,从而为分片分配一个新的位置,然后分片区域 Actor 中的缓冲消息发送到新位置。...通过这种方式,可以所有节点的子集用于某些实体类型另一个子集用于其他实体类型。...优雅地关闭 你可以ShardRegion.gracefulShutdownInstance消息发送给ShardRegion Actor,分发由该ShardRegion承载的所有分片,然后停止ShardRegion

    2.3K61

    Akka 指南 之「邮箱」

    文章目录 邮箱 依赖 简介 邮箱选择 指定 Actor 的消息队列类型 指定调度器的消息队列类型 如何选择邮箱类型 默认邮箱 哪个配置传递到邮箱类型 内置邮箱实现 邮箱配置示例 PriorityMailbox...注释:接口中的所需类型为 Actor 创建的邮箱中的队列类型,如果队列未实现所需类型,则 Actor 创建失败。 指定调度器的消息队列类型 调度器还可能需要运行在其上的 Actor 使用的邮箱类型。...这需要对调度器进行配置,如下所示: my-dispatcher { mailbox-requirement = org.example.MyInterface } 给定的需求命名一个类或接口,然后确保该类或接口是消息队列实现的类型...如果发生冲突,例如,如果 Actor 需要不满足此要求的邮箱类型,则 Actor 创建失败。 如何选择邮箱类型 创建 Actor 时,ActorRefProvider首先确定执行它的调度器。...在这之前,发送到ActorRef的消息将在本地排队,只有在交换真正的填充之后,它们才会被传输到真正的邮箱中。

    1.5K30

    Akka 指南 之「跨多个数据中心集群」

    由于其他原因,它也可以用作逻辑分组,例如隔离某些节点提高稳定性,或者大型集群拆分为较小的节点组获得更好的可伸缩性。...由于其他原因,它也可以用作逻辑分组,例如隔离某些节点提高稳定性,或者大型集群拆分为较小的节点组获得更好的可伸缩性。...跨数据中心检测故障的心跳消息仅在每侧的多个最旧节点(oldest nodes)之间执行。...如果你在所有节点上相同的名称启动一个实体类型,并且你定义了 3 个不同的数据中心,然后消息发送到相同的实体 ID 到所有数据中心的共享区域,那么你将得到该实体 ID 的 3 个活动实体实例,每个数据中心一个...在消息发送到本地区域 Actor 之前,你可以决定将消息路由到哪个数据中心。如上文所述,可以使用分片代理发送其他数据中心的消息,并将自己的数据中心的消息发送到本地区域。

    1.4K30

    Akka 指南 之「集群中的分布式发布订阅」

    更改只在注册表的自己部分执行,并且这些更改都是版本控制的。增量(Deltas)可扩展的方式通过gossip协议传播到其他节点。...如果多个条目与路径匹配,因为它已在多个节点上注册,则消息通过提供的路由逻辑(默认随机)发送到一个目标。...使用目标 Actor 的路径(不含地址信息),你可以通过DistributedPubSubMediator.Send消息发送到本地中介。...DistributedPubSubMediator.SendToAlll消息发送到本地中介,然后包装好的消息传递到具有匹配路径的所有收件人。...此模式的典型用法是消息广播到具有相同路径的所有副本,例如,在所有执行相同操作的不同节点上的 3 个 Actor,实现冗余。

    1.4K20

    使用Lagom和Java构建反应式微服务系统

    Lagom中的每个服务调用都有一个请求消息类型和一个响应消息类型。当不使用请求或响应消息时,可以在其位置使用akka.NotUsed。请求和响应消息类型分为两类:严格和流式传输。...Source是一种允许异步流式传输和处理消息Akka流API。 ? 此服务调用具有严格的请求类型和流响应类型。...使用流式传输消息需要使用Akka流。 tick服务调用返回指定间隔发送消息的源。 Akka流对这样的流有一个有用的构造函数: ? 前两个参数是发送消息之前的延迟以及它们应该发送的间隔。...第三个参数是应该在每个刻度上发送的消息1000的间隔调用此服务call和一个tick的请求消息导致返回的流每秒发送一个tick消息。...如果直接实现服务调用,您可以简单地返回类型更改为HeaderServiceCall。 ? 消息发送到Broker,如Apache Kafka,可以进一步解耦通信。

    1.9K50

    Akka 指南 之「持久化」

    onPersistRejected(默认情况下记录警告),并且 Actor 继续执行下一条消息。...这些语义类似于ActorPath所表示的含义,因此在传递消息时需要提供路径而不是引用。消息将与 Actor 选择(selection)一起发送到路径。 使用deliver方法消息发送到目标。...如果持久性 Actor 当前未恢复,则deliver方法消息发送到目标 Actor。恢复时,缓冲消息,直到使用confirmDelivery确认消息。...相同的序列用于 Actor 的所有目的地,即当发送到多个目的地时,目的地看到序列中的间隙。无法使用自定义deliveryId。但是,你可以消息中的自定义关联标识符发送到目标。...在恢复过程中,deliver调用不会发送消息,如果未执行匹配的confirmDelivery,则稍后发送这些消息

    3.5K30

    Akka 指南 之「集群单例」

    -- sbt --> libraryDependencies += "com.typesafe.akka" %% "akka-cluster-tools" % "2.5.21" 简介 对于某些用例,确保集群中某个类型的某个...你可以使用提供的akka.cluster.singleton.ClusterSingletonProxy访问单例 Actor,该代理所有消息路由到单例的当前实例。...代理跟踪集群中最老的节点,并通过显式发送单例的actorSelection 的akka.actor.Identify消息并等待其回复来解析单例的ActorRef。...在这些情况下,代理缓冲发送到单例的消息,然后在单例最终可用时传递它们。如果缓冲区已满,则当通过代理发送新消息时,ClusterSingletonProxy删除旧消息。...值得注意的是,由于这些 Actor 的分布式特性,消息总是会丢失。一如既往,额外的逻辑应该在单例(确认)和客户机(重试)Actor 中实现,确保至少一次消息传递。

    1.1K20

    Akka 指南 之「集群感知路由器」

    有两种不同类型的路由器。 Group,使用 Actor selection消息发送到指定路径的路由器:路由可以在群集中不同节点上运行的路由器之间共享。...routees.paths中定义的 Actor 路径用于选择由路由器消息转发到的 Actor。路径不应包含协议和地址信息,因为它们是从集群成员(membership)动态检索的。...带路由组的路由器示例 让我们来看看如何集群感知路由器与一组路由(即发送到路由器路径的路由)一起使用。 示例应用程序提供了一个计算文本统计信息的服务。...当一些文本被发送到服务时,它将其拆分为单词,并将任务分配给一个单独的工作进程(路由器的一个路由),计算每个单词中的字符数。...带有远程部署路由池的路由器 Pool与在群集成员节点上创建和部署的路由一起使用时,路由器的配置如下所示: akka.actor.deployment { /statsService/singleton

    98320

    阅读源码|Spark 与 Flink 的 RPC 实现

    而在 Typed Akka 中,由于 sender() 无法确切的类型化,因此采用的是消息来源直接编码在发送的消息中的方式在需要的时候使用它回复消息,这要求 ActorRef 在不同的 ActorSystem...endpoint.onNetworkError(cause, remoteAddress) } // ... } } 简单扫过回调系列函数,我们看到 Spark RPC 判断消息转往何处主要是看消息类型是...两者的主要区别在于是否支持序列化,因为只有发往远端的消息才需要考虑序列化相关的事项。这个消息包含了方法调用的信息,即方法名,参数列表和参数类型列表。...我们看到这个接口的方法,猜想是我们可以一个 Runnable 或者 Callable 交给一个此接口的实现去异步地执行。...后者则是直接拿到 Akka ActorSystem 中的 Dispatcher 作为 Executor,动作发布到 ActorSystem 的 Dispatcher 中去调度执行

    1.2K20

    Akka 指南 之「集群规范」

    如果有太多未确认的系统消息(例如监视、终止、远程 Actor 部署、远程级监控的 Actor 失败),则可能发生这种情况。...种子节点配置值对正在运行的集群本身没有任何影响,它只与加入集群的新节点相关,因为它帮助它们找到要向其发送join命令的联系点;新成员可以将此命令发送到集群的任何当前成员,而不仅仅发送到种子节点。...消息用「protobuf」序列化,也用gzip压缩减小有效负载的大小。 Membership Lifecycle 节点joining状态开始。...一旦所有节点都看到新节点正在加入(通过消息聚合),则leader将会设置成员状态为up。 如果一个节点一种安全的、预期的方式离开集群,那么它将切换到leaving状态。...joining -> up weakly up -> up(执行此操作,不需要消息收敛) exiting -> removed Failure Detection and Unreachability

    1.3K20

    Akka 指南 之「Actor 模型如何满足现代分布式系统的需求?」

    总之,当 Actor 收到消息时会发生以下情况: Actor 消息添加到队列的末尾。 如果 Actor 没有执行计划,则将其标记为准备执行。...Actor 的行为描述了 Actor 如何响应消息(如发送更多消息和/或更改状态)。执行环境协调线程池完全透明地驱动所有这些操作。...Akka 要求所有 Actor 都被组织成一个树形的结构,即一个创造另一个 Actor 的 Actor 成为新 Actor 的节点。这与操作系统流程组织到树中的方式非常相似。...这项服务称为监督,是 Akka 的核心概念。 ? 一个监督者(级节点)可以决定在某些类型的失败时重新启动其子 Actor,或者在其他失败时完全停止它们。...总是有一个负责管理 Actor 的实体:它的节点。从外部看不到重新启动:协作 Actor 可以在目标 Actor 重新启动时继续发送消息。 现在,让我们简单介绍一下 Akka 提供的功能。

    1.2K30

    Spark系列——作业原理详解

    ,这里会创建一个jobwaiter对象,并发送一个JobSubmitted消息进行作业任务的执行,同时 waiter.awaitResult()会等待作业执行结果的返回:成功或者失败。...(stage) 方法提交执行;如果存在调度阶段,则把该调度阶段存放到 waitingStages 列表中,同时递归调用 submitStage,直到找到没有stage的stage调用 submitMissingTasks...(stage)作业一次调度的入口,这样一次调度任务就发送到Excutor开始执行了。...然后获取的结果通过TaskSchedulerlmpl 的 handleSuccessfulTask进行处理,最后发送一个completionevnet消息最终调用DAGScheduler 的 handleTaskCompletion... taskset 构建成 TaskSetManager 对象管理,并按照调度系统给定的策略向 Executor 提交任务,Executor 接受的到 task taskrunner 的方式执行计算出结果

    38220

    漫谈并发编程:Actor模型

    和共享数据方式相比,消息传递机制最大的优点就是不会产生数据竞争状态(data race)。实现消息传递有两种常见的类型:基于channel的消息传递和基于Actor的消息传递。...但包括面向对象语言在内的软件通常是顺序执行的,而Actor模型本质上则是并发的。...消息和信箱 异步地发送消息是用actor模型编程的重要特性之一。消息并不是直接发送到一个actor,而是发送到一个信箱(mailbox)。如下图。 ?...SimpleCelebrate("clare", 18) } //这里用三个case class来声明三种消息类型 // case class有一个好处就是可以用在case语句中 case class...MapActor接收到一行行的数据后,数据处理成(word:1)的形式,并发送到所有的ReduceActor中。

    2.7K41

    Akka 指南 之「集群客户端」

    此外,由于 Akka 远程处理(Remoting)主要设计为 Akka 群集的协议,因此没有明确的资源管理,当使用了ClusterClient时,它将导致与群集的连接,直到ActorSystem停止(与其他类型的网络客户端不同...ClusterClient.Send:如果存在匹配路径,则消息传递给一个收件人。如果多个条目与路径匹配,则消息将被传递到一个随机目标。...消息的发送者可以指定首选本地路径,即消息发送到与所用的接待员 Actor 处于相同本地 Actor 系统中的 Actor(如果存在),否则随机发送到任何其他匹配条目。...值得注意的是,由于这些 Actor 的分布式特性,消息总可能丢失。一如既往,额外的逻辑应该在目标(确认)和客户端(重试)Actor 中实现,确保至少一次的消息传递。...当客户端运行时,它将检测到其与接待员的连接失败,如果错过的心跳超过可配置的数量,客户端尝试重新连接到其已知的连接点,找到可以访问的接待员。

    1.8K30

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

    状态更改为Down可以自动或手动执行。默认情况下,必须使用「JMX」或「HTTP」手动完成。 它也可以用Cluster.get(system).down(address)编程方式执行。...这意味着,你收到与当前状态相对应的事件,模拟在过去发生事件时,如果正在监听这些事件,你看到的情况,而不是作为第一条消息接收CurrentClusterState。...有更多类型的变更事件,请参阅扩展akka.cluster.ClusterEvent.ClusterDomainEvent类的 API 文档,了解有关事件的详细信息。...当一些文本发送到其中一个frontend服务时,它将被委托给一个backend,后者执行转换作业,并将结果发送回原始客户机。...如果有太多未确认的系统消息(例如监视、终止、远程 Actor 部署、远程级监控的 Actor 失败),则可能发生这种情况。

    4.7K60
    领券