EJB

Enterprice java bean

Компоненты EJB:
1. session bean - используется для описании бизнес-логики.
             Существует 3 подвида:
           1. Stateless - не хранит состояние бина.
           2. Stateful - хранит состояние бина между вызовами для отдельного клиента. Пример, корзина в интернет-магазина.
           3. Singleton - хранит состояние на протяжение работы всего приложение


2. message-driven bean - также бизнес-логика (JMS). Коммуникация между компонентами, использующими JMS, асинхронна (процедура не дожидается ответа на своё сообщение) и независима от исполнения компонентов. MDB - stateless.
JMS поддерживает две модели обмена сообщениями: «от пункта к пункту» и «издатель-подписчик».
Модель «от пункта к пункту» QUEUE (Point-to-Point) характеризуется следующим:
  • Каждое сообщение имеет только одного получателя
  • Сообщение попадает в «почтовый ящик», или «очередь» адресата и может быть прочитано когда угодно. Если адресат не работал в момент отсылки сообщения, сообщение не пропадёт.
  • После получения сообщения получатель посылает извещение.
Модель «издатель-подписчик» TOPIC (Publish-subscribe) характеризуется следующим:
  • Подписчик подписывается на определённую «тему»
  • Издатель публикует своё сообщение. Его получают все подписчики этой темы
  • Получатель должен работать и быть подписан в момент отправки сообщения
@MessageDriven( //имя topic, на который подписан бин mappedName="jms/TutorialTopic", name = "ExampleMDB") public class MDBExample implements MessageListener{ //метод, вызываемый при получении нового сообщения @Override public void onMessage(Message msg) { try { TextMessage message = (TextMessage)msg; //считываем свойство из соответствующего поля, заданное вручную в consumer System.out.println("FROM MDB - client type IS " + message.getStringProperty("clientType")); //считываем само сообщение System.out.println("FROM MDB - payload IS" + message.getText()); } catch (JMSException ex) { ex.printStackTrace(); } } }
В onMessage метод добавляется необходимая бизнес логика, в зависимости от типа сообщения, его содержания и тд.
3. entities - для хранения данных. Pojo обьект промапленный таблицей.
//mark it entity using Entity annotation 
//map table name using Table annoation
@Entity
@Table(name="books")
public class Book implements Serializable{
    
   private int id;
   private String name;

   public Book(){        
   }

   //mark id as primary key with autogenerated value
   //map database column id with id field
   @Id
   @GeneratedValue(strategy= GenerationType.IDENTITY)
   @Column(name="id")
   public int getId() {
      return id;
   }
   ... 
 Используется вместе с JPA. Маппинг сущностей  и отображение их в базе данных.
EntityManager - API для CRUD
 @Stateless
public class LibraryPersistentBean implements LibraryPersistentBeanRemote {
 
   //pass persistence unit to entityManager.
   @PersistenceContext(unitName="EjbComponentPU")
   private EntityManager entityManager;         

   public void addBook(Book book) {
      entityManager.persist(book);
   }    

   public List<Book> getBooks() {        
      return entityManager.createQuery("From Books").getResultList();
   }
   ...
}
Persistence unit (persistence.xml) - свойства для перзистентности.
+ JPQL.

Встраивание POJO класса в сущность.

@Embeddable
public class Publisher implements Serializable{
   private String name;
   private String address;
   ...
}
The above class can be embedded using @Embedded annotation
@Entity
public class Book implements Serializable{
   private int id;
   private String name;
   private Publisher publisher;
   ...
   @Embedded
   @AttributeOverrides({
   @AttributeOverride(name = "name", 
                      column = @Column(name = "PUBLISHER")),
   @AttributeOverride(name = "address", 
                      column = @Column(name = "PUBLISHER_ADDRESS"))
   })
   public Publisher getPublisher() {
      return publisher;
   }
   ...
}
EAGER VS LAZY FETCH
public class University {
 private String id;
 private String name;
 private String address;
 private List<Student> students;

 // setters and getters
}
Now when you load a University from the database, JPA loads its id, name, and address fields for you. But you have two options for students: to load it together with the rest of the fields (i.e. eagerly) or to load it on-demand (i.e. lazily) when you call the university's getStudents() method.
Пример JPQL


package com.tutorialspoint.stateless;

import com.tutorialspoint.entity.Book;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

@Stateless
public class LibraryPersistentBean implements LibraryPersistentBeanRemote {
    
   public LibraryPersistentBean(){
   }

   @PersistenceContext(unitName="EntityEjbPU")
   private EntityManager entityManager;         

   public void addBook(Book book) {
      entityManager.persist(book);
   }    

   public List<Book> getBooks() {
      //create an ejbql expression
      String ejbQL = "From Book b where b.name like ?1";
      //create query
      Query query = entityManager.createQuery(ejbQL);
      //substitute parameter.
      query.setParameter(1, "%test%");   
      //execute the query
      return query.getResultList();
   }   
}
Какие аннотации могут быть?
  • Stateless - говорит контейнеру, что класс будет stateless session bean. Для него контейнер обеспечит безопасность потоков и менеджмент транзакций. Дополнительно, вы можете добавить другие свойства, например прозрачное управление безопасностью и перехватчики событий;
  • Local - относится к интерфейсу и говорит, что bean реализующий интерфейс доступен локально (если в одной и той же среде JVM)
  • Remote - относится к интерфейсу и говорит, что bean доступен через RMI (Remote Method Invocation) (в другой среде JVM)
  • EJB - применятеся в коде, где мы используем bean.
  • Stateful - говорит контейнеру, что класс будет stateful session bean.
  • Entity - говорит контейнеру, что класс будет сущностью БД
  • Table(name="...") - указывает таблицу для маппинга
  • IdColumn - параметры маппинга
  • WebService - говорит, что интерфейс или класс будет представлять вэб-сервис.
  • и много-много других..
  • @EJB - used to inject other EJB reference.
  • @Resource - used to inject datasource or singleton services like sessionContext, timerService etc.
Условия создания session bean
В качестве session bean может выступать обычный класс Java удовлетворяющий следующим условиям:
  • иметь как минимум один метод
  • не должен быть абстрактным
  • иметь конструктор по-умолчанию
  • методы не должны начинаться с "ejb" (например ejbCreate, ejbDoSomething)
Для stateful-бинов существует еще одно условие: свойства класса должны быть объявлены примитивами или реализовывать интерфейс Serializable. 

Методы жизненного цикла EJB
У stateless и MDB бинов существует 2 события жизненного цикла, которые мы можем перехватить: создание и удаление бина. Метод, который будет вызываться сразу после создании бина помечается аннотацией javax.annotation.PostConstruct, а перед его удалением - javax.annotation.PreDestroy. Stateful бины обладают помимо рассмотреных выше еще 2 событиями: при активации (javax.ejb.PostActivate) и при деактивации (javax.ejb.PrePassivate).

Особенности stateless и stateful бинов
Контейнер помещает экземпляры stateless-бинов в общее хранилище и множество клиентов могут использовать один экземпляр бина. (пул обьектов бинов) В отличии от stateless stateful бины инстанцируются для каждого пользователя отдельно.



Комментариев нет:

Отправить комментарий