Здравствуйте, я должен обновить приложение в своей компании, поэтому мне нужно добавить тайм-аут при вызове веб-службы клиента (у меня есть только советы о фреймворке 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!");
}
}
}
Результат:
Начало ..
Тайм-аут!