On Mon, Nov 15, 2021 at 12:55 AM Christopher Meiklejohn <
[email protected]> wrote:

> To achieve this, I've made a custom interceptor that throws an exception
> (or, creates a Status of a particular type like FAILED_PRECONDITION, and
> converting that to an exception) and throwing in the sendMessage callback,
> where I can access the message contents.
>

Interceptors should not throw. Generally interceptors should
call Listener.onClose() instead. But that also means you *must not* pass
the listener to `next`, because then it will *also* call onClose().

Before I throw the exception, I call delegate().halfClose() and *do not*
> call super.sendMessage.
>

You can have an RPC without a message. Streaming RPCs can work this way.
You are creating a new RPC, and then gracefully closing it, but the RPC
still exists.

Should this be happening?  Any insights on how I can go about debugging
> exactly what is happening?
>

You should delay calling `next` (which creates a new RPC) from the
interceptor until you are certain the RPC will be needed (i.e., that you
won't inject a failure).

The Client Cache Example is in a similar situation to you, as it needs to
avoid sending an RPC if there is a cache hit. Your code will be a bit
simpler, because you don't need CachingListener, but the
interceptCall+ForwardingClientCall code is appropriate to look at.
Unfortunately, the current code in master suffers from actually sending the
RPC unnecessarily, so you can look at my branch that has sketched out a
better approach (again, pay most attention to
interceptCall+ForwardingClientCall):
https://github.com/ejona86/grpc-java/blob/caching-interceptor-avoid-rpcs/examples/android/clientcache/app/src/main/java/io/grpc/clientcacheexample/SafeMethodCachingInterceptor.java

Essentially, it 1) avoids calling `next` until it is certain it needs an
RPC and 2) caches method calls until it has made its decision.

-- 
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 [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/grpc-io/CA%2B4M1oOxTQ-UaTkBEYe8xW85Q532tu4BHhmR3LqEiq7V%2BiNebA%40mail.gmail.com.

Reply via email to