您好,我必须在公司中更新一个应用程序,因此必须在调用客户端Web服务时添加超时(我只有关于Spring框架的提示)。我该怎么办?
我有一个可以调用某些客户端的Web服务的应用程序,并且我必须添加一个超时,以便该应用程序选择必须调用的Web服务。
我完成了有关Spring注释的研究,以及有关JAVA中超时的其他事情。大多数解决方案都是直接在SOAP / REST调用上设置超时,但是这些解决方案我还没有成功。另外,我必须在代码中更高/更早地执行超时。而且,所有客户端的Web服务都具有不同的调用方式(身份验证与否,令牌ID ...)。
此处是代码提示,它们选择了要调用哪个客户端的Web服务,并调用方法“ findSubscriber”来调用将使用我们的Technical Brick调用Web服务的客户端的Implementation。订户是需要某些东西的人。一个客户有很多订户。我们为很多客户服务。
...
@Override
public ResearchReturn findSubscribers(ResearcheElements researcheElements) throws SubscriberException {
ResearchReturn rReturn = null;
try {
String countryCode = researcheElements.getCountryCode();
String clientCode = researcheElements.getClientCode();
// [Some tests and things...]
// We get the way of the client's Implementation depending the countryCode and clientCode
findSubscribersService service = (findSubscribersService) getService().getRoute(countryCode, clientCode, "findSubscribersService");
do {
// Call of the client's Implementation depending of the way that is in "service"
rReturn = service.findSubscribers(researcheElements);
List<Subscribers> subs = subsFilter(researcheElements.getResearchCriteria(), rReturn.getSubscribers());
[...]
} while ([...]);
[...]
} catch (NonDispoException nde) {
[...]
} catch (SubscriberException e) {
[...]
} catch (Exception e) {
[...]
}
return rReturn;
}
...
因此,我希望调用网络服务,如果该服务在10秒钟后仍未应答,我会尝试在我们的数据库中找到订户。但是实际上我调用了客户端Web服务,如果没有应答,我会发送一条错误消息。我想我必须对对象“ rReturn”执行超时。 (对不起,我的英语不好。)
感谢您的帮助。
编辑:我有了新的提示,也许可以在Spring设置中设置超时时间。
编辑:我可以使用FutureTask
package com.sdzee.beans;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
public class Test {
public static void main(String[] args) throws InterruptedException, ExecutionException {
FutureTask<String> timeoutTask = null;
try {
timeoutTask = new FutureTask<String>(new Callable<String>() {
@Override
public String call() throws Exception {
Thread.sleep(4000); // Just to demo a long running task of 4 seconds.
return "Ready!";
}
});
System.out.println("Started..");
new Thread(timeoutTask).start();
// Here we call the method call()
System.out.println(timeoutTask.get(3L, TimeUnit.SECONDS));
System.out.println("Finished!");
} catch (InterruptedException e) {
} catch (ExecutionException e) {
} catch (TimeoutException e) {
// Terminate the thread
timeoutTask.cancel(true);
System.out.println("Timeout!");
}
}
}
结果:
已开始。 超时!