ExecutorService超时响应问题
基本的场景是这样的:
一个上游请求进来,我们需要同时向外部合作平台(N个)发起N个请求,同时需要在一定时间内得到响应,若超时则弃用。同时将这些响应选择回应给最初的上游请求。
所以选择使用ExecutorService,用
得到执行结果;同时http请求也设置了超时参数:
在并发不高的情况下,程序没有问题。但在并发达到1000左右的时候,程序就出问题了。具体表现为:
在设置了TIME_OUT的情况下,偶尔也会出现超时但ExecutorService并没有放弃任务,并在大于TIME_OUT的时间返回执行结果。由于时效性非常高,超时的响应不但无效,而且直接影响了上游请求的响应时效。
现在困惑的是,代码都是在方法内部完成,没有共享变量,因而没有线程安全问题。那么,问题究竟出现在哪里?求解。
一个上游请求进来,我们需要同时向外部合作平台(N个)发起N个请求,同时需要在一定时间内得到响应,若超时则弃用。同时将这些响应选择回应给最初的上游请求。
所以选择使用ExecutorService,用
List<Future<Object>> result = es.invokeAll(tasks, TIME_OUT, TimeUnit.MILLISECONDS);得到执行结果;同时http请求也设置了超时参数:
urlConnection.setConnectTimeout(100);
urlConnection.setReadTimeout(100);
在并发不高的情况下,程序没有问题。但在并发达到1000左右的时候,程序就出问题了。具体表现为:
在设置了TIME_OUT的情况下,偶尔也会出现超时但ExecutorService并没有放弃任务,并在大于TIME_OUT的时间返回执行结果。由于时效性非常高,超时的响应不但无效,而且直接影响了上游请求的响应时效。
现在困惑的是,代码都是在方法内部完成,没有共享变量,因而没有线程安全问题。那么,问题究竟出现在哪里?求解。
...全文
相关推荐
java超时控制
NULL 博文链接:https://z-jls03.iteye.com/blog/1119223
Socket接受数据超时
Socket接受数据超时,采用Callable 接口实现
java代码-异步请求Zhihu和Baidu,要求先返回Baidu并截取前100个字节, 然后返回Zhihu并截取前200个字节,然后Baidu的100个字节在前,Zhihu的200个字节在后拼接起来
java代码-异步请求Zhihu和Baidu,要求先返回Baidu并截取前100个字节, 然后返回Zhihu并截取前200个字节,然后Baidu的100个字节在前,Zhihu的200个字节在后拼接起来
使用HttpURLConnection
HttpURLConnection是基于HTTP协议的,其底层通过socket通信实现。如果不设置超时(timeout),在网络异常的情况下,可能会导致程序僵死而不继续往下执行。
JAVA多线程实验,字符移动、小球碰撞
JAVA多线程实验,字符移动、小球碰撞两个实验来说明JAVA的多线程


高性能WEB开发
