Я использую @Aspect для реализации логики повторения (max_retries = 5) для проблем с устаревшим соединением базы данных. В этой Рекомендации у меня есть объект ThreadLocal, который отслеживает, сколько раз логика повторила попытку получить соединение и он получает прирост, когда он не может получить соединение, поэтому, чтобы избежать неограниченных повторений для проблемы с устаревшим подключением, максимальное количество попыток равно 5 (постоянное).ThreadLocal и @Aspect аннотация
Но проблема в том, что в этом классе @Aspect java ThreadLocal никогда не увеличивается, и это вызывает цикл endlees в коде, который, конечно же, не должен повторять после максимального количества попыток, но никогда не достигает этого счета и делает не вырваться из цикла while.
Пожалуйста, дайте мне знать, если у кого-то была эта проблема с объектами @Aspect и ThreadLcal.
Буду рад поделиться кодом.
private static ThreadLocal<Integer> retryCounter= new ThreadLocal<Integer>() {};
private static final String STALE_CONNECTION_EXCEPTION = "com.ibm.websphere.ce.cm.StaleConnectionException";
@Around("service")
public Object retryConnection(ProceedingJoinPoint pjp) throws Throwable {
if (staleConnectionException == null) {
return pjp.proceed();
}
Throwable exception = null;
retryCounter.set(new Integer(0));
while (retryCounter.get() < MAX_TRIES) {
try {
return pjp.proceed();
}
catch (AppDataException he) {
exception = retry(he.getCause());
}
catch (NestedRuntimeException e) {
exception = retry(e);
}
}
if (exception != null) {
Logs.error("Stale connection exception occurred, no more retries left", this.getClass(), null);
logException(pjp, exception);
throw new AppDataException(exception);
}
return null;
}
private Throwable retry(Throwable e) throws Throwable {
if (e instanceof NestedRuntimeException && ((NestedRuntimeException)e).contains(staleConnectionException)) {
retryCounter.set(retryCounter.get()+1);
LogUtils.log("Stale connection exception occurred, retrying " + retryCounter.get() + " of " + MAX_TRIES, this.getClass());
return e;
}
else {
throw e;
}
}
Можете ли вы показать код. –
Вы уверены, что 'e instanceof NestedRuntimeException && ((NestedRuntimeException) e) .contains (staleConnectionException)' is 'true? Более того, я считаю, что использование ThreadLocal в вашем случае нецелесообразно, почему бы не использовать простой счетчик в вашем методе 'retryConnection'? – gma
Да, это правда, потому что я вижу, что сообщение журнала в журналах «Исключено старое соединение, повторение 1 из 5». – pk2