2014-10-10 105 views
0

假设我的拓扑结构是这样简单:如何故意抛出RuntimeException?

Spout --> Bolt A --> Bolt B --> Bolt C 

和螺栓C存储在数据存储中的数据。

无论何时在存储数据时有一些异常,现在建议抛出一个RuntimeException? 喜欢的东西:

try { 
    datastoreManager.insert(myData); 
} catch (Exception e) { 
    throw new RuntimeException(e); 
} 

或者我应该只是抛出一个FailedException,让拓扑重试元组?

什么应该是一个好的做法?

我在这里故意抛出一个RuntimeException没有看到任何伤害,因为当发生这种情况时,当前工作线程死亡,并且由于拓扑没有收到ACK,这个元组将在其他一些worker上重新尝试,与通过抛出FailedException 除了拓扑上的某些增强负载)相同的总输出。

回答

0

考虑的RuntimeException

public DataException extends RuntimeException { 
} 

try { 
    datastoreManager.insert(myData); 
} catch (Exception e) { 
    throw new DataException(e); 
} 

现在的类延伸高于在调用层次可以捕获这个特定的异常或让它传播起来。

因为这没有被选中,你可能想在Java文档添加足够的文件,让呼叫者期待一个RuntimeException

0

你想在正被抛出的异常的类型,再深入一点。如果它是暂时的,就像连接错误一样,您可以抛出一个FailedException并让拓扑重播它。但是,您不希望这样做会出现需要注意修复的错误。在这种情况下,您想抛出一个自定义错误,提供足够的信息来解决问题 - http://bugroll.com/how-to-write-good-error-messages.html

0

我不知道您的系统的要求以及什么是正确的语义。但我是你,我不会抛出异常。我会做的是:如果抛出异常,我会抓住它并将myData状态的身份保存到持久存储区(例如Apache kafka或JBoss HornetQ)中,并将身份保存到持久存储区。

在您分析出错后,您可以回复您的活动。

同样,如果您的系统需要更严格的语义,这可能不被接受。

相关问题