Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在JAVA中设置Web服务调用的超时?_Java_Spring_Web Services_Timeout_Futuretask - Fatal编程技术网

如何在JAVA中设置Web服务调用的超时?

如何在JAVA中设置Web服务调用的超时?,java,spring,web-services,timeout,futuretask,Java,Spring,Web Services,Timeout,Futuretask,您好,我必须更新我公司的一个应用程序,所以我必须在调用客户机的web服务时添加一个超时(我有一些关于FrameworkSpring的提示)。我该怎么做 我有一个可以调用某些客户机Web服务的应用程序,我必须添加一个超时,让应用程序选择要调用的Web服务 我研究了Spring注释,以及JAVA中有关超时的其他内容。大多数解决方案都是直接在SOAP/REST调用上设置超时,但我没有成功地使用这些解决方案。此外,我必须在代码中更高/更早地执行超时。而且,所有客户端的web服务都有不同的调用方式(身份验

您好,我必须更新我公司的一个应用程序,所以我必须在调用客户机的web服务时添加一个超时(我有一些关于FrameworkSpring的提示)。我该怎么做

我有一个可以调用某些客户机Web服务的应用程序,我必须添加一个超时,让应用程序选择要调用的Web服务

我研究了Spring注释,以及JAVA中有关超时的其他内容。大多数解决方案都是直接在SOAP/REST调用上设置超时,但我没有成功地使用这些解决方案。此外,我必须在代码中更高/更早地执行超时。而且,所有客户端的web服务都有不同的调用方式(身份验证与否、令牌id…)

下面是选择调用哪个客户机的web服务的代码提示,并调用方法“findSubscriber”来调用将使用我们的技术砖调用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谢谢我会看看这个