MethodInterceptor, чтобы повторить вызов HttpInvoker
Я использую Spring Framework HttpInvoker
на богатый клиентский интерфейс. Иногда у людей возникают всплески в их интернет-соединении, и сбой интернет-соединения вызывает сбой приложения. Я хотел бы повторить неудачный метод пару раз, прежде чем сдаться.
Я попытался написать перехватчик метода, чтобы выполнить это, но второй вызов:
Object result = methodInvocation.proceed();
всегда бомбит с RuntimeException
обертывание NullPointerException
,
Вы не можете назвать этот метод methodInvocation.proceed()
несколько раз или есть какая-то хитрость к этому?
public class RetryConnectionTool implements MethodInterceptor
{
private static int FailureCount = 0;
static Logger logger = Logger.getLogger(RetryConnectionTool.class);
/**
* 4 seconds of sleep
*/
private int SleepTime = 4000;
public RetryConnectionTool()
{
}
public Object invoke(MethodInvocation methodInvocation) throws Throwable
{
return tryInvoke(methodInvocation, new Integer(0));
}
private Object tryInvoke(MethodInvocation methodInvocation, Integer tryCount) throws Throwable
{
try
{
//if we have failed 10 times in the past or retried 3 times to no success shut it down
if (FailureCount >= 10 || (tryCount != null && tryCount >= 3))
{
logger.error("internet issue failure " + methodInvocation.getMethod().toGenericString());
System.exit(-1);
return null;
}
if (tryCount != null && tryCount >= 1)
{
if (tryCount == 0) //increment the failure count on every first retry
FailureCount++;
tryCount++;
Thread.sleep(SleepTime);
}
Object result = methodInvocation.proceed();
//if we have tried more than once and there is already a record of a failure we try again
if (tryCount != null && tryCount > 1 && FailureCount > 1)
{
String messagePassed = "There seems to be a problem with your internet connection. It the problem persists Iridium Suite will be forced to close.\n" +
"Please evaluate your internet connectivity.";
JOptionPane.showMessageDialog(null, messagePassed, "WARNING", JOptionPane.WARNING_MESSAGE);
}
return result;
}
catch (org.springframework.remoting.RemoteConnectFailureException x)
{
logger.error("internet issue " + methodInvocation.getMethod().toGenericString(), x);
//retry on failure
return tryInvoke(methodInvocation, tryCount);
}
catch (RemoteLookupFailureException x)
{
logger.error("internet issue " + methodInvocation.getMethod().toGenericString(), x);
//retry on failure
return tryInvoke(methodInvocation, tryCount);
}
catch (java.net.ConnectException x)
{
logger.error("internet issue " + methodInvocation.getMethod().toGenericString(), x);
//retry on failure
return tryInvoke(methodInvocation, tryCount);
}
catch (RuntimeException x)
{
throw x;
}
catch (Exception x)
{
throw x;
}
catch (Throwable x)
{
throw x;
}
}
}
1 ответ
Использование: ((ProxyMethodInvocation) invocation).invocableClone().proceed();
продолжить можно вызвать только один раз для метода MethodInvocation. См. Раздел "Вызов продолжения () более одного раза" книги "Профессиональная разработка Java с помощью Spring Framework".