@Override
    public Mono<HelloReply> blockingHello(Mono<HelloRequest> request) {
        // Unlike upstream gRPC-Java, Armeria does not run service logic in a separate thread pool by default.
        // Therefore, this method will run in the event loop, which means that you can suffer the performance
        // degradation if you call a blocking API in this method. In this case, you have the following options:
        //
        // 1. Call a blocking API in the blockingTaskExecutor provided by Armeria.
        // 2. Set GrpcServiceBuilder.useBlockingTaskExecutor(true) when building your GrpcService.
        // 3. Call a blocking API in the separate thread pool you manage.
        //
        // In this example, we chose the option 1:
        return request
                .publishOn(Schedulers.fromExecutor(ServiceRequestContext.current()
                                                                        .blockingTaskExecutor()))
                .map(it -> {
                    try {
                        // Simulate a blocking API call.
                        Thread.sleep(3000);
                    } catch (Exception ignored) {
                        // Do nothing.
                    }
                    return buildReply(toMessage(it.getName()));
                });
    }
Sends a {@link HelloReply} using {@code blockingTaskExecutor}.

@see <a href="https://armeria.dev/docs/server-grpc#blocking-service-implementation">Blocking
     service implementation</a>
examples/grpc-reactor/src/main/java/example/armeria/grpc/reactor/HelloServiceImpl.java