在Akka中阻止库代码中处理异常

时间:2013-04-12 22:19:55

标签: akka

我在路由器后面有一个DB Worker actor池,它通过一个阻止数据库操作 道。如果你将foo对象插入(“put”)到Dao中,则会抛出DuplicateKeyException 尝试两次插入相同的foo。在那种情况下,我想用DuplicateFoo(foo)回复 信息;一旦成功,我想用FooAdded(foo)回复。这是我如何做到的;是 还有更好的方法吗?

def receive = {
  case PutFoo(foo) =>
    try {
      dao.put(foo)
      sender ! FooAdded(foo)
    } catch {
      case DuplicateKeyException(_) =>
        sender ! DuplicateFoo(foo)
    }
}

Dao可以在抛出DuplicateKeyException之后继续处理请求,所以我 觉得没有必要重新启动工人。

1 个答案:

答案 0 :(得分:1)

从理论的角度来看,你所做的是“包含”检查然后“放”或“通知”。从实际的角度来看,如何实施它是“放”,如果地狱破裂“通知”。

由于理论上存在无意外行为,因此put 在失败的情况下的实施并不理想。如果需要唯一性,则应该进行“包含”检查,因此put(或您的方案中的PutFoo)应返回状态(成功|失败),即使它尝试“放入”和在内部捕获DuplicateKeyException。以BooleanOptionEitherTry或您自己的状态ADT为准,但不要针对您预期会不时发生的事情抛出异常。

如果没有例外,则无需重新启动工作人员,但我猜你的直觉一直试图告诉你这一点。 ;)