Метод | Описание |
---|---|
etCallerPrincipal | Возвращает java.security.Principal, ассоциированный с вызовом |
getRollbackOnly | Проверяет, была ли текущая транзакция помечена как подлежащая откату |
getTimerService | Возвращает интерфейс javax.ejb.TimerService. Только EJB-компоненты без сохранения состояния и одиночные EJB-компоненты могут задействовать этот метод. Сессионные EJB-компоненты с сохранением состояния не могут быть синхронизированными объектами |
getUserTransaction | Возвращает интерфейс javax.transaction.UserTransaction для ограничения транзакций. Только сессионные EJB-компоненты, для которых имеет место транзакция, управляемая EJB-компонентом (Bean-Managed Transaction — BMT), могут задействовать этот метод |
isCallerInRole | Проверяет, имеется ли у вызывающего оператора определенная роль безопасности |
lookup | Дает возможность сессионному EJB-компоненту осуществлять поиск его записей окружения в контексте именования JNDI |
setRollbackOnly | Позволяет EJB-компоненту пометить текущую транзакцию как подлежащую откату |
wasCancelCalled | Проверяет, вызвал ли клиент метод cancel() в клиентском объекте Future, который соответствует выполняющемуся в текущий момент асинхронному бизнес-методу |
Как показано в листинге 7.15, сессионный EJB-компонент может получить доступ к своему контексту среды путем внедрения ссылки на SessionContext с использованием аннотации @Resource. Здесь метод createBook удостоверяется в том, что только администраторы могут создавать экземпляры Book. Он также осуществляет откат, если уровень запасов книг оказывается слишком высоким.
@Stateless
public class ItemEJB {
··@PersistenceContext(unitName = "chapter07PU")
··private EntityManager em;
··@Resource
··private SessionContext context;
··public Book createBook(Book book) {
····if (!context.isCallerInRole("admin"))
······throw new SecurityException("Только администратор может создавать
···································книги");
····em.persist(book);
····if (inventoryLevel(book) == TOO_MANY_BOOKS)
······context.setRollbackOnly();
····return book;
··}
}
Асинхронные вызовы
По умолчанию вызовы сессионных EJB-компонентов посредством удаленного представления, локального представления и представления без интерфейса являются асинхронными. Клиент вызывает метод, после чего он блокируется в течение периода, на протяжении которого выполняется метод, пока не завершится обработка и не будет возвращен результат, а затем клиент сможет продолжить свою работу. Однако асинхронная обработка является обычным требованием во многих приложениях, имеющих дело с задачами, на решение которых нужно длительное время. Например, печать заказа может оказаться задачей, на решение которой уйдет очень много времени в зависимости от того, подключен ли принтер, достаточно ли бумаги, не ожидает ли масса документов в спуле принтера своего вывода на печать. Когда клиент вызывает метод для печати документа, ему нужно инициировать процесс «выстрелил и забыл», который позволит напечатать документ, а клиент в это время сможет продолжить свою обработку.