From fab4b5c5e0f736381ac5c43ca1a1ec6c329cf892 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Szynkiewicz?= Date: Mon, 19 Jul 2021 13:37:45 +0200 Subject: [PATCH] gRPC request context: activate before all the interceptors are invoked --- .../quarkus/grpc/deployment/GrpcServerProcessor.java | 7 ++++++- .../java/io/quarkus/grpc/runtime/GrpcContainer.java | 2 +- .../io/quarkus/grpc/runtime/GrpcServerRecorder.java | 3 --- .../context/GrpcRequestContextGrpcInterceptor.java | 11 ++++++++++- 4 files changed, 17 insertions(+), 6 deletions(-) diff --git a/extensions/grpc/deployment/src/main/java/io/quarkus/grpc/deployment/GrpcServerProcessor.java b/extensions/grpc/deployment/src/main/java/io/quarkus/grpc/deployment/GrpcServerProcessor.java index 0b9ed47add0fc..a87294e34fabb 100644 --- a/extensions/grpc/deployment/src/main/java/io/quarkus/grpc/deployment/GrpcServerProcessor.java +++ b/extensions/grpc/deployment/src/main/java/io/quarkus/grpc/deployment/GrpcServerProcessor.java @@ -59,6 +59,7 @@ import io.quarkus.grpc.runtime.config.GrpcServerBuildTimeConfig; import io.quarkus.grpc.runtime.health.GrpcHealthEndpoint; import io.quarkus.grpc.runtime.health.GrpcHealthStorage; +import io.quarkus.grpc.runtime.supports.context.GrpcRequestContextGrpcInterceptor; import io.quarkus.kubernetes.spi.KubernetesPortBuildItem; import io.quarkus.netty.deployment.MinNettyAllocatorMaxOrderBuildItem; import io.quarkus.runtime.LaunchMode; @@ -253,7 +254,7 @@ void validateBindableServices(ValidationPhaseBuildItem validationPhase, Type mutinyBeanType = Type.create(GrpcDotNames.MUTINY_BEAN, org.jboss.jandex.Type.Kind.CLASS); Type mutinyServiceType = Type.create(GrpcDotNames.MUTINY_SERVICE, org.jboss.jandex.Type.Kind.CLASS); Type bindableServiceType = Type.create(GrpcDotNames.BINDABLE_SERVICE, org.jboss.jandex.Type.Kind.CLASS); - Predicate> predicate = new Predicate>() { + Predicate> predicate = new Predicate<>() { @Override public boolean test(Set types) { return types.contains(bindableServiceType) || types.contains(mutinyServiceType); @@ -300,6 +301,10 @@ void registerBeans(BuildProducer beans, if (!bindables.isEmpty() || LaunchMode.current() == LaunchMode.DEVELOPMENT) { beans.produce(AdditionalBeanBuildItem.unremovableOf(GrpcContainer.class)); + + // this makes GrpcRequestContextGrpcInterceptor registered as a global gRPC interceptor. + // Global interceptors are invoked before any of the per-service interceptors + beans.produce(AdditionalBeanBuildItem.unremovableOf(GrpcRequestContextGrpcInterceptor.class)); features.produce(new FeatureBuildItem(GRPC_SERVER)); } else { logger.debug("Unable to find beans exposing the `BindableService` interface - not starting the gRPC server"); diff --git a/extensions/grpc/runtime/src/main/java/io/quarkus/grpc/runtime/GrpcContainer.java b/extensions/grpc/runtime/src/main/java/io/quarkus/grpc/runtime/GrpcContainer.java index 84d46904ce483..4c27c5c175599 100644 --- a/extensions/grpc/runtime/src/main/java/io/quarkus/grpc/runtime/GrpcContainer.java +++ b/extensions/grpc/runtime/src/main/java/io/quarkus/grpc/runtime/GrpcContainer.java @@ -31,7 +31,7 @@ List getSortedInterceptors() { return Collections.emptyList(); } - return interceptors.stream().sorted(new Comparator() { // NOSONAR + return interceptors.stream().sorted(new Comparator<>() { // NOSONAR @Override public int compare(ServerInterceptor si1, ServerInterceptor si2) { int p1 = 0; diff --git a/extensions/grpc/runtime/src/main/java/io/quarkus/grpc/runtime/GrpcServerRecorder.java b/extensions/grpc/runtime/src/main/java/io/quarkus/grpc/runtime/GrpcServerRecorder.java index d7ed2c0dd396f..6d9579b9867ab 100644 --- a/extensions/grpc/runtime/src/main/java/io/quarkus/grpc/runtime/GrpcServerRecorder.java +++ b/extensions/grpc/runtime/src/main/java/io/quarkus/grpc/runtime/GrpcServerRecorder.java @@ -43,7 +43,6 @@ import io.quarkus.grpc.runtime.reflection.ReflectionService; import io.quarkus.grpc.runtime.supports.CompressionInterceptor; import io.quarkus.grpc.runtime.supports.blocking.BlockingServerInterceptor; -import io.quarkus.grpc.runtime.supports.context.GrpcRequestContextGrpcInterceptor; import io.quarkus.runtime.LaunchMode; import io.quarkus.runtime.RuntimeValue; import io.quarkus.runtime.ShutdownContext; @@ -427,8 +426,6 @@ private ServerServiceDefinition serviceWithInterceptors(Vertx vertx, Compression interceptors.add(new BlockingServerInterceptor(vertx, list, devMode)); } } - // Order matters! Request scope must be called first (on the event loop) and so should be last in the list... - interceptors.add(new GrpcRequestContextGrpcInterceptor()); return ServerInterceptors.intercept(service.definition, interceptors); } diff --git a/extensions/grpc/runtime/src/main/java/io/quarkus/grpc/runtime/supports/context/GrpcRequestContextGrpcInterceptor.java b/extensions/grpc/runtime/src/main/java/io/quarkus/grpc/runtime/supports/context/GrpcRequestContextGrpcInterceptor.java index 7841ae58a2899..bfa7ff4bc250d 100644 --- a/extensions/grpc/runtime/src/main/java/io/quarkus/grpc/runtime/supports/context/GrpcRequestContextGrpcInterceptor.java +++ b/extensions/grpc/runtime/src/main/java/io/quarkus/grpc/runtime/supports/context/GrpcRequestContextGrpcInterceptor.java @@ -1,5 +1,8 @@ package io.quarkus.grpc.runtime.supports.context; +import javax.enterprise.context.ApplicationScoped; +import javax.enterprise.inject.spi.Prioritized; + import org.jboss.logging.Logger; import io.grpc.ForwardingServerCallListener; @@ -13,7 +16,8 @@ import io.vertx.core.Context; import io.vertx.core.Vertx; -public class GrpcRequestContextGrpcInterceptor implements ServerInterceptor { +@ApplicationScoped +public class GrpcRequestContextGrpcInterceptor implements ServerInterceptor, Prioritized { private static final Logger log = Logger.getLogger(GrpcRequestContextGrpcInterceptor.class.getName()); private final ManagedContext reqContext; @@ -132,4 +136,9 @@ private boolean activateContext() { return next.startCall(call, headers); } } + + @Override + public int getPriority() { + return Integer.MAX_VALUE; + } }