当前位置: 首页 > 知识库问答 >
问题:

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

仲孙子辰
2023-03-14

我相信我可能不了解gRPC通道、存根和传输的工作原理。我有一个Android应用程序,它创建一个通道和一个阻塞存根,并在应用程序初始化时使用dagger将其注入。当我需要进行grpc调用时,我的客户机中有一个方法,它使用该存根调用一个方法。应用程序闲置一段时间后,所有my calls return Dutaline\u都出现了错误,尽管服务器日志中没有显示任何呼叫。

@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()时我都应该创建一个新的阻塞存根?如果您能帮助理解这一点,我们将不胜感激。

共有1个答案

艾英范
2023-03-14

经过一番研究,我相信问题是服务器上的代理在几分钟空闲时间后关闭了连接,而客户端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)
}
 类似资料:
  • 我已成功启用node_exporter的监控,但JMX_exporter失败 我能够通过Curl为jmx_metricsendpoint获取输出(http://localhost:55555/testsvr2/jmx_exporter/metrics)响应时间不到一秒(我在下面附上了输出),但普罗米修斯显示状态为“DOWN”,并显示消息“context deadline exceed”。 这是我用

  • 问题内容: 当我在Node服务器上打印请求的内容时,在任何地方都看不到用户数据。 这是我的节点服务器: 这是Angular2代码: 任何人都可以帮我或解释如何处理角度的http请求。 问题答案: 那是你的服务器: 那是您的有角度的客户: 回购https://github.com/kuncevic/angular-httpclient- examples

  • Angular.js:14516可能未处理的拒绝:{“data”:null,“status”:-1,“config”:{“method”:“post”,“transformrequest”:[null],“transformresponse”:[null],“jsonpcallbackparam”:“callback”,“url”:“http://localhost:3000/lvl/2/data

  • 问题内容: 我对使用roku和roku特定语言(BasicScript)非常了解。我需要对某些服务器进行api调用以获取频道。我不明白如何在roku中做到这一点。请提出建议。 问题答案: 这是直接执行此操作的方法,而不必依赖SDK中包含的代码库的语法: 阻止方法(所有程序执行停止,直到检索到URL): 非阻塞方法,您可以在等待数据时执行其他操作:

  • XMLHttpRequest 对象用于和服务器交换数据。 向服务器发送请求 如需将请求发送到服务器,我们使用 XMLHttpRequest 对象的 open() 和 send() 方法:xmlhttp.open("GET","ajax_info.txt",true); xmlhttp.send(); 方法 描述 open(method,url,async) 规定请求的类型、URL 以及是否异步处理

  • 我试图从java向一个现有的RESTful服务发出一个< code>POST请求,以便获得json响应并将其存储在一个字符串中。 让我们假设RESTful Service Url如下所示: 这是一种带有产品的商店,您想要搜索商品。为了进行搜索,您还必须发送, 如下所示: 为了发布这篇文章,我在java中实现了以下方法: 例外情况如下: 我不知道为什么我会得到这个例外,但如果你有一个想法或者你也面临