所以我有一个生成的类 ( PartnerConnection
),它为 SalesForce 云平台提供 DML 操作。由于 SalesForce 或运行代码的系统的连接问题,我们遇到了长期运行的集成过程失败的问题。
为了解决这个问题,我PartnerConnection
用我命名的类扩展了一个AdvancedPartnerConnection
. AdvancedPartnerConnection
只是覆盖了的方法并用try/catch/retry逻辑PartnerConnection
包装它们。
@Override
public QueryResult query(String queryString) throws ConnectionException{
int attempt = 0;
ConnectionException lastException = null;
while(true){
if(attempt < maxAttempts){ //maxAttempts constant
if(lastException != null){
try {
//exponentially increase wait times
Long sleepTime =(long) Math.pow(sleepBase, attempt) * 300;
Thread.sleep(sleepTime);
} catch (InterruptedException e1) {
// something bad has happen, throw the connection exception
throw lastException;
}
}
attempt ++;
try{
//call super class method
return super.query(queryString);
}catch(ConnectionException e){
lastException = e;
}
}else{
throw lastException;
}
}
}
我已经为一些超类方法实现了这个,唯一的区别是被调用的方法和它的参数。如果我决定更改任何重试逻辑,因为我希望它在所有方法中保持一致,那将变得非常痛苦。
有没有人可以将重试逻辑提取到单独的类或方法中,并可能传入函数调用?我在 .NET 中做过类似的事情,但我不确定如何在 java 中做到这一点。