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

Spring外部客户端超时

卢俭
2023-03-14

在我们的Spring应用程序中,我们依赖外部系统。我们希望为该系统的请求设置超时,但无法确定如何配置。

我们使用这个:

   return clientBuilder.build()
            .target(baseUrl)
            .register(jsonProvider)
            .register(jsonAcceptHeaderClientRequestFilter)
            .register(new LoggingFilter());

我已经尝试过这个:如何使用泽西2. x设置连接和读取超时?和许多其他建议,但无法让它工作。任何建议都将不胜感激。

不工作的更新:

.property("http.connection.timeout", 1)
.property("http.receive.timeout", 1)

.property(ClientProperties.CONNECT_TIMEOUT,1)
.property(ClientProperties.READ_TIMEOUT,1)

共有2个答案

弘浩博
2023-03-14

您可以使用< code > server . connection-time out ,但这将为所有请求设置超时,而不仅仅是对外部系统的请求。

server.connection-timeout= #连接器在关闭连接之前等待另一个HTTP请求的时间。如果未设置,则使用连接器的特定于容器的默认值。使用值-1表示没有(即无限)超时。

参考

邵兴文
2023-03-14

正如在您的问题中链接的答案中确认的那样,@df778899的评论之一,根据我的测试,对于球衣客户,以下用法可以正常工作

target(baseUrl)
.property(ClientProperties.CONNECT_TIMEOUT, 1000)
.property(ClientProperties.READ_TIMEOUT, 1000)

并生成<code>java.net。SocketTimeoutException,如果外部服务器未能在设置的时间内响应。

对于ApacheCxf客户端,我已经测试了下面的代码段,它适用于读取超时。这是官方参考。在该页面中搜索以下代码段中使用的参数。

注意:对于支持此功能时的版本,请检查此JIRA。

target(baseUrl)
.property("http.connection.timeout", 5000)
.property("http.receive.timeout", 5000)

更新:以下内容可能不是OP要求的,但出于学术原因保留。.

我的直觉是,你追求的是一个不同的目标。在我看来,你的外部系统实际上正在做出反应,但也许以比你想要的速度慢,或者反应本身更大,这反过来又需要比你想要的更长的时间来消耗?

在这种情况下,您可以调整超时参数。但是,它们是在循环套接字读取的基础上工作的。因此,假设您将超时设置为<code>XX适用于每次读取。因此,理论上,完全读取可能需要<code>X*Y</code>ms。

如果以上确实是您的问题,那么您可能必须使用外部计时器来解决此问题。例如,您可以:

  1. 通过ExecutorService进行外部服务调用。提交(可调用
 类似资料:
  • 如果您更喜欢使用配置属性来配置所有@FaignClient,您可以使用默认的假名创建配置属性。也可以通过命名客户端来为每个特定客户端设置这些超时。当然,我们可以列出一个全局设置,也可以毫无问题地将每个客户端覆盖在一起。 我的客户: 我试图做到这一点,我希望foo-client.read超时覆盖default.read超时时,我使用foo客户端: 但这并没有发生。我不确定Hystrix的Timeou

  • 我对Spring集成的设想是: 使用自定义协议(大小和内容)发送数据的十个生产者 我必须解码这个自定义协议,然后处理结果。 所以我尝试了很多配置,目前最好的配置如下: 序列化类为: 我使用此代码来测试服务器: 当我用一个线程执行此操作时,如果我尝试执行多个线程,则效果很好,如: spring集成服务器卡住了,我有以下警告: 而且它不工作,服务器无法接收消息。 我错在哪里?非常感谢。 编辑 我这样修

  • 按照这里的讨论,我使用以下步骤使外部客户端(基于 kafkajs)连接到 OpenShift 上的 Strimzi。这些步骤从这里开始。 被编辑为如下所示。 要提取证书并在客户端中使用它,我运行了以下命令: 请注意,我必须在我的macOS上使用,而不是,如留档所示。 这是从他们的 页面和他们的文档改编的客户端。 当我从具有的文件夹运行时,我收到一条连接拒绝消息。 我错过了什么?

  • 我试图测试Spring反应式Webclient的默认超时。为此,我创建了一个需要 10 小时才能返回响应的 rest endpoint。 我使用spring-reactive Webclient创建了一个rest客户端。但我看到,springReactiveWebclient一直在等待10个小时。 spring reactive Webclient没有任何默认超时吗?

  • 我有一个假客户端,它从微服务请求令牌。由于我正在进行多次调用,我希望缓存从外部客户端收到的响应并使用Spring Guava缓存,但它似乎不起作用。我所拥有的只是外部客户端上的配置类和注释。 我在堆栈溢出的某个地方读到,Fegn可能不支持@Cacheable注释。这是真的吗?

  • 我正在使用Apache HTTP客户端联系外部服务。这项服务可能需要几个小时(如果不是更长的话)才能产生响应。我尝试了一些不同的方法,但要么以套接字结束,要么以读取超时结束。我刚刚尝试使用RequestConfig将套接字和连接超时设置为0,根据文档,这应该是无限的,但请求总是在1小时后返回。有什么想法吗?