Skip to content

Commit 30f2f55

Browse files
authored
Merge pull request #47175 from geoand/#47062-more
Slightly improve the way Arc is used in gRPC
2 parents 5f59b85 + 71a8d6d commit 30f2f55

File tree

2 files changed

+24
-13
lines changed

2 files changed

+24
-13
lines changed

extensions/grpc/deployment/src/main/java/io/quarkus/grpc/deployment/GrpcServerProcessor.java

+13-3
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@
5252
import io.quarkus.arc.deployment.ValidationPhaseBuildItem;
5353
import io.quarkus.arc.processor.AnnotationsTransformer;
5454
import io.quarkus.arc.processor.BeanInfo;
55+
import io.quarkus.arc.processor.BeanStream;
5556
import io.quarkus.arc.processor.BuiltinScope;
5657
import io.quarkus.deployment.ApplicationArchive;
5758
import io.quarkus.deployment.Capabilities;
@@ -696,8 +697,8 @@ ServiceStartBuildItem initializeServer(GrpcServerRecorder recorder,
696697
VertxWebRouterBuildItem routerBuildItem,
697698
VertxBuildItem vertx, Capabilities capabilities,
698699
List<FilterBuildItem> filterBuildItems,
699-
// used to ensure that gRPC server starts after OTel has been set up
700-
@SuppressWarnings("unused") BeanContainerBuildItem beanContainerBuildItem) {
700+
ValidationPhaseBuildItem validationPhase,
701+
BeanContainerBuildItem beanContainerBuildItem) {
701702

702703
// Build the list of blocking methods per service implementation
703704
Map<String, List<String>> blocking = new HashMap<>();
@@ -733,7 +734,16 @@ ServiceStartBuildItem initializeServer(GrpcServerRecorder recorder,
733734
} else {
734735
routerRuntimeValue = routerBuildItem.getHttpRouter();
735736
}
736-
recorder.initializeGrpcServer(vertx.getVertx(), routerRuntimeValue,
737+
Type bindableServiceType = Type.create(GrpcDotNames.BINDABLE_SERVICE, org.jboss.jandex.Type.Kind.CLASS);
738+
BeanStream bindableServiceBeanStream = validationPhase.getContext().beans().classBeans()
739+
.matchBeanTypes(new Predicate<>() {
740+
@Override
741+
public boolean test(Set<Type> types) {
742+
return types.contains(bindableServiceType);
743+
}
744+
});
745+
recorder.initializeGrpcServer(bindableServiceBeanStream.isEmpty(), beanContainerBuildItem.getValue(),
746+
vertx.getVertx(), routerRuntimeValue,
737747
config, shutdown, blocking, virtuals, launchModeBuildItem.getLaunchMode(),
738748
capabilities.isPresent(Capability.SECURITY), securityHandlers);
739749
return new ServiceStartBuildItem(GRPC_SERVER);

extensions/grpc/runtime/src/main/java/io/quarkus/grpc/runtime/GrpcServerRecorder.java

+11-10
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import io.quarkus.arc.Arc;
4545
import io.quarkus.arc.InstanceHandle;
4646
import io.quarkus.arc.Subclass;
47+
import io.quarkus.arc.runtime.BeanContainer;
4748
import io.quarkus.grpc.api.ServerBuilderCustomizer;
4849
import io.quarkus.grpc.auth.GrpcSecurityInterceptor;
4950
import io.quarkus.grpc.reflection.service.ReflectionServiceV1;
@@ -121,18 +122,15 @@ public void handle(RoutingContext event) {
121122
}
122123
}
123124

124-
public void initializeGrpcServer(RuntimeValue<Vertx> vertxSupplier,
125+
public void initializeGrpcServer(boolean hasNoBindableServiceBeans, BeanContainer beanContainer,
126+
RuntimeValue<Vertx> vertxSupplier,
125127
RuntimeValue<Router> routerSupplier,
126128
GrpcConfiguration cfg,
127129
ShutdownContext shutdown,
128130
Map<String, List<String>> blockingMethodsPerService,
129131
Map<String, List<String>> virtualMethodsPerService,
130132
LaunchMode launchMode, boolean securityPresent, Map<Integer, Handler<RoutingContext>> securityHandlers) {
131-
GrpcContainer grpcContainer = Arc.container().instance(GrpcContainer.class).get();
132-
if (grpcContainer == null) {
133-
throw new IllegalStateException("gRPC not initialized, GrpcContainer not found");
134-
}
135-
if (hasNoServices(grpcContainer.getServices()) && LaunchMode.current() != LaunchMode.DEVELOPMENT) {
133+
if (hasNoBindableServiceBeans && LaunchMode.current() != LaunchMode.DEVELOPMENT) {
136134
LOGGER.error("Unable to find beans exposing the `BindableService` interface - not starting the gRPC server");
137135
return; // OK?
138136
}
@@ -152,20 +150,23 @@ public void initializeGrpcServer(RuntimeValue<Vertx> vertxSupplier,
152150
// start single server, not in a verticle, regardless of the configuration.instances
153151
// for reason unknown to me, verticles occasionally get undeployed on dev mode reload
154152
if (GrpcServerReloader.getServer() != null || (provider != null && provider.serverAlreadyExists())) {
155-
devModeReload(grpcContainer, vertx, configuration, provider, blockingMethodsPerService,
153+
devModeReload(beanContainer.beanInstance(GrpcContainer.class), vertx, configuration, provider,
154+
blockingMethodsPerService,
156155
virtualMethodsPerService, shutdown);
157156
} else {
158-
devModeStart(grpcContainer, vertx, configuration, provider, blockingMethodsPerService,
157+
devModeStart(beanContainer.beanInstance(GrpcContainer.class), vertx, configuration, provider,
158+
blockingMethodsPerService,
159159
virtualMethodsPerService, shutdown,
160160
launchMode);
161161
}
162162
} else {
163-
prodStart(grpcContainer, vertx, configuration, provider, blockingMethodsPerService, virtualMethodsPerService,
163+
prodStart(beanContainer.beanInstance(GrpcContainer.class), vertx, configuration, provider,
164+
blockingMethodsPerService, virtualMethodsPerService,
164165
launchMode);
165166
}
166167
} else {
167168
buildGrpcServer(vertx, configuration, routerSupplier, shutdown, blockingMethodsPerService, virtualMethodsPerService,
168-
grpcContainer, launchMode, securityPresent, securityHandlers);
169+
beanContainer.beanInstance(GrpcContainer.class), launchMode, securityPresent, securityHandlers);
169170
}
170171
}
171172

0 commit comments

Comments
 (0)