我在路由器后面有一个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之后继续处理请求,所以我 觉得没有必要重新启动工人。
答案 0 :(得分:1)
从理论的角度来看,你所做的是“包含”检查然后“放”或“通知”。从实际的角度来看,如何实施它是“放”,如果地狱破裂“通知”。
由于理论上存在无意外行为,因此put
在失败的情况下的实施并不理想。如果需要唯一性,则应该进行“包含”检查,因此put
(或您的方案中的PutFoo
)应返回状态(成功|失败),即使它尝试“放入”和在内部捕获DuplicateKeyException
。以Boolean
或Option
或Either
或Try
或您自己的状态ADT为准,但不要针对您预期会不时发生的事情抛出异常。
如果没有例外,则无需重新启动工作人员,但我猜你的直觉一直试图告诉你这一点。 ;)