2013-05-29 4 views
0

Я использую @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; 
    } 
} 
+1

Можете ли вы показать код. –

+1

Вы уверены, что 'e instanceof NestedRuntimeException && ((NestedRuntimeException) e) .contains (staleConnectionException)' is 'true? Более того, я считаю, что использование ThreadLocal в вашем случае нецелесообразно, почему бы не использовать простой счетчик в вашем методе 'retryConnection'? – gma

+0

Да, это правда, потому что я вижу, что сообщение журнала в журналах «Исключено старое соединение, повторение 1 из 5». – pk2

ответ

1

Как упоминалось в комментариях, не знаете, почему вы используете поток локальный ... но учитывая, что вы есть, что может вызвать бесконечный цикл, это рекурсивное использование этого аспекта. Запустите его через отладчик или просмотрите его, чтобы увидеть, попадаете ли вы в один и тот же аспект вложенным образом.