Как установить время ожидания вызова веб-службы в JAVA? - PullRequest
2 голосов
/ 16 мая 2019

Здравствуйте, я должен обновить приложение в своей компании, поэтому мне нужно добавить тайм-аут при вызове веб-службы клиента (у меня есть только советы о фреймворке Spring). Как я могу это сделать?

У меня есть приложение, которое может вызывать веб-службы некоторых клиентов, и я должен добавить тайм-аут, когда приложение выбирает, какую веб-службу оно должно вызывать.

Я занимался исследованиями весенних аннотаций и других вопросов, касающихся времени ожидания в JAVA. Большинство решений состоит в том, чтобы установить тайм-аут непосредственно в вызове SOAP / REST, но я не добился успеха с этими решениями. Кроме того, я должен сделать тайм-аут намного выше / раньше в коде. А также, все веб-службы клиента имеют разные способы вызова (аутентификация или нет, идентификатор токена ...).

Вот подсказка кода, которая выбирает веб-службу клиента для вызова и вызывает метод «findSubscriber» для вызова реализации клиента, который будет вызывать веб-службу с использованием нашего Технического кирпича. Подписчик - это человек, которому что-то нужно. И там много подписчиков на одного клиента. И мы работаем для многих клиентов.

...
@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 секунд, я пытаюсь найти абонента в нашей базе данных. Но на самом деле я вызываю клиентский веб-сервис, и если он не отвечает, я отправляю сообщение об ошибке. Я думаю, что я должен сделать тайм-аут на объекте "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!");
        }   
    }
}

Результат:

Начало .. Тайм-аут!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...