调用别人提供的服务的时候没有设置超时程序被卡住了怎么办?,如何模拟超时的情况?...

本文介绍了一个定时任务因未设置读操作超时时间而导致线程阻塞的问题及解决方案,通过设置JDK参数避免无限等待,并使用iptables模拟服务器端超时,确保程序异常处理的正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我们有个定时任务会每天去请求一下别人提供的webservice来拿到今天签署的合同的数据,某天早上巡检服务器的时候,发现定时任务没有执行,通过dump线程的状态,发现执行这个定时任务的线程被阻塞住了
407044-20190127144415264-1374789118.jpg

阻塞的原因是读操作的超时时间没有设置,默认值是-1 导致了客户端一直等待,然后程序一直阻塞

解决的方法也很简单,参照jdk的文档我们可以在启动参数上加上超时的相关的属性

-Dsun.net.client.defaultConnectTimeout=10000
-Dsun.net.client.defaultReadTimeout=10000 

但是这里又会遇到一个问题:怎样确定这些参数生效了,也就是说怎样模拟服务器端超时的情况,毕竟服务器端不会每次都超时

针对这种情况,我们可以使用iptables来丢弃掉服务器端的相关端口返回的SYN包或者数据包,来模拟连接超时和读数据超时的情况

我们以百度为例,模拟weget访问百度的时候的超时情况

用到的两个wget的参数:

-T 设置以秒为单位的超时时间
-t 则是设置重试的次数

DROP掉百度返回的连接的建立连接的握手数据包:

iptables -A INPUT -p tcp -m tcp -s baidu.com --tcp-flags SYN SYN --sport 80 -j DROP

407044-20190127151433474-626507502.jpg

清除掉上一个规则,DROP掉百度返回的传输数据的数据包:

因为iptables的INPUT链里里只设置了这一条规则,所以直接根据行号为1来DROP即可

iptables -D INPUT 1

iptables -A INPUT -p tcp -m tcp -s baidu.com --tcp-flags PSH PSH --sport 80 -j DROP

407044-20190127151731357-1306720272.jpg

通过这种方式,将我们的定时任务的程序请求的webservice的服务器返回的数据包也做这样的处理,这样就可以测试超时之后的情况了

模拟连接超时之后程序的报错信息:
407044-20190128105902641-1190972827.jpg

读超时:
407044-20190128105929615-1260884558.jpg

程序记录超时之后抛出的异常再做相应的处理即可(比如将这次失败的定时任务写入数据库,下次再继续尝试等)不会再阻塞线程影响其他任务的执行了

转载于:https://www.cnblogs.com/jiaoyiping/p/10326714.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值