EJB 3.1 принес новую @Asynchronous
функцию , которой вы можете воспользоваться:
@Asynchronous
@TransactionAttribute(NOT_SUPPORTED)
public Future<WebServiceResult> callWebService(int retries) {
WebServiceResult result = webService.call();
if (!result.equals(BUSY)) {
return result;
}
if (retries <= 0) {
throw new TooBusyException();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
return callWebService(retries - 1);
}
Затем просто позвоните вам через веб-службу:
Future<WebServiceResult> result = yourEJB.callWebService(1);
// Can do some interesting stuff here.
// ...
// ...
result.get(2, SECONDS); // Block for up to 2 seconds.
Как видите, вы получаете настраиваемое количество повторных попыток и время ожидания бесплатно.
Чем это отличается от простого вызова Thread.sleep()
?Возвращение Future
является более явным и управляемым.Также я не думаю, что Thread.sleep()
это вредно.Единственная проблема заключается в том, что этот экземпляр EJB теперь может больше использоваться другими клиентами.С Future
асинхронный вызов происходит внутри некоторого другого EJB и пула потоков.Что касается важности Thread#interrupt()
внутри блока catch, обратитесь к Зачем вызывать Thread.currentThread.interrupt () при перехвате любого исключения InterruptException?
Другая идея: использовать аспект вокруг вызова веб-службы, catchBusyException
один раз и повторите попытку.