Search in sources :

Example 1 with GrpcServiceContext

use of io.servicetalk.grpc.api.GrpcServiceContext in project servicetalk by apple.

the class InMemoryServerTransport method getServiceContext.

private static GrpcServiceContext getServiceContext(Channel channel, BufferAllocator allocator) {
    // GrpcServiceContext is 1:1 with the Channel for the request. Closing it also closes the connection.
    Attribute<GrpcServiceContext> attr = channel.attr(GRPC_SERVICE_CONTEXT_KEY);
    GrpcServiceContext serviceContext = attr.get();
    if (serviceContext != null) {
        return serviceContext;
    }
    // GrpcExecutionContext exposes IoExecutor which is 1:1 with EventLoop. You could also use a
    // FastThreadLocal to store this info as well.
    GrpcExecutionContext executionContext = EVENT_LOOP_GRPC_EXECUTION_CONTEXT_MAP.computeIfAbsent(channel.eventLoop(), el -> new UtilGrpcExecutionContext(allocator, NettyIoExecutors.fromNettyEventLoop(el), GlobalExecutionContext.globalExecutionContext().executor()));
    serviceContext = new ChannelGrpcServiceContext(channel, executionContext);
    attr.set(serviceContext);
    return serviceContext;
}
Also used : ChannelGrpcServiceContext(io.servicetalk.grpc.customtransport.Utils.ChannelGrpcServiceContext) ChannelGrpcServiceContext(io.servicetalk.grpc.customtransport.Utils.ChannelGrpcServiceContext) GrpcServiceContext(io.servicetalk.grpc.api.GrpcServiceContext) UtilGrpcExecutionContext(io.servicetalk.grpc.customtransport.Utils.UtilGrpcExecutionContext) UtilGrpcExecutionContext(io.servicetalk.grpc.customtransport.Utils.UtilGrpcExecutionContext) GrpcExecutionContext(io.servicetalk.grpc.api.GrpcExecutionContext)

Example 2 with GrpcServiceContext

use of io.servicetalk.grpc.api.GrpcServiceContext in project servicetalk by apple.

the class ProtocolCompatibilityTest method serviceTalkServer.

private static TestServerContext serviceTalkServer(final ErrorMode errorMode, final boolean ssl, final GrpcExecutionStrategy strategy, @Nullable final String compression, @Nullable final Duration timeout, Queue<Throwable> reqStreamError) throws Exception {
    final Compat.CompatService compatService = new Compat.CompatService() {

        @Override
        public Publisher<CompatResponse> bidirectionalStreamingCall(final GrpcServiceContext ctx, final Publisher<CompatRequest> pub) {
            reqStreamError.add(SERVER_PROCESSED_TOKEN);
            maybeThrowFromRpc(errorMode);
            return pub.map(req -> response(req.getId())).beforeFinally(errorConsumer());
        }

        @Override
        public Single<CompatResponse> clientStreamingCall(final GrpcServiceContext ctx, final Publisher<CompatRequest> pub) {
            reqStreamError.add(SERVER_PROCESSED_TOKEN);
            maybeThrowFromRpc(errorMode);
            return pub.collect(() -> 0, (sum, req) -> sum + req.getId()).map(this::response).beforeFinally(errorConsumer());
        }

        @Override
        public Single<CompatResponse> scalarCall(final GrpcServiceContext ctx, final CompatRequest req) {
            maybeThrowFromRpc(errorMode);
            return succeeded(response(req.getId()));
        }

        @Override
        public Publisher<CompatResponse> serverStreamingCall(final GrpcServiceContext ctx, final CompatRequest req) {
            maybeThrowFromRpc(errorMode);
            return Publisher.fromIterable(() -> IntStream.range(0, req.getId()).iterator()).map(this::response);
        }

        private CompatResponse response(final int value) {
            if (errorMode == ErrorMode.SIMPLE_IN_RESPONSE) {
                throwGrpcStatusException();
            } else if (errorMode == ErrorMode.STATUS_IN_RESPONSE) {
                throwGrpcStatusExceptionWithStatus();
            }
            return computeResponse(value);
        }

        private TerminalSignalConsumer errorConsumer() {
            return new TerminalSignalConsumer() {

                @Override
                public void onComplete() {
                }

                @Override
                public void onError(final Throwable throwable) {
                    reqStreamError.add(throwable);
                }

                @Override
                public void cancel() {
                    reqStreamError.add(new IOException("cancelled"));
                }
            };
        }
    };
    final ServiceFactory serviceFactory = new ServiceFactory.Builder().bufferEncoders(serviceTalkCompressions(compression)).bufferDecoderGroup(serviceTalkDecompression(compression)).bidirectionalStreamingCall(strategy, compatService).clientStreamingCall(strategy, compatService).scalarCall(strategy, compatService).serverStreamingCall(strategy, compatService).build();
    final ServerContext serverContext = serviceTalkServerBuilder(errorMode, ssl, timeout, b -> b.executionStrategy(strategy)).listenAndAwait(serviceFactory);
    return TestServerContext.fromServiceTalkServerContext(serverContext);
}
Also used : Arrays(java.util.Arrays) CompatResponse(io.servicetalk.grpc.netty.CompatProto.ResponseContainer.CompatResponse) EmptyBufferDecoderGroup(io.servicetalk.encoding.api.EmptyBufferDecoderGroup) ServerSslConfigBuilder(io.servicetalk.transport.api.ServerSslConfigBuilder) GrpcClientMetadata(io.servicetalk.grpc.api.GrpcClientMetadata) TerminalSignalConsumer(io.servicetalk.concurrent.api.TerminalSignalConsumer) NettyServerBuilder(io.grpc.netty.NettyServerBuilder) SourceAdapters.fromSource(io.servicetalk.concurrent.api.SourceAdapters.fromSource) BidirectionalStreamingCallMetadata(io.servicetalk.grpc.netty.CompatProto.Compat.BidirectionalStreamingCallMetadata) Future(java.util.concurrent.Future) StatusProto(io.grpc.protobuf.StatusProto) Arrays.asList(java.util.Arrays.asList) Duration(java.time.Duration) DefaultTestCerts(io.servicetalk.test.resources.DefaultTestCerts) Status(io.grpc.Status) InvalidProtocolBufferException(com.google.protobuf.InvalidProtocolBufferException) HttpProtocolConfigs.h2(io.servicetalk.http.netty.HttpProtocolConfigs.h2) DefaultTestCerts.loadServerKey(io.servicetalk.test.resources.DefaultTestCerts.loadServerKey) GrpcStatus(io.servicetalk.grpc.api.GrpcStatus) BlockingCompatClient(io.servicetalk.grpc.netty.CompatProto.Compat.BlockingCompatClient) BlockingQueue(java.util.concurrent.BlockingQueue) Processors.newSingleProcessor(io.servicetalk.concurrent.api.Processors.newSingleProcessor) Arguments(org.junit.jupiter.params.provider.Arguments) DefaultTestCerts.serverPemHostname(io.servicetalk.test.resources.DefaultTestCerts.serverPemHostname) BlockingIterable(io.servicetalk.concurrent.BlockingIterable) Matchers.instanceOf(org.hamcrest.Matchers.instanceOf) ArrayBlockingQueue(java.util.concurrent.ArrayBlockingQueue) ClientStreamingCallMetadata(io.servicetalk.grpc.netty.CompatProto.Compat.ClientStreamingCallMetadata) GRPC_TIMEOUT_HEADER_KEY(io.servicetalk.grpc.internal.DeadlineUtils.GRPC_TIMEOUT_HEADER_KEY) Compat(io.servicetalk.grpc.netty.CompatProto.Compat) StreamingHttpService(io.servicetalk.http.api.StreamingHttpService) Any(com.google.protobuf.Any) Matchers.is(org.hamcrest.Matchers.is) DefaultGrpcClientMetadata(io.servicetalk.grpc.api.DefaultGrpcClientMetadata) Codec(io.grpc.Codec) GrpcClientBuilder(io.servicetalk.grpc.api.GrpcClientBuilder) Assertions.fail(org.junit.jupiter.api.Assertions.fail) Assertions.assertNotNull(org.junit.jupiter.api.Assertions.assertNotNull) Compressor(io.grpc.Compressor) BlockingCompatService(io.servicetalk.grpc.netty.CompatProto.Compat.BlockingCompatService) ArrayList(java.util.ArrayList) InsecureTrustManagerFactory(io.netty.handler.ssl.util.InsecureTrustManagerFactory) HttpServiceContext(io.servicetalk.http.api.HttpServiceContext) CANCELLED(io.servicetalk.grpc.api.GrpcStatusCode.CANCELLED) Decompressor(io.grpc.Decompressor) Single.succeeded(io.servicetalk.concurrent.api.Single.succeeded) StreamingHttpRequest(io.servicetalk.http.api.StreamingHttpRequest) MatcherAssert.assertThat(org.hamcrest.MatcherAssert.assertThat) Assertions.assertEquals(org.junit.jupiter.api.Assertions.assertEquals) Server(io.grpc.Server) Nullable(javax.annotation.Nullable) SslContext(io.netty.handler.ssl.SslContext) Single(io.servicetalk.concurrent.api.Single) Completable(io.servicetalk.concurrent.api.Completable) IOException(java.io.IOException) StatusRuntimeException(io.grpc.StatusRuntimeException) ExecutionException(java.util.concurrent.ExecutionException) NettyBufferEncoders(io.servicetalk.encoding.netty.NettyBufferEncoders) ParameterizedTest(org.junit.jupiter.params.ParameterizedTest) GrpcExecutionStrategy(io.servicetalk.grpc.api.GrpcExecutionStrategy) DefaultTestCerts.loadServerPem(io.servicetalk.test.resources.DefaultTestCerts.loadServerPem) ArrayDeque(java.util.ArrayDeque) HttpServers(io.servicetalk.http.netty.HttpServers) GrpcSslContexts(io.grpc.netty.GrpcSslContexts) CompatRequest(io.servicetalk.grpc.netty.CompatProto.RequestContainer.CompatRequest) SocketAddress(java.net.SocketAddress) ManagedChannel(io.grpc.ManagedChannel) GrpcStatusCode(io.servicetalk.grpc.api.GrpcStatusCode) DEFAULT_TIMEOUT_SECONDS(io.servicetalk.concurrent.internal.TestTimeoutConstants.DEFAULT_TIMEOUT_SECONDS) GrpcStatusException(io.servicetalk.grpc.api.GrpcStatusException) GrpcExecutionStrategies.defaultStrategy(io.servicetalk.grpc.api.GrpcExecutionStrategies.defaultStrategy) StreamObserver(io.grpc.stub.StreamObserver) StreamingHttpClient(io.servicetalk.http.api.StreamingHttpClient) BufferDecoderGroup(io.servicetalk.encoding.api.BufferDecoderGroup) MethodSource(org.junit.jupiter.params.provider.MethodSource) ScalarCallMetadata(io.servicetalk.grpc.netty.CompatProto.Compat.ScalarCallMetadata) BufferDecoderGroupBuilder(io.servicetalk.encoding.api.BufferDecoderGroupBuilder) GrpcExecutionStrategies.offloadNever(io.servicetalk.grpc.api.GrpcExecutionStrategies.offloadNever) DEADLINE_EXCEEDED(io.servicetalk.grpc.api.GrpcStatusCode.DEADLINE_EXCEEDED) PublisherSource(io.servicetalk.concurrent.PublisherSource) Collection(java.util.Collection) GrpcPayloadWriter(io.servicetalk.grpc.api.GrpcPayloadWriter) InetSocketAddress(java.net.InetSocketAddress) GrpcServiceContext(io.servicetalk.grpc.api.GrpcServiceContext) Identity(io.servicetalk.encoding.api.Identity) CompatClient(io.servicetalk.grpc.netty.CompatProto.Compat.CompatClient) List(java.util.List) GrpcExecutionContext(io.servicetalk.grpc.api.GrpcExecutionContext) ClientSslConfigBuilder(io.servicetalk.transport.api.ClientSslConfigBuilder) CompressorRegistry(io.grpc.CompressorRegistry) Queue(java.util.Queue) Duration.ofMillis(java.time.Duration.ofMillis) IntStream(java.util.stream.IntStream) Publisher.never(io.servicetalk.concurrent.api.Publisher.never) CsvSource(org.junit.jupiter.params.provider.CsvSource) StreamingHttpResponse(io.servicetalk.http.api.StreamingHttpResponse) Publisher(io.servicetalk.concurrent.api.Publisher) NANOSECONDS(java.util.concurrent.TimeUnit.NANOSECONDS) DeliberateException(io.servicetalk.concurrent.internal.DeliberateException) Processor(io.servicetalk.concurrent.SingleSource.Processor) StreamingHttpServiceFilter(io.servicetalk.http.api.StreamingHttpServiceFilter) OPENSSL(io.servicetalk.transport.api.SslProvider.OPENSSL) DecompressorRegistry(io.grpc.DecompressorRegistry) ServerStreamingCallMetadata(io.servicetalk.grpc.netty.CompatProto.Compat.ServerStreamingCallMetadata) GrpcServerBuilder(io.servicetalk.grpc.api.GrpcServerBuilder) BufferEncoder(io.servicetalk.encoding.api.BufferEncoder) HttpServerBuilder(io.servicetalk.http.api.HttpServerBuilder) AddressUtils.localAddress(io.servicetalk.transport.netty.internal.AddressUtils.localAddress) ServiceFactory(io.servicetalk.grpc.netty.CompatProto.Compat.ServiceFactory) ServerContext(io.servicetalk.transport.api.ServerContext) Processors.newPublisherProcessor(io.servicetalk.concurrent.api.Processors.newPublisherProcessor) SingleAddressHttpClientBuilder(io.servicetalk.http.api.SingleAddressHttpClientBuilder) NettyChannelBuilder(io.grpc.netty.NettyChannelBuilder) StreamingHttpResponseFactory(io.servicetalk.http.api.StreamingHttpResponseFactory) Any.pack(com.google.protobuf.Any.pack) Collections(java.util.Collections) HttpClients(io.servicetalk.http.netty.HttpClients) SECONDS(java.util.concurrent.TimeUnit.SECONDS) TerminalSignalConsumer(io.servicetalk.concurrent.api.TerminalSignalConsumer) ServiceFactory(io.servicetalk.grpc.netty.CompatProto.Compat.ServiceFactory) Compat(io.servicetalk.grpc.netty.CompatProto.Compat) Publisher(io.servicetalk.concurrent.api.Publisher) IOException(java.io.IOException) ServerContext(io.servicetalk.transport.api.ServerContext) BlockingCompatService(io.servicetalk.grpc.netty.CompatProto.Compat.BlockingCompatService) CompatResponse(io.servicetalk.grpc.netty.CompatProto.ResponseContainer.CompatResponse) GrpcServiceContext(io.servicetalk.grpc.api.GrpcServiceContext) CompatRequest(io.servicetalk.grpc.netty.CompatProto.RequestContainer.CompatRequest)

Example 3 with GrpcServiceContext

use of io.servicetalk.grpc.api.GrpcServiceContext in project servicetalk by apple.

the class TestSingle method singleGenerated.

@Test
void singleGenerated() throws ExecutionException, InterruptedException {
    GreeterService service = new GreeterService() {

        @Override
        public Single<HelloReply> sayHelloFromMany(final GrpcServiceContext ctx, final Publisher<UserRequest> request) {
            return Single.succeeded(HelloReply.newBuilder().build());
        }

        @Override
        public Single<HelloReply> sayHello(final GrpcServiceContext ctx, final UserRequest request) {
            return Single.succeeded(HelloReply.newBuilder().build());
        }

        @Override
        public Publisher<HelloReply> sayHelloToFromMany(final GrpcServiceContext ctx, final Publisher<UserRequest> request) {
            return Publisher.from(HelloReply.newBuilder().build());
        }

        @Override
        public Publisher<HelloReply> sayHelloToMany(final GrpcServiceContext ctx, final UserRequest request) {
            return Publisher.from(HelloReply.newBuilder().build());
        }
    };
    FarewellerService service2 = new FarewellerService() {

        @Override
        public Publisher<Untils> getAllUntils(final GrpcServiceContext ctx, final Generic.Empty request) {
            return Publisher.from(Untils.newBuilder().build());
        }

        @Override
        public Single<SharedReply> sayGoodbye(final GrpcServiceContext ctx, final UserRequest request) {
            return Single.succeeded(SharedReply.newBuilder().build());
        }
    };
    service.closeAsync().toFuture().get();
    service2.closeAsync().toFuture().get();
}
Also used : Untils(test.shared.TestShared.Untils) SharedReply(test.shared.TestShared.SharedReply) FarewellerService(io.servicetalk.grpc.protoc.test.single.HelloWorldProto.Fareweller.FarewellerService) GreeterService(io.servicetalk.grpc.protoc.test.single.HelloWorldProto.Greeter.GreeterService) GrpcServiceContext(io.servicetalk.grpc.api.GrpcServiceContext) Publisher(io.servicetalk.concurrent.api.Publisher) HelloReply(io.servicetalk.grpc.protoc.test.single.HelloWorldProto.HelloReply) UserRequest(io.servicetalk.grpc.protoc.test.single.HelloWorldProto.UserRequest) Test(org.junit.jupiter.api.Test)

Example 4 with GrpcServiceContext

use of io.servicetalk.grpc.api.GrpcServiceContext in project servicetalk by apple.

the class TestMulti method multiGenerated.

@Test
void multiGenerated() throws ExecutionException, InterruptedException {
    TesterService service = new TesterService() {

        @Override
        public Publisher<TestReply> testBiDiStream(final GrpcServiceContext ctx, final Publisher<TestRequest> request) {
            return Publisher.from(TestReply.newBuilder().build());
        }

        @Override
        public Single<TestReply> testRequestStream(final GrpcServiceContext ctx, final Publisher<TestRequest> request) {
            return Single.succeeded(TestReply.newBuilder().build());
        }

        @Override
        public Publisher<TestReply> testResponseStream(final GrpcServiceContext ctx, final TestRequest request) {
            return Publisher.from(TestReply.newBuilder().build());
        }

        @Override
        public Single<TestReply> test(final GrpcServiceContext ctx, final TestRequest request) {
            return Single.succeeded(TestReply.newBuilder().build());
        }
    };
    Tester2Service service2 = new Tester2Service() {

        @Override
        public Publisher<Untils> testUntils(final GrpcServiceContext ctx, final Generic.Empty request) {
            return Publisher.from(Untils.newBuilder().build());
        }

        @Override
        public Single<SharedReply> testShared(final GrpcServiceContext ctx, final TestRequest request) {
            return Single.succeeded(SharedReply.newBuilder().build());
        }
    };
    service.closeAsync().toFuture().get();
    service2.closeAsync().toFuture().get();
}
Also used : Tester2Service(io.servicetalk.grpc.protoc.test.multi.Tester2.Tester2Service) TestReply(io.servicetalk.grpc.protoc.test.multi.TestReply) Untils(test.shared.TestShared.Untils) SharedReply(test.shared.TestShared.SharedReply) GrpcServiceContext(io.servicetalk.grpc.api.GrpcServiceContext) Publisher(io.servicetalk.concurrent.api.Publisher) TesterService(io.servicetalk.grpc.protoc.test.multi.Tester.TesterService) TestRequest(io.servicetalk.grpc.protoc.test.multi.TestRequest) Test(org.junit.jupiter.api.Test)

Aggregations

GrpcServiceContext (io.servicetalk.grpc.api.GrpcServiceContext)4 Publisher (io.servicetalk.concurrent.api.Publisher)3 GrpcExecutionContext (io.servicetalk.grpc.api.GrpcExecutionContext)2 Test (org.junit.jupiter.api.Test)2 SharedReply (test.shared.TestShared.SharedReply)2 Untils (test.shared.TestShared.Untils)2 Any (com.google.protobuf.Any)1 Any.pack (com.google.protobuf.Any.pack)1 InvalidProtocolBufferException (com.google.protobuf.InvalidProtocolBufferException)1 Codec (io.grpc.Codec)1 Compressor (io.grpc.Compressor)1 CompressorRegistry (io.grpc.CompressorRegistry)1 Decompressor (io.grpc.Decompressor)1 DecompressorRegistry (io.grpc.DecompressorRegistry)1 ManagedChannel (io.grpc.ManagedChannel)1 Server (io.grpc.Server)1 Status (io.grpc.Status)1 StatusRuntimeException (io.grpc.StatusRuntimeException)1 GrpcSslContexts (io.grpc.netty.GrpcSslContexts)1 NettyChannelBuilder (io.grpc.netty.NettyChannelBuilder)1