假设我的拓扑结构很简单:
Spout --> Bolt A --> Bolt B --> Bolt C
Bolt C将数据存储在数据存储区中。
现在建议在存储数据时出现异常时抛出RuntimeException? 类似的东西:
try {
datastoreManager.insert(myData);
} catch (Exception e) {
throw new RuntimeException(e);
}
或者我应该抛出一个FailedException并让拓扑重试那个元组吗?
什么是好的做法?
我没有看到故意在这里抛出RuntimeException有什么害处,因为当发生这种情况时,当前工作线程死亡,并且由于拓扑没有收到ACK,元组将在其他一些工作者上重新尝试,通过抛出FailedException 除了以获得拓扑上的某些增强负载,产生相同的总输出。
答案 0 :(得分:0)
考虑从RuntimeException扩展
public DataException extends RuntimeException {
}
try {
datastoreManager.insert(myData);
} catch (Exception e) {
throw new DataException(e);
}
现在,调用层次结构中的上述类可以选择捕获此特定异常或让它传播。
由于未经检查,您可能希望在java doc中添加足够的文档,以便让调用者期望RuntimeException
答案 1 :(得分:0)
您希望更深入地了解抛出的异常类型。如果它是瞬态的,就像连接错误一样,您可以抛出FailedException并让拓扑重放它。但是,您不希望这样做会出现需要别人注意修复的错误。在这种情况下,您希望抛出自定义错误,提供足够的信息来解决问题 - http://bugroll.com/how-to-write-good-error-messages.html
答案 2 :(得分:0)
我不了解您系统的要求以及正确的语义。但我是你,我不会抛出异常。我要做的是:如果抛出异常,我会抓住并将{strong> 和 的身份myData
保存到持久性存储中(例如Apache kafka或JBoss HornetQ)。
在分析出现问题后,您可以回复您的活动。
同样,如果您的系统需要更严格的语义,则可能无法接受。