Читаем Изучаем Java EE 7 полностью

Чтобы применить один из этих шести атрибутов разграничения для вашего сессионного компонента, вы должны использовать аннотацию @javax.ejb.TransactionAttribute или дескриптор развертывания (установите элемент в файле EJB-jar.xml). Эти метаданные могут быть применены как к отдельным методам, так и ко всему компоненту. Если применять их на уровне компонента, все бизнес-методы будут наследовать это значение атрибута. В листинге 9.2 показано, как ItemEJB использует политику ограничения SUPPORTS. Кроме того, там переопределяется метод createBook(), который теперь будет иметь атрибут REQUIRED.


Листинг 9.2. Компонент, не сохраняющий своего состояния, использующий СМТ

@Stateless

@TransactionAttribute(TransactionAttributeType.SUPPORTS)

public class ItemEJB {

··@PersistenceContext(unitName = "chapter09PU")

··private EntityManager em;

··@Inject

··private InventoryEJB inventory;

··public List findBooks() {

····TypedQuery query = em.createNamedQuery(FIND_ALL, Book.class);

····return query.getResultList();

··}

··@TransactionAttribute(TransactionAttributeType.REQUIRED)

··public Book createBook(Book book) {

····em.persist(book);

····inventory.addItem(book);

····returnbook;

··}

}


Примечание

Контекст транзакций клиента не распространяется при асинхронном вызове метода (@Asynchronous). MDB поддерживает только атрибуты REQUIRES и NOT_SUPPORTED, что описано в главе 13.

Маркировка CMT для отката транзакции

Вы видели, что контейнер EJB разграничивает операции автоматически и вызывает операции начала, фиксации и отката от вашего имени. Но как разработчик вы, возможно, захотите предотвратить фиксируемую транзакцию, если произойдет какая-либо ошибка или сработает бизнес-правило. Важно подчеркнуть, что компонент CMT не допускает явного отката транзакций. Вместо этого вам нужно использовать контекст EJB (см. раздел «Внедрение зависимостей» главы 7) для того, чтобы проинформировать контейнер об откате.

Как вы можете видеть в листинге 9.3, InventoryEJB содержит метод oneItemSold(), который получает доступ к базе данных через менеджер хранения и посылает JMS-сообщение для того, чтобы сообщить отправляющей компании, что предмет продан и должен быть доставлен. Если количество доступных предметов равно нулю, методу необходимо явно откатить транзакцию. Чтобы сделать это, компонент, не сохраняющий состояние, сначала должен получить контекст SessionContext с помощью внедрения зависимостей, а затем вызвать его метод setRollbackOnly(). Вызов этого метода не выполняет откат транзакции непосредственно, вместо этого в контейнере устанавливается флаг, который сигнализирует о том, что следует сделать откат транзакции в момент ее завершения. Только сессионные компоненты с разграничением с помощью CMT могут использовать этот метод (сессионные компоненты BMT откатывают транзакцию непосредственно, что показано в пункте «Транзакции, управляемые компонентом» далее).


Листинг 9.3. Компонент, не сохраняющий состояние, помечает транзакцию для отката

@Stateless

public class InventoryEJB {

··@PersistenceContext(unitName = "chapter09PU")

··private EntityManager em;

··@Resource

··private SessionContext ctx;

··public void oneItemSold(Item item) {

····item.decreaseAvailableStock();

····sendShippingMessage();

····if (inventoryLevel(item) == 0)

······ctx.setRollbackOnly();

··}

}

Аналогично компонент может вызвать метод SessionContext.getRollbackOnly(), который возвращает переменную типа boolean, чтобы определить, помечена ли текущая транзакция для отката.

Перейти на страницу:

Похожие книги

C# 4.0: полное руководство
C# 4.0: полное руководство

В этом полном руководстве по C# 4.0 - языку программирования, разработанному специально для среды .NET, - детально рассмотрены все основные средства языка: типы данных, операторы, управляющие операторы, классы, интерфейсы, методы, делегаты, индексаторы, события, указатели, обобщения, коллекции, основные библиотеки классов, средства многопоточного программирования и директивы препроцессора. Подробно описаны новые возможности C#, в том числе PLINQ, библиотека TPL, динамический тип данных, а также именованные и необязательные аргументы. Это справочное пособие снабжено массой полезных советов авторитетного автора и сотнями примеров программ с комментариями, благодаря которым они становятся понятными любому читателю независимо от уровня его подготовки. Книга рассчитана на широкий круг читателей, интересующихся программированием на C#.Введите сюда краткую аннотацию

Герберт Шилдт

Программирование, программы, базы данных
97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Билл де Ора , Майкл Хайгард , Нил Форд

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT