AKKA:无痛的演员错误通知

时间:2012-01-05 17:03:06

标签: scala akka

美丽的人们生活方式

  • 组件BEAUTIFUL正在使用她的内部akka.actor.Actor来执行某些操作..(例如“代理”)

  • 还有其他MAN组件非常希望与BEAUTIFUL

  • “互动”
  • BEAUTIFUL找到MAN有价值时,在与他“互动”之前,她同意接收他的电话号码(让我们称之为ErrorHandler),你我知道只是给他一个电话,以防他早上离开并在床边的桌子上忘了他的劳力士

  • BEAUTIFUL虽然是“高维护”(不是全部......),每次在BEAUTIFUL的内部演员身上发生不好事情时(例如OmgBrokenNailException 1}},UglyPurseThrowable等。),她疯了,需要完全停止并使用该电话号码拨打MAN(例如errorHandler.getOnItNowHoney( message, throwable )

美丽的人问题

AKKA主管允许注册两种类型的FaultHandlers => OneForOneStrategyAllForOneStrategy,如果基础Actor重写preRestart / postRestart,它可以访问实际的“throwable”,例如:

override def preRestart( reason: Throwable ) { // do with throwable... }

问题是这两种策略都会尝试重启Actor,这不是我要找的东西。我正在寻找演员用“throwable”调用外部ErrorHandler并停止。

如果我不使用这些策略,当从A​​ctor中抛出异常时,在Actor上调用postStop,这很酷,但它不会引入“throwable”:

override def postStop() { // no access to "throwable"... }

帮助MAN获取throwable

2 个答案:

答案 0 :(得分:5)

在Akka 2中,您应该使用DeathWatch

答案 1 :(得分:1)

如果我理解你的问题,我认为将你的消息处理包装在try / catch块中并让actor处理发送Throwable并自行停止是有意义的。

def receive = {
  case message => try { message match {
    case ... //your actual message processing goes here
  }} catch {
    case t: Throwable => {
      errorHandler ! t
      self.stop
    }
  }
}