This is an automated email from the ASF dual-hosted git repository. kwin pushed a commit to branch bugfix/log-retries in repository https://gitbox.apache.org/repos/asf/maven-resolver.git
commit a6935d071d5e4d9dfe279facab09449fd292dc14 Author: Konrad Windszus <[email protected]> AuthorDate: Fri Jan 30 09:46:37 2026 +0100 Log retries in JDK HTTP Client --- .../aether/transport/jdk/JdkTransporter.java | 33 ++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporter.java b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporter.java index 043ced255..b3239d2ff 100644 --- a/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporter.java +++ b/maven-resolver-transport-jdk-parent/maven-resolver-transport-jdk11/src/main/java/org/eclipse/aether/transport/jdk/JdkTransporter.java @@ -69,6 +69,7 @@ import java.util.regex.Matcher; import com.github.mizosoft.methanol.Methanol; import com.github.mizosoft.methanol.RetryInterceptor; +import com.github.mizosoft.methanol.RetryInterceptor.Context; import org.eclipse.aether.ConfigurationProperties; import org.eclipse.aether.RepositorySystemSession; import org.eclipse.aether.repository.AuthenticationContext; @@ -593,6 +594,36 @@ final class JdkTransporter extends AbstractTransporter implements HttpTransporte return builder.build(); } + public class RetryLoggingListener implements RetryInterceptor.Listener { + private final int maxNumRetries; + + RetryLoggingListener(int maxNumRetries) { + this.maxNumRetries = maxNumRetries; + } + + @Override + public void onRetry(Context<?> context, HttpRequest nextRequest, Duration delay) { + LOGGER.warn( + "{} request to {} failed (attempt {} of {}) due to {}. Retrying in {} ms.", + context.request().method(), + context.request().uri(), + context.retryCount() + 1, + maxNumRetries + 1, + getReason(context), + delay.toMillis()); + } + + String getReason(Context<?> context) { + if (context.exception().isPresent()) { + return context.exception().get().getMessage(); + } else if (context.response().isPresent()) { + return "status " + context.response().get().statusCode(); + } + // should not happen + throw new IllegalStateException("No exception or response present in retry context"); + } + } + protected void configureRetryHandler( RepositorySystemSession session, RemoteRepository repository, Methanol.Builder builder) { int retryCount = ConfigUtils.getInteger( @@ -638,6 +669,7 @@ final class JdkTransporter extends AbstractTransporter implements HttpTransporte Methanol.Interceptor rateLimitingRetryInterceptor = RetryInterceptor.newBuilder() .maxRetries(retryCount) .onStatus(serviceUnavailableCodes::contains) + .listener(new RetryLoggingListener(retryCount)) .backoff(RetryInterceptor.BackoffStrategy.linear( Duration.ofMillis(retryInterval), Duration.ofMillis(retryIntervalMax))) .build(); @@ -648,6 +680,7 @@ final class JdkTransporter extends AbstractTransporter implements HttpTransporte // https://github.com/openjdk/jdk/blob/640343f7d94894b0378ea5b1768eeac203a9aaf8/src/java.net.http/share/classes/jdk/internal/net/http/MultiExchange.java#L665 .maxRetries(retryCount) .onException(t -> t instanceof IOException && !NON_RETRIABLE_IO_EXCEPTIONS.contains(t.getClass())) + .listener(new RetryLoggingListener(retryCount)) .build(); builder.interceptor(retryIoExceptionsInterceptor); }
