I think current options are only for unary RPC done on a channel, but in 
the case of bidirectional streaming, we have a channel where a long-lived 
bidirectional RPC is made & within that RPC connection, we send messages. 
But these server options do not take account of the stream messages, they 
only consider RPC calls. correct me guys if I am wrong in my understanding.

On Wednesday, August 30, 2023 at 5:45:11 PM UTC+5 airas yaqub wrote:

> Hi, we have a bidirectional java gRPC server & we are using 
> NettyServerBuilder to configure the server. I have read all the docs in 
> order to implement the ping/pong mechanism for the gRPC connection. Below 
> is our server config 
>
> server code: 
>
> ((NettyServerBuilder) serverBuilder)
>         .executor(executor)
>         //Allow client pings even if no ongoing calls are happening 
> (default is false)
>         .permitKeepAliveWithoutCalls(true)
>         //Least keep alive time allowed for clients to configure
>         .permitKeepAliveTime(10,TimeUnit.SECONDS)
>         //How long a channel can stay idle (idle means no pings & messages 
> received)
>         .maxConnectionIdle(5,TimeUnit.SECONDS)
>         //How long a channel can stay at all (even if not idle)
>         .maxConnectionAge(1,TimeUnit.MINUTES)
>         //Grace period after the channel ends
>         .maxConnectionAgeGrace(10,TimeUnit.SECONDS)
>         //Max payload size
>         .maxInboundMessageSize(Integer.MAX_VALUE)
>         //Max headers size
>         .maxInboundMetadataSize(Integer.MAX_VALUE);
> }
>
>
> client code:
>
> ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 
> 50004)
>         .usePlaintext()
>         .keepAliveTime(30, TimeUnit.SECONDS)
>         .keepAliveTimeout(5, TimeUnit.SECONDS)
>         .keepAliveWithoutCalls(true)
>         .build();
>
> FabricGrpc.FabricStub stub = FabricGrpc.newStub(channel);
>
> Metadata headers = new Metadata();
> headers.put(Metadata.Key.of("userId", Metadata.ASCII_STRING_MARSHALLER), 
> identificationInputs[0]);
> FabricGrpc.FabricStub stubWithHeaders = MetadataUtils.attachHeaders(stub, 
> headers);
>
> StreamObserver<Envelope> observer = 
> stubWithHeaders.biDiEnvelopeChannel(new StreamObserver<Envelope>() {
>     @Override
>     public void onNext(Envelope value) {
>         System.out.println("Received message =====> " + value + " ******* 
> ");
>     }
>
>     @Override
>     public void onError(Throwable t) {
>         System.out.println("error on grpc client: " + t.getMessage());
>     }
>
>     @Override
>     public void onCompleted() {
>
>     }
> });
>
>
> what we need is if the connection is idle for a given time, the server 
> should kill the connection. But I think I am not getting how 
> *maxConnectionIdle 
> *actually works. My previous thought was a connection is idle from the 
> server's perspective if it does not get any message or ping, but then I 
> read this line in the doc " Idleness duration is defined since the most 
> recent time the number of outstanding RPCs became zero or the connection 
> establishment" which I guess means that not any ongoing RPC calls should 
> be there in order to consider a connection as idle. But since it's a 
> bidirectional RPC call, it will be long-lived obviously. 
>
> Right now maxConnectionAge is working fine, but how can we configure idle 
> connection on a server with bidirectional RPC. Meaning if the server does 
> not get a ping or any message in a given time frame, it will consider that 
> connection as idle & will terminate it.   
>
>

-- 
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/15bd1350-9065-4fd5-9b60-87f228132dacn%40googlegroups.com.

Reply via email to