You are correct, the Marshaller won't be able to access the Context from 
the interceptor. Though not exactly for the reasons you mentioned.
Unmarshalling happens prior to `ServerCall.Listener.onMessage` callback 
is executed: 

1. io.grpc.MethodDescriptor.Marshaller unmarshaller the message -->
2. Contexts.interceptCall interceptor (ContextualizedServerCallListener 
<https://github.com/grpc/grpc-java/blob/f20c853c40ef620e79b01ebcec6fcf0f667cab61/api/src/main/java/io/grpc/Contexts.java#L63>)
 
restores the contexts -->
3. ServerCall.Listener.onMessage callbacks are executed (with the context 
attached).

To answer your question, could you please provide a bit more info on what 
you're trying to achieve? Why do you need microservice method name in the 
marshaller?
There are a few possible approaches, but it really depends on your goals.

Best Regards,
Sergii

On Monday, February 12, 2024 at 8:07:03 AM UTC-8 R Chinmay wrote:

> I have a custom implementation of request marshaller (overriding 
> io.grpc.MethodDescriptor.Marshaller) 
> which I want to use, but I would need context information related to the 
> microservice call (specifically microservice method name being invoked). I 
> tried populating it in ServerInterceptor's interceptCall. My interceptor 
> code looks like this:
> ​@Override
>
> public <ReqT, RespT> Listener<ReqT> interceptCall(ServerCall<ReqT, RespT> 
> serverCall, Metadata metadata, ServerCallHandler<ReqT, RespT> 
> serverCallHandler) {
>   
> Context context = Context.current().withValue(MS_METHOD_NAME, 
> call.getMethodDescriptor().getFullMethodName());
>    
> return Contexts.interceptCall(context, serverCall, metadata, 
> serverCallHandler);
> }
>
> But the context populated does not persist when unmarshalling of the 
> request stream takes place.
>
> This is because 
> io.grpc.internal.ServerImpl.ServerTransportListenerImpl#streamCreatedInternal 
> creates new 
> io.grpc.internal.ServerImpl.JumpToApplicationThreadServerStreamListener and 
> populates context using 
> io.grpc.internal.ServerImpl.ServerTransportListenerImpl#createContext which 
> just adds deadline and serverImpl instance fields over rootContext. So, the 
> information I populated was not available during unmarshalling. Also, 
> populating it in onMessage would not be useful too, since 
> io.grpc.internal.ServerCallImpl.ServerStreamListenerImpl#messagesAvailableInternal
>  
> uses 
> ​listener.onMessage(call.method.parseRequest(message));
>
> so parseRequest executes before onMessage is triggered.
>
> Is there some way to pass context information to marshaller, or maybe use 
> method name there. I am constructing methodDescriptor using 
> io.grpc.MethodDescriptor.Builder
>

-- 
You received this message because you are subscribed to the Google Groups 
"grpc.io" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to grpc-io+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/grpc-io/4baf2d88-de85-4bcd-a9d6-1bed0a20f2afn%40googlegroups.com.

Reply via email to