处理连接错误的最佳实践

时间:2010-08-25 08:54:41

标签: java .net wcf ejb

发生连接错误时采取的最佳工作流程是什么。 假设我们有一个连接到中间层的客户端。

class MyClient{   
...   
  void   callServer(){  
    try{  
      middletier.saveRecord(123);  
    }catch(...){  
      // log the error  
      // what to do next (notify the user, take the same step again)?  
      // reinitialize connection ?  
    }  
  }  
}

如果发生连接错误怎么办(超时,断开连接......)

我应该通知用户连接有问题并再试一次吗? 某些事情可以自动完成,对用户是否透明?

我喜欢的是,不要打扰用户有错误,然后告诉用户下一步该做什么 那么处理此类错误的最佳工作流程是什么?

4 个答案:

答案 0 :(得分:3)

我强烈推荐Michael Nygards“发布它!”花了很多时间解释如何使您的软件更健壮。

http://www.pragprog.com/titles/mnee/release-it

答案 1 :(得分:2)

这绝对取决于应用要求。有时最好立即通知用户,有时最好在通知用户之前多次重试请求。您必须与您的客户/分析师协商。

答案 2 :(得分:2)

取决于......如果操作是由用户交互引起的,则告知用户。用户可以决定他想要重试的频率。代码可能会自行重试,但如果超时,则用户可能会等待几分钟(或中止操作未获得任何反馈)。

如果是后台任务,请在延迟一段时间后重试(但不能无限制 - 最终中止操作)。您可以重新初始化连接,这取决于所使用的技术以及是否使用连接池。

当然,如果您想投入更多时间,可以采用不同的方式处理不同的错误。首先,区分永久性错误(几分钟内重试无效)和间歇性错误(下次可能没问题)。例如,如果连接断开,您可以使用新连接重试(可能防火墙由于不活动而丢弃了打开的连接)。但是你可能无法对超时(可能是网络配置问题)或“找不到HTTP 404”做任何事情(假设您无法更改用于HTTP呼叫的URL)。

您可以在“诊断和修复”组件中收集所有这些知识。

我还建议阅读“发布它!”。

答案 3 :(得分:0)

从调用者MyClient的角度来看:一般来说,失败的方法调用应该使MyClient处于调用之前的状态。这意味着您应该注意如何恢复前middletier.saveRecord(123);

的状态