salesforce/reactive-grpc

Reactor Core 3.4.x (Europium) compatibility

Zetten opened this issue · 2 comments

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!

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.

Released in 1.1.0