GRPC client stream onMessage and onClose executes on different threads
When calling client grpc service method form blocking code(no matter if its blocking or async client).  Stream close will be executed on worker thread, but on message event will be executed on event-loop thread. So client stream usually closed before able to reads any message

**Expected behavior**
OnMessage and OnClose executed in correct order

**To Reproduce**
https://drive.google.com/file/d/16xdsSuSV4V9pQAJt_HDYoppgqsAGOGoX/view?usp=sharing

Steps to reproduce the behavior:
archive contains single UT that reproduce incorrect behavior.
For more details you will need to debug class `io.grpc.stub.ClientCall.BlockingResponseStream.QueuingListener` to see threads

**Environment (please complete the following information):**
 - Output of `uname -a` or `ver`:  Linux andrii-PC 5.4.0-65-generic #73-Ubuntu SMP Mon Jan 18 17:25:17 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
 - Output of `java -version`:  openjdk version "11.0.9" 2020-10-20
 - GraalVM version (if different from Java):  OpenJDK Runtime Environment GraalVM CE 20.3.0 (build 11.0.9+10-jvmci-20.3-b06)
 - Quarkus version or git rev:  1.11.3
 - Build tool (ie. output of `mvnw --version` or `gradlew --version`): maven 3.6.3 or gradle 6.5.1

diff --git a/extensions/grpc/runtime/src/main/java/io/quarkus/grpc/runtime/supports/IOThreadClientInterceptor.java b/extensions/grpc/runtime/src/main/java/io/quarkus/grpc/runtime/supports/IOThreadClientInterceptor.java
index d4e49736fca..f067033e631 100644
--- a/extensions/grpc/runtime/src/main/java/io/quarkus/grpc/runtime/supports/IOThreadClientInterceptor.java
+++ b/extensions/grpc/runtime/src/main/java/io/quarkus/grpc/runtime/supports/IOThreadClientInterceptor.java
@@ -23,10 +23,19 @@ public void start(Listener<RespT> responseListener, Metadata headers) {
                 super.start(new ForwardingClientCallListener.SimpleForwardingClientCallListener<RespT>(responseListener) {
                     @Override
                     public void onMessage(RespT message) {
+                        runInContextIfNeed(() -> super.onMessage(message));
+                    }
+
+                    @Override
+                    public void onClose(Status status, Metadata trailers) {
+                        runInContextIfNeed(() -> super.onClose(status, trailers));
+                    }
+
+                    private void runInContextIfNeed(Runnable fun) {
                         if (context != null) {
-                            context.runOnContext(unused -> super.onMessage(message));
+                            context.runOnContext(unused -> fun.run());
                         } else {
-                            super.onMessage(message);
+                            fun.run();
                         }
                     }
                 }, headers);
['extensions/grpc/runtime/src/main/java/io/quarkus/grpc/runtime/supports/IOThreadClientInterceptor.java']