Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/212.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
超出gRPC Android截止日期,但未向服务器发出请求_Android_Grpc_Grpc Java - Fatal编程技术网

超出gRPC Android截止日期,但未向服务器发出请求

超出gRPC Android截止日期,但未向服务器发出请求,android,grpc,grpc-java,Android,Grpc,Grpc Java,我相信我可能不了解gRPC通道、存根和传输是如何工作的。我有一个Android应用程序,它创建一个通道和一个阻塞存根,并在应用程序初始化时使用dagger注入它。当我需要进行grpc调用时,我的客户机中有一个方法,该方法使用该存根调用一个方法。应用程序空闲一段时间后,我所有的呼叫返回截止日期都超过了错误,尽管服务器日志中没有显示任何呼叫 @Singleton @Provides fun providesMyClient(app: Application): MyClient { val

我相信我可能不了解gRPC通道、存根和传输是如何工作的。我有一个Android应用程序,它创建一个通道和一个阻塞存根,并在应用程序初始化时使用dagger注入它。当我需要进行grpc调用时,我的客户机中有一个方法,该方法使用该存根调用一个方法。应用程序空闲一段时间后,我所有的呼叫返回截止日期都超过了错误,尽管服务器日志中没有显示任何呼叫

@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)
}

我也面临同样的问题,但是您的空闲超时时间似乎太短,您有更好的解决方案吗?