Я использую функцию аварийного переключения CXF с использованием RetryStrategy в моем приложении и заметил, что он делает одну дополнительную повторную попытку, чем настроено максимальное количество повторных попыток. Глядя на код в RetryStrategy (показанный ниже), похоже, что альтернативный адрес get выполняет alternates.get(0)
maxNumberOfRetries и alternates.remove(0)
один раз, поэтому он делает одну дополнительную повторную попытку.
protected <T> T getNextAlternate(List<T> alternates) {
return stillTheSameAddress() ? alternates.get(0) : alternates.remove(0);
}
protected boolean stillTheSameAddress() {
if (maxNumberOfRetries == 0) {
return true;
}
// let the target selector move to the next address
// and then stay on the same address for maxNumberOfRetries
if (++counter <= maxNumberOfRetries) {
return true;
}
counter = 0;
return false;
}
После того, как список альтернатив пустой, приведенный ниже код в AbstractStaticFailoverStrategy прекращает повторную попытку. Но он уже выполнил один дополнительный раз к тому времени.
Это известная ошибка в фреймворке или я что-то здесь упускаю?
public String selectAlternateAddress(List<String> alternates) {
String selected = null;
if (alternates != null && !alternates.isEmpty()) {
selected = getNextAlternate(alternates);
Level level = getLogLevel();
if (LOG.isLoggable(level)) {
LOG.log(level,
"FAILING_OVER_TO_ADDRESS_OVERRIDE",
selected);
}
} else {
LOG.warning("NO_ALTERNATE_TARGETS_REMAIN");
}
return selected;
}