🐷

Spring boot(kotlin) + gRPCクライアントでtimeoutを設定する方法

2022/07/27に公開

Spring boot(kotlin)でgRPCのテストを書いていてtimeoutを設定していなかったためにレスポンスが返ってこないままいわゆるデッドロック状態になってハマったのでその備忘録です。

問題

下記のようにgRPCクライアントのコードを実装してテストをしていたところ、あるテストでエラーが発生していてそのままプロセスが終了せずデッドロック状態になっていた。

val channel = ManagedChannelBuilder.forAddress("localhost", 6565)
            .intercept(MetadataClientInterceptor())
            .usePlaintext().build()

val stub = HelloGrpcKt.HelloCoroutineStub(channel)

val response = async { stub.helloRpc(Empty.getDefaultInstance(), metadata) }

解決策

stubインスタンスを作成する時にtimeoutの設定をする。
下記の例だと10秒でタイムアウトする。

val channel = ManagedChannelBuilder.forAddress("localhost", 6565)
            .intercept(MetadataClientInterceptor())
            .usePlaintext().build()

- val stub = HelloGrpcKt.HelloCoroutineStub(channel)
+ val stub = HelloGrpcKt.HelloCoroutineStub(channel, CallOptions.DEFAULT.withDeadline(Deadline.after(10), TimeUnit.SECONDS))

val response = async { stub.helloRpc(Empty.getDefaultInstance(), metadata) }

以上!

GitHubで編集を提案

Discussion