Жизненный цикл JCA ManagedConnection - PullRequest
2 голосов
/ 20 марта 2012

В настоящее время я разработал исходящий адаптер JCA (с поддержкой LocalTransaction), и у меня возникли некоторые проблемы с управлением соединением.Мой адаптер работает хорошо, за исключением того, что сервер (WebLogic 12c) не помещает ManagedConnections обратно в пул.Согласно JavaDoc, сервер должен вызвать ManagedConnection.cleanup(), чтобы повторно инициализировать соединение и вернуть его в пул, но это не так.

Когда я использую адаптер из EJB, сервер создает новое ManagedConnection, начинает новую транзакцию, фиксирует ее, но не вызывает метод ManagedConnection.cleanup() и не возвращает его в пул.

Ниже вы можете увидеть мой тестовый компонент:

@Stateless(mappedName = "TestingBean")
@Local(value = TestingBeanLocal.class)
@Remote(value = TestingBeanRemote.class)
@TransactionManagement(value = TransactionManagementType.CONTAINER)
@TransactionAttribute(value = TransactionAttributeType.REQUIRES_NEW)
public class TestingBean implements TestingBeanCommon{

@Resource(mappedName = "eis/myJCA")
private MyDataSource dataSource;

@Override
public void performTestAction(String param1, String param2) {
    MyConnection connection = dataSource.getMyConnection();
    connection.performAction(ActionFactory.getSomeAction(param1, param2));
}
}

После 10 вызовов я получаю следующее:

Получил начальный контекст javax.ejb.EJBException: EJB Exception:;Вложенное исключение: java.lang.RuntimeException: javax.resource.spi.ApplicationServerInternalException: невозможно получить соединение для pool = "eis / myJCA", weblogic.common.resourcepool.ResourceLimitException: настроен максимальный предел (0) для числапотокам разрешено ожидать достижения ресурса для пула eis / myJCA

Как вы заметили, он использует новую транзакцию для каждого вызова (атрибут REQUIRES_NEW).Сервер сначала создает новый экземпляр ManagedConnection, а затем пул соединений достигает максимальной емкости.

Из трассировки журналов видно, что не происходит ни одного отдельного вызова ManagedConnection.cleanup() и каждое соединение в пуле занято,Я прочитал спецификацию JCA и обнаружил, что адаптер может отправлять события жизненного цикла слушателям, используя функции обратного вызова, но любая попытка использовать эти обратные вызовы слушателей событий заканчивалась новым исключением:

javax.ejb.EJBException: BEA1-001471C1E76DE5A4E067;вложенное исключение: weblogic.transaction.nonxa.NonXAException: java.lang.IllegalStateException: [Connector: 199175] Это ManagedConnection управляется контейнером для его транзакционного поведения и было зачислено в транзакцию JTA контейнером;Приложение / адаптер не должны вызывать локальную транзакцию API start / commit / rollback.Отклонить событие LOCAL_TRANSACTION_COMMITTED от адаптера.javax.ejb.EJBException: EJB Exception:;вложенное исключение: java.lang.IllegalStateException: [Connector: 199175] Это ManagedConnection управляется контейнером для его транзакционного поведения и было зачислено в транзакцию JTA контейнером;Приложение / адаптер не должны вызывать локальную транзакцию API start / commit / rollback.Отклонить событие LOCAL_TRANSACTION_ROLLEDBACK от адаптера.

Я полагаю, что WebLogic не ожидает какого-либо события (возможно, я отправил неправильное?).

Итак, что я делаю не так?Как заставить сервер устанавливать подключения обратно в пул?

UPD: Я обнаружил, что события подключения очень важны для сервера.Сервер управляет соединениями на основе информации о событиях, которые были отправлены слушателям, которые он регистрирует в ManagedConnection.Теперь я поддерживал события в моем адаптере, но WebLogic по-прежнему не хочет возвращать соединения в пул.В настоящее время я получаю следующие события в журналах:

  1. LOCAL_TRANSACTION_STARTED
  2. CONNECTION_CLOSED
  3. LOCAL_TRANSACTION_COMMITTED

Это выглядит нормально для меня (событие CONNECTION_CLOSзначит приложение закрыло соединение, я добавил метод close, который отправляет это событие).Фиксация прошла успешно и никаких исключений не появляется.Похоже, что я отправил события в правильном порядке (ранее WebLogic генерировал исключения, но теперь прекращает это делать), но сервер по-прежнему не возвращает соединения в пул.

Я в замешательстве.

1 Ответ

2 голосов
/ 20 марта 2012

Кажется, я решил эту проблему.Когда я посмотрел в консоли WebLogic, я обнаружил, что экземпляры ManagedConnection имеют -1 активных обработчиков.Поэтому я решил прокомментировать вызов метода MyConnection.close(), который я добавил в свой тестовый компонент для отправки события CONNECTION_CLOSED.После того, как эти изменения были сделаны, пул соединений начал работать отлично.Я попытался изменить мой тестирующий компонент и установить для его атрибута транзакции значение NOT_SUPPORTED.После этого ManagedConnections в пуле был 1 активный обработчик.Поэтому я положил обратно MyConnection.close() строку и пул соединений снова начал работать.

Я предполагаю, что отправка события CONNECTION_CLOSED неверна в случае распространения транзакции.Также я предполагаю, что метод ManagedConnection.close(), который отправляет событие CONNECTION_CLOSED, должен использоваться в случае одной транзакции.Но мне кажется странным, что WebLogic не хочет очищать ManagedConnections и возвращать их обратно для извлечения, если у них отрицательное количество активных обработчиков.

Большое спасибо за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...