diff --git a/platform-grpc-service-framework/src/main/java/org/hypertrace/core/serviceframework/grpc/GrpcPlatformServerDefinition.java b/platform-grpc-service-framework/src/main/java/org/hypertrace/core/serviceframework/grpc/GrpcPlatformServerDefinition.java index 37e8946..639b045 100644 --- a/platform-grpc-service-framework/src/main/java/org/hypertrace/core/serviceframework/grpc/GrpcPlatformServerDefinition.java +++ b/platform-grpc-service-framework/src/main/java/org/hypertrace/core/serviceframework/grpc/GrpcPlatformServerDefinition.java @@ -4,6 +4,8 @@ import java.time.Duration; import java.util.Collection; import java.util.List; +import java.util.concurrent.Executor; +import javax.annotation.Nullable; import lombok.AccessLevel; import lombok.AllArgsConstructor; import lombok.Builder; @@ -22,4 +24,12 @@ public class GrpcPlatformServerDefinition { @Builder.Default Duration maxConnectionAgeGrace = Duration.ZERO; @Singular Collection serviceFactories; @Singular List serverInterceptors; + + /** + * Optional executor used by the gRPC server to run RPC handler callbacks. When {@code null} (the + * default), gRPC uses its built-in shared executor (an unbounded cached thread pool). Services + * that block inside their handlers can supply a bounded or virtual-thread executor here to + * control how handler work is dispatched. + */ + @Nullable Executor executor; } diff --git a/platform-grpc-service-framework/src/main/java/org/hypertrace/core/serviceframework/grpc/GrpcPlatformServiceContainer.java b/platform-grpc-service-framework/src/main/java/org/hypertrace/core/serviceframework/grpc/GrpcPlatformServiceContainer.java index 435ea0f..ea18d53 100644 --- a/platform-grpc-service-framework/src/main/java/org/hypertrace/core/serviceframework/grpc/GrpcPlatformServiceContainer.java +++ b/platform-grpc-service-framework/src/main/java/org/hypertrace/core/serviceframework/grpc/GrpcPlatformServiceContainer.java @@ -280,6 +280,9 @@ protected abstract GrpcServiceContainerEnvironment buildContainerEnvironment( private ServerBuilder initializeBuilder(GrpcPlatformServerDefinition serverDefinition) { NettyServerBuilder builder = NettyServerBuilder.forPort(serverDefinition.getPort()); + if (serverDefinition.getExecutor() != null) { + builder.executor(serverDefinition.getExecutor()); + } if (serverDefinition.getMaxInboundMessageSize() > 0) { builder.maxInboundMessageSize(serverDefinition.getMaxInboundMessageSize()); }