如何在JAVA中设置Web服务调用的超时?
您好,我必须更新我公司的一个应用程序,所以我必须在调用客户机的web服务时添加一个超时(我有一些关于FrameworkSpring的提示)。我该怎么做 我有一个可以调用某些客户机Web服务的应用程序,我必须添加一个超时,让应用程序选择要调用的Web服务 我研究了Spring注释,以及JAVA中有关超时的其他内容。大多数解决方案都是直接在SOAP/REST调用上设置超时,但我没有成功地使用这些解决方案。此外,我必须在代码中更高/更早地执行超时。而且,所有客户端的web服务都有不同的调用方式(身份验证与否、令牌id…) 下面是选择调用哪个客户机的web服务的代码提示,并调用方法“findSubscriber”来调用将使用我们的技术砖调用web服务的客户机实现。订阅者是需要某种东西的人。一个客户端有很多订户。我们为很多客户工作如何在JAVA中设置Web服务调用的超时?,java,spring,web-services,timeout,futuretask,Java,Spring,Web Services,Timeout,Futuretask,您好,我必须更新我公司的一个应用程序,所以我必须在调用客户机的web服务时添加一个超时(我有一些关于FrameworkSpring的提示)。我该怎么做 我有一个可以调用某些客户机Web服务的应用程序,我必须添加一个超时,让应用程序选择要调用的Web服务 我研究了Spring注释,以及JAVA中有关超时的其他内容。大多数解决方案都是直接在SOAP/REST调用上设置超时,但我没有成功地使用这些解决方案。此外,我必须在代码中更高/更早地执行超时。而且,所有客户端的web服务都有不同的调用方式(身份验
。。。
@凌驾
public Research Return FindSubscriber(Research元素Research元素)抛出SubscriberException{
ResearchReturn=null;
试一试{
字符串countryCode=researcheElements.getCountryCode();
字符串clientCode=researcheElements.getClientCode();
//[一些测试和事情…]
//我们根据countryCode和clientCode获得客户机的实现方式
FindSubscriberService=(FindSubscriberService)getService().getRoute(countryCode,clientCode,“FindSubscriberService”);
做{
//根据“服务”中的方式调用客户端实现
rReturn=服务。查找订阅方(研究要素);
List subs=subsFilter(researcheElements.getResearchCriteria(),rReturn.getSubscribers());
[...]
}而([…]);
[...]
}捕获(非dispoexception nde){
[...]
}捕获(下标异常e){
[...]
}捕获(例外e){
[...]
}
回程;
}
...
因此,我希望调用一个web服务,如果该服务在10秒后没有应答,我将尝试在数据库中查找订户。但实际上我调用了一个客户端web服务,如果它没有应答,我会发送一条错误消息。我想我必须对对象“rReturn”执行超时。(对不起,我的英语不好)
谢谢你的帮助
编辑:我得到了一个新的提示,我可能是可以设置在春季设置超时
编辑:我使用FutureTask
package com.sdzee.beans;
导入java.util.concurrent.Callable;
导入java.util.concurrent.ExecutionException;
导入java.util.concurrent.FutureTask;
导入java.util.concurrent.TimeUnit;
导入java.util.concurrent.TimeoutException;
公开课考试{
公共静态void main(字符串[]args)引发InterruptedException、ExecutionException{
FutureTask timeoutTask=null;
试一试{
timeoutTask=newfuturetask(newcallable()){
@凌驾
公共字符串调用()引发异常{
Thread.sleep(4000);//只是演示一个长时间运行的4秒任务。
返回“准备好!”;
}
});
System.out.println(“已启动…”);
新线程(timeoutTask).start();
//这里我们调用方法call()
System.out.println(timeoutTask.get(3L,TimeUnit.SECONDS));
System.out.println(“完成!”);
}捕捉(中断异常e){
}捕获(执行例外){
}捕获(超时异常e){
//终止线程
timeoutTask.cancel(true);
System.out.println(“超时!”);
}
}
}
结果:
开始。。
暂停 将调用包装到
FutureTask
中,并使用超时版本的get()
?也许您可以使用Netflix Hystrix:之类的库,这将为您提供一个断路器,您可以在配置中设置超时并设置回退方法。当您使用RESTAPI时,您的bean中难道没有HttpRequests工厂吗?您可以在那里设置一个超时,因为您似乎试图从另一个线程中断正在等待的线程(调用服务的线程)。也许这篇帖子会有所帮助:@AlexLiesenfield谢谢我会看看这个