超出gRPC Android截止日期,但未向服务器发出请求
我相信我可能不了解gRPC通道、存根和传输是如何工作的。我有一个Android应用程序,它创建一个通道和一个阻塞存根,并在应用程序初始化时使用dagger注入它。当我需要进行grpc调用时,我的客户机中有一个方法,该方法使用该存根调用一个方法。应用程序空闲一段时间后,我所有的呼叫返回截止日期都超过了错误,尽管服务器日志中没有显示任何呼叫超出gRPC Android截止日期,但未向服务器发出请求,android,grpc,grpc-java,Android,Grpc,Grpc Java,我相信我可能不了解gRPC通道、存根和传输是如何工作的。我有一个Android应用程序,它创建一个通道和一个阻塞存根,并在应用程序初始化时使用dagger注入它。当我需要进行grpc调用时,我的客户机中有一个方法,该方法使用该存根调用一个方法。应用程序空闲一段时间后,我所有的呼叫返回截止日期都超过了错误,尽管服务器日志中没有显示任何呼叫 @Singleton @Provides fun providesMyClient(app: Application): MyClient { val
@Singleton
@Provides
fun providesMyClient(app: Application): MyClient {
val channel = AndroidChannelBuilder
.forAddress("example.com", 443)
.overrideAuthority("example.com")
.context(app.applicationContext)
.build()
return MyClient(channel)
}
其中,我的客户端类有一个函数,用于返回带有截止日期的请求:
class MyClient(channel: ManagedChannel) {
private val blockingStub: MyServiceGrpc.MyServiceBlockingStub = MyServiceGrpc.newBlockingStub(channel)
fun getStuff(): StuffResponse =
blockingStub
.withDeadlineAfter(7, TimeUnit.SECONDS)
.getStuff(stuffRequest())
}
fun getOtherStuff(): StuffResponse =
blockingStub
.withDeadlineAfter(7, TimeUnit.SECONDS)
.getOtherStuff(stuffRequest())
}
我在存储库中的LiveData类中对服务器进行调用,调用如下所示:myClient.getStuff()
我猜通道在某个点失去了连接,随后所有的存根都无法连接,但是我在AndroidChannelBuilder文档中没有看到任何地方谈到如何处理这个问题(我相信它会自动重新连接)。我用来创建阻塞存根的通道是否可能过时,并且每次调用getStuff()时都应该创建一个新的阻塞存根?了解这一点的任何帮助都将不胜感激。经过一点研究,我认为问题在于服务器上的代理在几分钟空闲时间后关闭了连接,而客户端ManagedChannel没有自动检测到这一点,并在发生这种情况时重新连接。在构建ManagedChannel时,我在其中添加了idleTimeout,它将在连接空闲时主动终止连接,并在需要时重新建立连接,这似乎解决了问题。因此,新的渠道结构如下所示:
@Singleton
@Provides
fun providesMyClient(app: Application): MyClient {
val channel = AndroidChannelBuilder
.forAddress("example.com", 443)
.overrideAuthority("example.com")
.context(app.applicationContext)
.idleTimeout(60, TimeUnit.SECONDS)
.build()
return MyClient(channel)
}
我也面临同样的问题,但是您的空闲超时时间似乎太短,您有更好的解决方案吗?