- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个使用 spring HttpInvokers 的客户端服务器应用程序。我正在与超时作斗争。我看到其他与此相关的主题,但没有明确的答案。
据我所知,readTimeout 应该控制事务在连接后的长度。我之所以写得很长,是因为某些流程(例如报告请求)需要时间来运行。这在很长一段时间内一直运行良好。
现在的问题是,有时互联网连接会在发出请求时失败或突然中断,但从未建立连接。我没有犯错误,而是建立了一个重试程序来拦截失败的连接并重试。我希望这些失败很快发生,因此我将 HttpClient 参数 soTimeout 和 connectionManagerTimeout 设置为 2 秒。
这似乎在大多数情况下都有效。有时需要超过 2 秒才能发现问题,但这没关系。问题是 soTimeout 似乎也适用于或覆盖 readTimout。因此,现在我所有运行时间较长的请求都会获得重试功能,即使它们已经连接得很好并且只是等待回复完成。 ConnectionManagerTimeout 设置似乎根本没有执行任何操作。似乎没有什么会影响实际获取初始连接所需的时间。
我还应该设置另一个超时参数吗?
<bean id="myServiceInterceptor"
class="org.springframework.remoting.httpinvoker.HttpInvokerClientInterceptor">
<property name="serviceUrl">
<value>https://myhost/myservices/myMgrService</value>
</property>
<property name="remoteInvocationFactory" ref="remoteInvocationFactory"/>
<property name="httpInvokerRequestExecutor">
<bean class="org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor">
<!--read time out is how long we will wait for a reply. This is large in case we are waiting on a long server process-->
<property name="readTimeout" value="2000000"/>
<!-- we manually set this so we can control the parameter timeout values-->
<property name="httpClient">
<bean class="org.apache.commons.httpclient.HttpClient">
<constructor-arg index="0">
<!--we want multi threaded if we want to ever connect in background threads, this is default if not set anyways in CommonsHttpInvokerRequestExecutor but since we are overriding we have to manually set it or we get the simple one-->
<bean class="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager"></bean>
</constructor-arg>
<property name="params">
<bean class="org.apache.commons.httpclient.params.HttpClientParams">
<!--Here we set the socket time out and connection manager time out which is how long we wait for the socket to connect before showing bad feedback.
The default is 60 seconds which makes the client just hang. Now we get immediate response from our RetryConnection-->
<property name="soTimeout" value="2000"/>
<property name="connectionManagerTimeout" value="2000"/>
</bean>
</property>
</bean>
</property>
</bean> </property>
</bean>
<bean id="myServiceMgr" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="interceptorNames">
<list>
<value>clientExceptionAdvisor</value>
<value>retryConnection</value>
<value>myServiceInterceptor</value>
</list>
</property>
<property name="proxyInterfaces">
<value>ServiceIF</value>
</property>
</bean>
**更新解决方案看起来 soTimout 也是读取超时。有一种方法可以设置连接超时,但这只是一种痛苦。这是我使用的 spring xml:
<bean class="org.springframework.remoting.httpinvoker.CommonsHttpInvokerRequestExecutor">
<!--read time out is how long we will wait for a reply. This is large in case we are waiting on a long server process-->
<property name="readTimeout" value="2000000"/>
<!-- we manually set this so we can control the parameter timeout values-->
<property name="httpClient">
<bean class="org.apache.commons.httpclient.HttpClient">
<constructor-arg index="0">
<bean class="org.apache.commons.httpclient.params.HttpClientParams">
<!--Here we set the connection manager time out which is supposed to be how long we wait for the established connection to be returned from the connection manager. This shortness allows us to catch it and enable the retry function.-->
<property name="connectionManagerTimeout" value="2500"/>
</bean>
</constructor-arg>
<constructor-arg index="1">
<!--we want multi threaded if we want to ever connect in background threads, this is default if not set anyways in CommonsHttpInvokerRequestExecutor but since we are overriding we have to manually set it or we get the simple one-->
<bean class="org.apache.commons.httpclient.MultiThreadedHttpConnectionManager">
<property name="params">
<bean class="org.apache.commons.httpclient.params.HttpConnectionManagerParams">
<!--Here we set the socket time out which is essentially the same thing as the readTimeout. It is the time we wait for a response-->
<property name="soTimeout" value="2000000"/>
<!--Here we set the connection time out which is supposed to be how long we wait for the connect to be established. This shortness allows us to catch it and enable the retry function. The default is 60 seconds which makes the client just hang. -->
**<property name="connectionTimeout" value="2500"/>**
</bean>
</property>
</bean>
</constructor-arg>
<property name="params">
<bean class="org.apache.commons.httpclient.params.HttpClientParams">
<!--Here we set the socket time out which is essentially the same thing as the readTimeout. It is the time we wait for a response-->
<property name="soTimeout" value="2000000"/>
<!--Here we set the connection manager time out which is how long we wait to get an established connection returned from the connection manager.
The default is 60 seconds which makes the client just hang. Now we get more immediate response from our RetryConnection. But it isn't totally reliable cause of underlying tcp/ip-->
**<property name="connectionManagerTimeout" value="2500"/>**
</bean>
</property>
</bean>
</property>
</bean>
最佳答案
您无法设置最大请求持续时间。 This有一些有用的信息。
通常对于 http 连接,无论连接类型如何,都应该具有相同的超时。在不同的点对同一件事进行多次计数是没有意义的。
您应该将 API 设置为预先运行报告,或者在不会锁定调用者的不同线程上运行。通过这种方式,您可以获得一个状态对象,让您知道是否需要再次检查报告。
关于java - HttpClient 超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17606827/
我看到很多人发布关于 NullInjectorError: No provider for HttpClient! 的问题但是我在 Karma 单元测试中遇到了更具描述性的错误。我一直在学习 Angu
全部, 我创造: public static final HttpClient DEFAULT_HTTPCLIENT = HttpClients .createDefault(); f
我正在使用 HttpClient fluent api 编写验收测试,但遇到了一些麻烦。 @When("^I submit delivery address and delivery time$")
有人可以分享如何配置现代 HttpClient 4.5.3 以重试失败的请求并在每次重试前等待一段时间吗? 到目前为止,我似乎正确理解了 .setRetryHandler(new DefaultHtt
我在使用 java 中的 HttpClient 库时遇到问题。 目标网站在 SSL ( https://www.betcris.com ) 上,我可以从该网站加载索引页面就好了。 但是,显示不同运动赔
所以我的应用涉及大量网络调用(可能连接到 10 个不同的服务器)和获取数据。从我读过的几篇文章中,建议重用 HTTPClient 实例,因为它可以防止资源(套接字等)的浪费。但是我发现围绕可扩展且健壮
我正在调用一个外部 API,并希望我的 API 可以进行单元测试。为此,我正在尝试包装 HttpClient。我现在只需要一种方法。 这是我的界面。 public interface IHttpCli
出于调试目的,我希望看到将要发送的原始请求。有没有一种方法可以直接从 HttpPost 或 HttpClient 的API中获得没有HTTP监视器的信息? 我发现了一些“几乎”重复的问题,但不是针对这
我正在尝试在小型 WebAssemply 应用程序(使用 .NET 5 创建)中测试 HttpClient。program.cs 包含以下语句来添加 HttpClient 服务: builder.Se
我在 Application_Start 事件中创建了 HttpClient 的单个实例,以便在 Global.asax.cs 中的应用程序中重用 应用程序启动中的代码: protected
我对此有点新手...基本上我需要运行一个脚本来从谷歌趋势下载.csv 文件。我按照这个reference写了下面的代码,代码如下: HttpClient client = new Defau
我正在尝试实现一个基本的 1 spout - 1 bolt Storm 拓扑。我有一个 Storm Bolt,可以使用 Apache HttpClient (4.3.1) 发出 HTTP 请求。但是,
我正在尝试在我的 Xamarin.Forms 移动应用程序中使用 HttpClient 创建网络服务层。 没有单例模式 单例模式 在第一种方法中,我在每个新请求中创建新的 http 客户端对象通过移动
在下面的示例中,我创建了一个 Java 11 httpClient,然后创建了多个并发 HttpRequest。 这是不好的做法吗? 每个 HttpRequest 都应该有自己的 HttpClient
我正在开发一个 Drupal 8 自定义模块。我在任何节点类型中都有两个字段(url 和文本 html 字段)。这是该模块所期望的功能: 该模块将抓取“url字段”的页面并复制html代码以将它们粘贴
我正在为 httpclient 使用 apache httpcompnonents 库。我想在多线程应用程序中使用它,其中线程数会非常高,并且会有频繁的 http 调用。这是我用来在执行调用后读取响应
最近我将我的代码库从 .net core 1.0 迁移到 2.0 。之后,我随机收到错误 “使用 System.Net.Http.HttpClient 时服务器返回无效或无法识别的响应错误”。我在 1
我有该代码: while(!lastPage && currentPage < maxPageSize){ StringBuilder request = new Strin
我的应用程序使用 Apache HTTPClient 4.3.5 发送 HTTP 请求并获得响应。 我想弄清楚应用程序收到了什么响应。 以下是日志片段- [Jan 04 2015 05:38:14.1
如何从 HttpClient 类型的现有对象获取 cookie? 我正在使用 HttpClient 版本 4.3.3,它不再有方法 httpClient.getCookieStore() 了。 最佳答
我是一名优秀的程序员,十分优秀!