В настоящее время я разработал исходящий адаптер 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 по-прежнему не хочет возвращать соединения в пул.В настоящее время я получаю следующие события в журналах:
- LOCAL_TRANSACTION_STARTED
- CONNECTION_CLOSED
- LOCAL_TRANSACTION_COMMITTED
Это выглядит нормально для меня (событие CONNECTION_CLOSзначит приложение закрыло соединение, я добавил метод close, который отправляет это событие).Фиксация прошла успешно и никаких исключений не появляется.Похоже, что я отправил события в правильном порядке (ранее WebLogic генерировал исключения, но теперь прекращает это делать), но сервер по-прежнему не возвращает соединения в пул.
Я в замешательстве.