Как я узнаю, было ли потеряно GRPC-соединение?

#java #connection #grpc #grpc-java

#java #подключение #grpc #grpc-java

Вопрос:

Я внедрил GRPC-клиент с Java.

 String host:"192.893.12.11";
int port:9090; 

ManagedChannel managedChannel = ManagedChannelBuilder.forAddress(host, port).usePlaintext().build();
  

Я хочу получать информацию о потере соединения grpc. Как уведомить клиента, если GRPC-соединение было потеряно?

Комментарии:

1. Просто взглянул на JavaDocs для ManagedChannel , кажется, есть метод ManagedChannel.notifyWhenStateChanged — это делает то, что вам нужно?

2. Как использовать этот метод? Есть ли какой-нибудь пример?

3. notifyWhenStateChanged может немного помочь. Его использование должно быть довольно простым, как описано в Javadoc . Примечание notifyWhenStateChanged может обнаруживать только изменения состояния канала. Однако состояние канала не обязательно отражает срок службы TCP-соединения. Сокет TCP может оставаться открытым (или закрываться операционной системой автоматически), даже если сетевое соединение было прервано в середине. Таким образом, gRPC может знать только о том, что соединение разорвано, при сбое записи в сокет.

4. Использование времени жизни RPC является более точным. Вы можете использовать потоковый RPC, если это поможет. RPC могут работать до тех пор, пока они подключены к TCP-соединению.

Ответ №1:

Вы можете использовать notifyWhenStateChanged метод ManagedChannel, чтобы получать уведомления при изменении состояния канала, например, хотите получать уведомления при завершении работы сервера, вы можете попробовать приведенный ниже код:

 // create a ManagedChannel 
ManagedChannel channel = ManagedChannelBuilder.forTarget(target)
        .usePlaintext()
        .build();

// add callback method
channel.notifyWhenStateChanged(ConnectivityState.SHUTDOWN, () -> System.out.println("server shutdown"));
  

Комментарии:

1. Это неправильно, потому что первый параметр — это текущее состояние, а не целевое состояние.