Участниками транзакции с точки зрения JTA являются: ресурс, под которым понимается соединение с базой данных; менеджер ресурсов – драйвер JDBC;сервер приложений – Сервер EJB;менеджер транзакций и транзакционное приложение, т.е. компонент или клиент.
Управлять транзакциями может как компонент, так и контейнер.
Транзакция, управляемая компонетом (Bean Managed Transaction, BMT)
Управление транзакцией берет на себя компонент. Только Session-компоненты могут использовать такой режим. Только в этом режиме вызов одного из удаленных методов может привести к началу транзакции, но не обязательно к ее завершению – несколько последующих вызовов могут происходить в контекст этой же транзакции.
Транзакция, управляемая Контейнером (Container Managed Transaction, CMT)
Режим разрешен как для Session-, так и для Entity-компонентов. Компонент не имеет возможности ни начать, ни завершить транзакцию (хотя любой из участников транзакции может потребовать ее отката (rollback) при завершении) – управление транзакцией полностью берет на себя Контейнер. Транзакция начинается при вызове каждого удаленного метода и завершается при возврате из него. Программист может установить один из нескольких разрешенных режимов, определяющих поведение транзакции.
Доступ к компонентам EJB из различных приложений клиента (web, Console, GUI)
Когда у клиента EJB возникает потребность воспользоваться услугами EJB, он с помощью home-интерфейса создаёт EJB. Клиент использует один из методов create(), которые определяет home-интерфейс. Реализация home-интерфейса осуществляется с помощью объекта, называющегося home-объектом. Экземпляр такого home-объекта создаётся на сервере и в качестве factory (построителя) предоставляется клиенту для создания бина.
Пример разработки клиентского приложения
Первое, что должно выполнить клиентское приложение - это получить доступ к home-интерфейсу для Компонента SortBean. Делается это с помощью вызова методов JNDI API. Как показано в Примере SortClient создает контекст имен JNDI, а затем использует его метод lookup для поиска home-интерфейса для "sort":
Пример: Фрагмент кода SortClient
// SortClient Java
public class SortClient {
public static void main(String[] args) throws Exception
// Получение контекста JNDI с помощью JNDI службы Указания Имен:
{ javax.naming.Context context; //переменная контекста
{ // get a JNDI context using the Naming service
context = new javax.naming.InitialContext(); }//получить контекст JNDI
// Поиск Домашнего интерфейса в службе JNDI Naming:
Object objref = (SortHome) context.lookup("sort");
// Приведение удаленного объекта к домашнему итерфейсу:
SortHome home = (SortHome) javax.rmi.PortableRemoteObject.narrow(objref, SortHome.class);
// Создание удаленного объекта из домашнего интерфейса:
Sort sort = home.create(); ... //do the sort and merge work sort.remove();
// Далее вызов методов sort () и/или merge ()
После получения ссылки на интерфейс SortHome, клиент может вызвать его метод create () для получения ссылки на remote-интерфейс Sort. Получив эту ссылку, клиент может вызывать его методы sort () и merge () так же, как он мог бы обращаться к любым другим методам. На самом деле remote-интерфейс перенаправляет вызовы клиента собственно Компоненту EJB.