2017-04-10 43 views
0

我在GRPC客戶端上使用GRPC版本:1.1.2 & JDK版本:1.8在連接到NodeJS服務器的GRPC客戶端上。 Java客戶端能夠正常連接,但當我斷開與客戶端的連接時,我總是在服務器端看到下面的異常。使用GRPC時SSL解密錯誤

異常(僅在服務器上)

E0410 15:03:19.674531000 140735121084416 ssl_transport_security.c:439] SSL_read returned 0 unexpectedly. 
E0410 15:03:19.674829000 140735121084416 secure_endpoint.c:185]  Decryption error: TSI_INTERNAL_ERROR 

我關閉通過以下調用的GRPC的Java連接:

channel.shutdown().awaitTermination(5, TimeUnit.SECONDS); //channel is ManagedChannel 

我應該做這個之前被清理的任何其他資源打電話還是應該使用備用機制徹底斷開與服務器的連接?

編輯 我注意到,我得到同樣的錯誤,當我嘗試以下方法,以及:

channel.shutdown(); 

我在Mac上使用OpenSSL - 我記得更改默認的Mac版(OpenSSL的0.9.8zh 2016年1月14日)。

在GRPC

result = tsi_frame_protector_unprotect(ep->protector, message_bytes, 
              &processed_message_size, cur, 
              &unprotected_buffer_size_written); 
     gpr_mu_unlock(&ep->protector_mu); 
     if (result != TSI_OK) { 
     gpr_log(GPR_ERROR, "Decryption error: %s", 
       tsi_result_to_string(result)); 
     break; 
     } 

回答

1

ManagedChannel.shutdown() secure_endpoint.c指示沒有更多新的RPC應啓動服務器。所有現有的RPC,特別是流式RPC都將繼續運行。一旦完成所有這些RPC,ManagedChannel將關閉所有底層連接,並且通道將進入終止狀態。

ManagedChannel被設計爲類似於ExecutorService。有一兩件事可以做,以確保你真的是正常關閉是在一個循環中調用awaitTermination:

while (!channel.awaitTermination(5, TimeUnit.Second)) { 
    System.err.println("Still not terminated."); 
} 
+0

將嘗試 - 感謝 –

+0

感謝 - 有來自客戶端的整理過的雙向流的清潔方法時,客戶需要斷開連接? –

+0

或者是從客戶端關閉頻道的唯一選項,並且服務器必須檢測客戶端斷開連接並關閉流? –