Читаем Изучаем 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.

<p>Маркировка CMT для отката транзакции</p>

Вы видели, что контейнер 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, чтобы определить, помечена ли текущая транзакция для отката.

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

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

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных