akka中,父actor可以定义supervisorStartegy来实现对子actor的异常监管应对策略。

*   override val supervisorStrategy = OneForOneStrategy(maxNrOfRetries = 10, withinTimeRange = 1 minute) {
*     case _: ArithmeticException      => Resume
*     case _: NullPointerException     => Restart
*     case _: IllegalArgumentException => Stop
*     case _: Exception                => Escalate
*   }

以上为一个监管策略的具体实现,可以看到具体的异常应对策略有Resume,Restart,Stop和Escalate。

当父actor生成子actor的时候,将会通过在子actor中的parent记录父actor来传递异常信息。

下面是具体的监管实现。

在子actor处理消息的invoke()函数中,将会捕获在receive()函数中抛出的异常,并在handleInvokeFailure()函数中进行处理。

final def invoke(messageHandle: Envelope): Unit = {val influenceReceiveTimeout = !messageHandle.message.isInstanceOf[NotInfluenceReceiveTimeout]try {currentMessage = messageHandleif (influenceReceiveTimeout)cancelReceiveTimeout()messageHandle.message match {case _: AutoReceivedMessage => autoReceiveMessage(messageHandle)case msg                    => receiveMessage(msg)}currentMessage = null // reset current message after successful invocation} catch handleNonFatalOrInterruptedException { e =>handleInvokeFailure(Nil, e)} finally {// Schedule or reschedule receive timeoutcheckReceiveTimeout(reschedule = influenceReceiveTimeout)}
}

在handleInvokeFailure()函数中,将会直接将错误信息封装成Failed类型的系统消息投递到parent父actor的系统消息队列中。

父actor将会通过读取系统消息队列的时候读取到子actor中发生的异常。

在systemInvoke中的invokeAll()函数中将会进行具体处理。

@tailrec
def invokeAll(messages: EarliestFirstSystemMessageList, currentState: Int): Unit = {val rest = messages.tailval message = messages.headmessage.unlink()try {message match {case message: SystemMessage if shouldStash(message, currentState) => stash(message)case f: Failed                                                    => handleFailure(f)case DeathWatchNotification(a, ec, at)                            => watchedActorTerminated(a, ec, at)case Create(failure)                                              => create(failure)case Watch(watchee, watcher)                                      => addWatcher(watchee, watcher)case Unwatch(watchee, watcher)                                    => remWatcher(watchee, watcher)case Recreate(cause)                                              => faultRecreate(cause)case Suspend()                                                    => faultSuspend()case Resume(inRespToFailure)                                      => faultResume(inRespToFailure)case Terminate()                                                  => terminate()case Supervise(child, async)                                      => supervise(child, async)case NoMessage                                                    => // only here to suppress warning}} catch handleNonFatalOrInterruptedException { e =>handleInvokeFailure(Nil, e)}val newState = calculateState// As each state accepts a strict subset of another state, it is enough to unstash if we "walk up" the state// chainval todo = if (newState < currentState) rest.reversePrepend(unstashAll()) else restif (isTerminated) sendAllToDeadLetters(todo)else if (todo.nonEmpty) invokeAll(todo, newState)
}

在这里,之前封装的Failed事件将会在handleFailure()函数中相应进行处理。

在handleFailure()函数中将会根据之前定义的监管策略来对此处取得的异常进行相应的处理。

final protected def handleFailure(f: Failed): Unit = {currentMessage = Envelope(f, f.child, system)getChildByRef(f.child) match {/** only act upon the failure, if it comes from a currently known child;* the UID protects against reception of a Failed from a child which was* killed in preRestart and re-created in postRestart*/case Some(stats) if stats.uid == f.uid =>if (!actor.supervisorStrategy.handleFailure(this, f.child, f.cause, stats, getAllChildStats)) throw f.causecase Some(stats) =>publish(Debug(self.path.toString,clazz(actor),"dropping Failed(" + f.cause + ") from old child " + f.child + " (uid=" + stats.uid + " != " + f.uid + ")"))case None =>publish(Debug(self.path.toString, clazz(actor), "dropping Failed(" + f.cause + ") from unknown child " + f.child))}
}

在这里,当配置的应对策略是Escalate的时候,将会直接false,导致会直接将这个异常抛到更加高一层的actor中进行处理。

akka actor父子监管的实现相关推荐

  1. 【Akka】Akka Actor生命周期

    1.概述 转载:Akka Actor生命周期 用于自我学习. Actor的生命周期是使用Hooks体现和控制的,我们可以重写相关的Hooks,从而实现对Actor生命周期各环节的细粒度控制.各事件发生 ...

  2. java akka actor,【Akka】Actor引用

    Actor系统的实体 在Actor系统中,actor之间具有树形的监管结构,并且actor可以跨多个网络节点进行透明通信. 对于一个Actor而言,其源码中存在Actor,ActorContext,A ...

  3. Akka Actor模型的简介与Actor的创建方式

    Akka Actor其具有以下特点: 系统中的所有事物都可以扮演一个Actor Actor之间完全独立 在收到消息时,Actor所采取的所有动作都是并行的,在一个方法中的动作没有明确的顺序 Actor ...

  4. akka actor java_Akka:使用非默认构造函数在Scala中定义一个actor并从Java代码创建它 - java...

    Akka Scala演员必须扩展akka.actor.Actor Akka Java actor必须扩展akka.actor.UntypedActor 因此,在使用非默认构造函数定义Scala act ...

  5. scala中akka actor例子

    抛开复杂的业务逻辑,让我们从一个超级简单的例子学习Akka Actor的用法. Scala cookbook的作者Alvin Alexander在他的网站上提供了两个例子. 本文翻译.整理于他的两篇文 ...

  6. AKKA Actor创建

    Actor 类定义 Actor 类需要继承AbstractActor类 实现createReceive方法,绑定各类actor收到不同类型消息对应处理不同业务逻辑 默认提供了ReceiveBuilde ...

  7. akka actor java_现代化的Java(三)——从Hello Akka说起

    接下来打算花一些篇幅介绍一些异步编程的范式,也算是给自己一个学习笔记吧. 异步编程是个很诡异的领域,每个人都在谈论它,但是工作中很少有人能驾驭:很多很新潮很热的异步编程概念,运用起来却完全达不到它宣称 ...

  8. java akka actor性能_akka-http - 如何通过Akka HTTP(Java)与Akka Actor进行交互 - 堆栈内存溢出...

    话题 我想通过Akka HTTP与Akka Actor进行交互 . 这个想法是要有一个系统,其中HTTP客户端调用Akka HTTP服务器方法,该方法处理对Akka Actor的请求. actor处理 ...

  9. Akka Actor Inbox_信箱

    2019独角兽企业重金招聘Python工程师标准>>> Akka Actor Inbox_信箱 Inbox_send_receive Inbox 形象的表示为Actor的信箱,具有收 ...

最新文章

  1. pandas isnull 函数
  2. 关于数据中心机房的专业名词
  3. 用python做毕业设计小程序_用Python写一个模拟qq聊天小程序的代码实例
  4. 【图像】插值方法原理(最近邻,双线性,双三,兰索斯)
  5. 立镖机器人浙江_立镖在美国获2020 NextGen供应链解决方案奖
  6. ps如何修改图片大小尺寸_PS新手入门教程:学习如何修改画布的大小
  7. win7电脑假死机怎么办
  8. vim 使用、设置笔记
  9. 案例:仿小米logo过渡渐变效果
  10. Android 使用Gallery仿3D画廊效果实现
  11. 360技术笔试+技术能力笔试(1)——能力测评
  12. 利润统计函数c语言,C语言计算内部回报率(或名内部收益率)(IRR)
  13. 红蓝对抗——蓝军(CheckList)总结
  14. 小米全国高校编程大赛 正式赛题解
  15. 听说ES6中新增了能够与众不同的Symbol数据类型
  16. html里的下划线怎么消除,如何取消自带的下划线
  17. Docker pull 失败,更换国内源daocloud
  18. elasticsearch7.X x-pack破解使用权限和告警等功能
  19. iOS 2020iPhoneX、iPhone12刘海适配,底部安全区域高度
  20. 关于学习JavaScript!

热门文章

  1. Junit5集成到SpringBoot工程
  2. Dockerfile文件详解
  3. Kafka万亿级消息实战解决方案干货
  4. SpringBoot继承TkMapper通用Mapper
  5. React-JSX详细语法及渲染使用
  6. 字符串匹配(二)——逆向思维 BMH
  7. 文字旋转_技术宅大白教你用软件做抖音爆火的文字旋转视频
  8. get请求中传json参数报400的错误_诡异 | Spark使用get_json_object函数
  9. 斐波那契数列的Python实现
  10. redis快照持久化和aof日志持久化