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

时间:2019-05-16 09:11:44

标签: java spring web-services timeout futuretask

您好,我必须在公司中更新一个应用程序,因此必须在调用客户端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!");
        }   
    }
}

结果:

已开始。 超时!

0 个答案:

没有答案