我们注意到,当DevForce请求超时时,会自动重试。论坛here上也提到了这种行为。在该论坛帖子中,建议的解决方案是增加超时以试图完全避免该问题。对我们来说,这不是一个真正可行的解决方案。我们知道有些操作会超时,增加超时不是一个可接受的解决方案。
更糟糕的是,如果呼叫是存储过程查询或InvokeServerMethod呼叫,则呼叫很可能不是idempotent,因此再次重试是不安全的,很可能最终会做更多弊大于利。我们已经开始在我们的应用程序中遇到类似的情况,并且正在造成重大痛苦。一个简单的例子是:我们调用一个存储过程来创建一个项目的副本。如果副本花费的时间太长,它将继续重试,但这只意味着我们有3个并行的复制操作。最终结果是最终用户得到一个错误(因为第三个rety仍然超时)但是(最终)将是该项目的三个副本(存储过程最终将完成 - 重试逻辑似乎没有取消之前的请求 - 我甚至不确定这种取消是否可行。这是一个更为良性的例子 - 在其他情况下,重试的操作可能会导致更严重的问题。
我从6.1.6 release notes看到,DevForce不再为保存执行自动重试。我真的很想看到这种行为扩展到StoredProcedureQueries和InvokeServerMethods。对于正常的EntityQuery操作(甚至可能是Connect / Disconnect调用),我对rety很好。如果这不是可以在DevForce核心中更改的东西,有没有办法让它可配置或为我们提供一些自定义方式来注入控制它的代码?