Обработка метода EJB где-то зависает во время выполнения

У меня странная проблема, вот быстрый снимок системы: у меня есть веб-приложение, которое вызывает локальный компонент EJB, позволяет вызвать локальный EJB «LocalEJB», этот EJB вызывает удаленный EJB - метод «RemoteEJB», который выполняет некоторую обработку на внешней системе и возвращает результат String. Все происходит в Weblogic 8.1

Вот пример обработки:

Веб приложение:

//create reference to the local bean  
locHome = (LocalHome)ServiceLocator.getInstance().getLocalHome("ejb/localejb");

beanRef = locHome.create();  //call the bean method  
String result = beanRef.updateSmth(data.getId(),data.getRelatedIds(),Integer.valueOf(data.getState()));

//print the result  
LOG.debug("result is: " + result);

У меня включено ведение журнала для локального компонента внутри приложения ejb:

log.debug("state " + state);

res = session.updateSmth(id, relatedIds, state);

log.debug("result inside bean call: " + res);

Где «сеанс» — это ссылка на удаленный компонент.

Теперь, что происходит, запрос поступает в приложение, выполняется метод beanRef.updateSmth, этот метод вызывает внутри локального ejb, через секунду или две я вижу в файле журнала, что, например. 'результат внутри вызова bean-компонента: 0231423', что означает, что удаленный bean-компонент вернул результат, но иногда мне приходится ждать 5-6 минут, пока я не увижу результат внутри своего веб-приложения (оператор 'LOG.debug("result is: " + результат);'). Что занимает так много времени, чтобы передать результаты веб-приложению, это фиксация транзакции (локальный компонент имеет «Обязательно»)?

Я вижу в XML-файле конфигурации weblogic, что тайм-аут транзакции установлен на 1800 секунд, но действительно ли имеет значение, готовы ли результаты возвращаться сразу?


person Kris    schedule 21.07.2011    source источник
comment
извините, не смог отформатировать исходный код лучше   -  person Kris    schedule 21.07.2011
comment
Я бы предложил получить трассировку стека или использовать профилировщик или отладчик, чтобы сузить проблему. Вероятно, здесь недостаточно информации, чтобы кто-то мог решить проблему.   -  person Brett Kail    schedule 08.08.2011


Ответы (1)


Как и ожидалось, на самом деле это было вызвано контейнером, ожидающим фиксации транзакции. Запись в базе данных была заблокирована и не позволила контейнеру зафиксировать транзакцию, что привело к тайм-ауту в конце.

person Kris    schedule 16.08.2011