Это код, который у меня есть:
// * EJB 1003 *
beanclass 1{
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public String method1(){
method2();
DBupdates();
return "";
}
}
// обычный Java-класс
class 2{
method 2(){
//call which may take a long time (but dont want to wait for it to complete)
makes http calls to an external URL method();
}}
Проблема в том, что вызов Http может занять много времени. Тем не менее, ответ на вызов решает следующие шаги в method1 -> db updates and response. Ответ должен возвращаться конечному пользователю, и я не могу заставить конечного пользователя ждать вечно.
Я могу справиться с этой ситуацией двумя способами:
переместите method2 в EJB и поместим TransactionAttributeType.NEVER, чтобы вызов http не находился в транзакции, и транзакция method1 не ожидает его. В этом случае контейнер управляет транзакцией метода method1 и не обновляет базу данных и возвращает null, если он не получил ответ от method2. Как долго транзакция метода method1 ожидает "возврата"?
я могу использовать аннотацию JBoss и поместить TransactionTimeout в 2 минуты на method1 (): в этом случае, если вызов http не завершится в течение 2 минут, method1 может вернуть ноль и не обновлять БД.
Какой из этих двух методов целесообразен и надежен?
Спасибо за ваши идеи.