Что мне нужно сделать, чтобы интегрировать JTA в приложение Java SE? - PullRequest
4 голосов
/ 08 мая 2009

Предположим, я хочу реализовать контейнер приложения. Не полный стек Java EE, но мне нужно предоставить доступ к ресурсам JDBC и транзакциям для стороннего кода, который будет развернут в приложении, которое я пишу.

Предположим, далее, что я смотрю на JBossTS для транзакций. На этом я не остановился, но, насколько я могу судить, это как нельзя лучше подходит для того, что мне нужно сделать.

Как интегрировать поддержку , предоставляющую ресурсы соединения и транзакции JTA, в мое приложение Java SE?

Ответы [ 7 ]

7 голосов
/ 09 мая 2009

Как мне интегрировать поддержку предоставление ресурсов подключения и JTA транзакции в мое приложение J2SE?

Привет, Крис

В этой задаче есть два элемента:

1) Создание JTA API, в основном UserTransaction, доступным для кода приложения, чтобы он мог запускать и завершать транзакции. В среде Java EE она опубликована в известном месте в JNDI. Если у вас есть реализация JNDI, то вам пора (используйте класс JNDIManager JBossTS, чтобы помочь вам с настройкой). В противном случае вам понадобится какой-то заводской объект или механизм впрыска. Конечно, вы также можете предоставить класс реализации непосредственно конечному пользователю, но это несколько неприятно, так как ограничивает любые шансы на замену JTA в будущем.

public javax.transaction.UserTransaction getUserTransaction() {
  return new com.arjuna.ats.internal.jta.transaction.UserTransactionImple();
}

Вот и все - теперь вы можете начинать, фиксировать и откатывать транзакции. Некоторые контейнеры также публикуют класс TransactionManager в приложениях аналогичным образом, но он действительно предназначен для использования самим контейнером и редко требуется для кода приложения.

2) Автоматическое управление зачислением XAResources. Менеджеры ресурсов, то есть базы данных и очереди сообщений, имеют драйверы, которые реализуют XAResource. Каждый раз, когда приложение получает соединение с менеджером ресурсов, соответствующий XAResource должен быть передан реализации JTA, чтобы он мог управлять менеджером ресурсов как часть 2PC. Большинство серверов приложений поставляются с JCA, который обрабатывает это автоматически. В средах без них вам нужна альтернатива, чтобы уберечь код приложения от необходимости выполнять эту утомительную задачу вручную. TransactionalDriver в комплекте с JBossTS обрабатывает это для соединений JDBC. XAPool также стоит рассмотреть.

JBossTS был внедрен во многих средах на протяжении многих лет. Некоторые из извлеченных уроков описаны в Руководстве по интеграции http://anonsvn.jboss.org/repos/labs/labs/jbosstm/trunk/atsintegration/docs/], и если вы хотите рабочий пример, вы можете посмотреть на работу по интеграции tomcat http://anonsvn.jboss.org/repos/labs/labs/jbosstm/workspace/jhalliday/tomcat-integration/]

ТМ JBoss ужасен. По крайней мере, если вы надеетесь на ACID транзакции.

Привет, Эриксон

Я не думаю, что зашел бы так далеко, как "ужасный". Он невероятно мощный и легко конфигурируемый, что может сделать опыт из коробки немного пугающим для новичков. Корректная конфигурация восстановления особенно сложна, поэтому я полностью поддерживаю ваш комментарий о тщательном тестировании. Кроме того, мне неизвестны какие-либо задокументированные тестовые случаи, в которых в настоящее время не удается получить результаты ACID при использовании с совместимыми со спецификацией менеджерами ресурсов. Если у вас есть такой случай или просто более конструктивные предложения по улучшению, сообщите об этом JBoss, чтобы решить эту проблему.

Не изобретай велосипед. Использовать Spring Framework. Это уже обеспечивает эта функциональность и многое другое.

-1 Spring не предоставляет реализацию JTA, просто оболочку для различных сторонних приложений. Это распространенное недоразумение.

JTA поддерживает локальные транзакции и глобальные транзакции.

Еще одно заблуждение, я боюсь. Спецификация JTA имеет дело только с XA, то есть глобальными транзакциями. Существуют различные хорошо известные методы для того, чтобы заставить менеджер транзакций JTA управлять локальными транзакциями. Обычно это включает в себя соединение Connection в XAResource. Хотя большинство реализаций поддерживают это, на самом деле это выходит за рамки спецификации, и поэтому вам следует проконсультироваться с поставщиком, прежде чем выбирать реализацию JTA, если вам нужно такое поведение.

3 голосов
/ 30 мая 2009

Попробуйте Atomikos TransactionsEssentials .

В отличие от конкурирующих реализаций JTA / XA с открытым исходным кодом, этот был написан с самого начала для JSE. Следовательно, он предлагает премиальные пулы JDBC и JMS, а также функциональность JTA / XA, и вам будет очень легко интегрироваться в ваши приложения.

Лучший Guy

2 голосов
/ 19 мая 2010

"ТМ JBoss ужасен. По крайней мере, если вы надеетесь на ACID-транзакции. Лучшее, что можно сказать об этом, - это то, что он, вероятно, не испортится, если не столкнется с какими-либо сбоями. И это не одиноко ... большинство менеджеров транзакций (даже некоторые коммерческие) действительно не работают. "

Не уверен, какую домашнюю работу вы сделали, чтобы сделать вышеупомянутое утверждение, но JBossTS (TM в JBoss с 2006 года, когда он был приобретен) действительно обеспечивает полную семантику ACID. Первоначально он также был частью пакета HP NetAction, где он был развернут в большем количестве критически важных приложений, чем любые другие TM с открытым исходным кодом.

2 голосов
/ 08 мая 2009

JTA поддерживает локальные транзакции и глобальные транзакции .

Локальные транзакции могут быть легко обработаны Spring, JPA или даже ручной фиксацией соединений.

Глобальные транзакции ТРЕБУЕТСЯ координатор транзакций. Это отдельный продукт / библиотека, которая недоступна в открытом исходном коде (или, по крайней мере, я об этом не знаю).

Итак, если я посмотрю на заголовок вашего поста ("JTA"), ответ будет: НЕТ ПРОСТОГО ПУТИ .

Если бы я сам прочитал ваше сообщение («предоставлю доступ к ресурсам и транзакциям JDBC»), я бы сказал, что Spring, JPA и Hibernate - все это удовлетворит ваши потребности (как я их понял).

P.S. Исправление : JTA не на самом деле не поддерживает локальные транзакции (как люди указали мне), но случай, когда вам нужно только одно соединение, по сути, является локальной транзакцией, даже если она контролируется JTA, особенно когда Transaction Manager находится в той же JVM (как это часто бывает).

2 голосов
/ 08 мая 2009

Вы можете использовать Spring, хотя я не настолько заинтересован.

Пример того, что вы могли бы хотеть, это здесь

2 голосов
/ 08 мая 2009

Не изобретай велосипед. Используйте Spring Framework . Это уже обеспечивает эту функциональность и многое другое.

1 голос
/ 30 мая 2009

Я решил использовать Bitronix Transaction Manager для решения этой проблемы, хотя, по-видимому, есть по крайней мере еще один вариант, который мне не был очевиден в то время (Atomikos).

Чтобы решить эту проблему, мне пришлось использовать внутрипроцессного JNDI-провайдера Tomcat, чтобы связать транзакцию с именем JNDI. Из-за ограничений этого провайдера я не мог использовать имя по умолчанию для транзакции пользователя JTA, что не сразу видно из документации.

Спасибо всем за полезные ответы в любом случае!

...