обработка вызовов http из транзакции EJB - PullRequest
0 голосов
/ 28 марта 2012

Это код, который у меня есть:

// * 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. Ответ должен возвращаться конечному пользователю, и я не могу заставить конечного пользователя ждать вечно.

Я могу справиться с этой ситуацией двумя способами:

  1. переместите method2 в EJB и поместим TransactionAttributeType.NEVER, чтобы вызов http не находился в транзакции, и транзакция method1 не ожидает его. В этом случае контейнер управляет транзакцией метода method1 и не обновляет базу данных и возвращает null, если он не получил ответ от method2. Как долго транзакция метода method1 ожидает "возврата"?

  2. я могу использовать аннотацию JBoss и поместить TransactionTimeout в 2 минуты на method1 (): в этом случае, если вызов http не завершится в течение 2 минут, method1 может вернуть ноль и не обновлять БД.

Какой из этих двух методов целесообразен и надежен? Спасибо за ваши идеи.

1 Ответ

0 голосов
/ 02 апреля 2012
  1. Когда вы используете TransactionAttributeType.NEVER, транзакция не распространяется дальше.Вы можете использовать аннотацию @Asynchronous для метода, который возвращает Future<V> объект.Затем вы можете вызвать get(timeout, unit) на объекте, чтобы получить тип результата V, который ожидает заданного времени для манипуляции, но это зависит от EJB-3.1.аннотация @TransactionTimeout на уровне метода или класса.Также можете настроить его в jboss.xml или jboss-service.xml в зависимости от версии вашего сервера.Это будет хорошо с EJB-3.0, но потеряет переносимость приложения.

...