我知道获取URL的套接字超时固定为60秒。
我使用java.util.logging
,在调用https
函数之前,我会记录以下内容:
2012-03-27 14:46:15.445 TelenorClient更改模拟状态:尝试1
5秒后出现异常
2012-03-27 14:46:2.1997 TelenorClient changeSimStatus:exception java.net.SocketTimeoutException:获取时超时:https://serviceportal...
我使用的是基于JAX-WS的Web服务客户端,根据以下消息,不允许使用BindingProviderProperties和RequestContext设置超时:
com.sun.xml.internal.ws.client.BindingProviderProperties不受谷歌应用引擎Java运行时环境的支持
这与谷歌应用引擎有自己的超时设置方式的第一句话相对应。但对我来说,这似乎比60秒短得多。
我正在寻找如何解决这个问题的技巧。
URL获取服务(由您的JAX-WS客户端使用)的超时时间限制为5秒。您可以通过setConnectTimeout()
将其延长至最长60秒。对于更多(最多10分钟),您必须通过任务队列或Cron执行它。
更新:
如果您的JAX-WS客户端不允许您访问连接,那么您可以尝试在任务队列上执行整个JAX-WS调用。这是通过DeferredTask
最容易做到的。
我从Mitch Rudminer那里得到了这个提示;只需使用常量的文本值。
Map<String, Object> context = ((BindingProvider) service).getRequestContext();
context.put("com.sun.xml.ws.request.timeout", 60*1000);
context.put("com.sun.xml.ws.connect.timeout", 10*1000);
看起来它正在工作:
2012-07-03 14:26:45.604com.simservices.bus.kpdata.DataDetailsServlet getDetailData:2012-04-01-8931084711061420005
2012-07-03 14:26:56.183com.simservices.bus.kpdata.DataDetailsServlet getDataUsage:获取对KPN 数据的响应
2012-07-03 14:27:33.619com.simservices.bus.kpdata.DataDetailsServlet getDataUsage:detailsList有4612个元素
2012-07-03 14:27:36.540com.simservices.bus.kpdata.DataDetailsServlet getDataUsage:已添加4612个数据元素