Reactor Core 3.4.x (Europium) compatibility
Zetten opened this issue · 2 comments
Zetten commented
My Bazel-built project has just updated to io.projectreactor:reactor-core:3.4.1, and can no longer build the reactor-grpc-stub library due to an API change affecting the retryWhen
method:
external/com_salesforce_servicelibs_reactive_grpc/reactor/reactor-grpc-stub/src/main/java/com/salesforce/reactorgrpc/GrpcRetry.java:47: error: incompatible types: Function<Flux<Throwable>,CAP#1> cannot be converted to Function<Flux<RetrySignal>,? extends Publisher<?>>
return request -> Flux.defer(() -> operation.apply(request)).retryWhen(reactor.util.retry.Retry.from(whenFactory));
^
where CAP#1 is a fresh type-variable:
CAP#1 extends Publisher<?> from capture of ? extends Publisher<?>
external/com_salesforce_servicelibs_reactive_grpc/reactor/reactor-grpc-stub/src/main/java/com/salesforce/reactorgrpc/GrpcRetry.java:95: error: incompatible types: Function<Flux<Throwable>,CAP#1> cannot be converted to Retry
return request -> Flux.defer(() -> operation.apply(request)).retryWhen(whenFactory);
^
where CAP#1 is a fresh type-variable:
CAP#1 extends Publisher<?> from capture of ? extends Publisher<?>
external/com_salesforce_servicelibs_reactive_grpc/reactor/reactor-grpc-stub/src/main/java/com/salesforce/reactorgrpc/GrpcRetry.java:143: error: incompatible types: Function<Flux<Throwable>,CAP#1> cannot be converted to Retry
return request -> Mono.defer(() -> operation.apply(request)).retryWhen(whenFactory);
^
where CAP#1 is a fresh type-variable:
CAP#1 extends Publisher<?> from capture of ? extends Publisher<?>
As a simple workaround I'm patching with:
diff --git a/reactor/reactor-grpc-stub/src/main/java/com/salesforce/reactorgrpc/GrpcRetry.java b/reactor/reactor-grpc-stub/src/main/java/com/salesforce/reactorgrpc/GrpcRetry.java
index 249fb0f..479f585 100644
--- a/reactor/reactor-grpc-stub/src/main/java/com/salesforce/reactorgrpc/GrpcRetry.java
+++ b/reactor/reactor-grpc-stub/src/main/java/com/salesforce/reactorgrpc/GrpcRetry.java
@@ -44,7 +44,7 @@ public final class GrpcRetry {
* @see Flux#retryWhen(Function)
*/
public static <I, O> Function<? super Mono<I>, Flux<O>> retryWhen(final Function<Mono<I>, Flux<O>> operation, final Function<Flux<Throwable>, ? extends Publisher<?>> whenFactory) {
- return request -> Flux.defer(() -> operation.apply(request)).retryWhen(whenFactory);
+ return request -> Flux.defer(() -> operation.apply(request)).retryWhen(reactor.util.retry.Retry.withThrowable(whenFactory));
}
/**
@@ -92,7 +92,7 @@ public final class GrpcRetry {
* @see Flux#retryWhen(Function)
*/
public static <I, O> Function<? super Flux<I>, ? extends Publisher<O>> retryWhen(final Function<Flux<I>, Flux<O>> operation, final Function<Flux<Throwable>, ? extends Publisher<?>> whenFactory) {
- return request -> Flux.defer(() -> operation.apply(request)).retryWhen(whenFactory);
+ return request -> Flux.defer(() -> operation.apply(request)).retryWhen(reactor.util.retry.Retry.withThrowable(whenFactory));
}
/**
@@ -140,7 +140,7 @@ public final class GrpcRetry {
* @see Flux#retryWhen(Function)
*/
public static <I, O> Function<? super Flux<I>, Mono<O>> retryWhen(final Function<Flux<I>, Mono<O>> operation, final Function<Flux<Throwable>, ? extends Publisher<?>> whenFactory) {
- return request -> Mono.defer(() -> operation.apply(request)).retryWhen(whenFactory);
+ return request -> Mono.defer(() -> operation.apply(request)).retryWhen(reactor.util.retry.Retry.withThrowable(whenFactory));
}
/**
I would submit a PR, but I'm not sure whether there are more changes which might affect other use cases!
rmichela commented
Digging into this issue now. Reactor made breaking API changes in a Minor release. That sucks. I'm thinking about ways to maintain support for different releases of Reactor side by side.
rmichela commented
Released in 1.1.0