Java EE Session Beans

1. Въведение

Предприятията за сесии на предприятия могат да бъдат класифицирани най-общо на:

  1. Фасул за сесия без гражданство
  2. Фасул с държавна сесия

В тази бърза статия ще обсъдим тези два основни типа сеанси.

2. Настройка

За да използвате Enterprise Beans 3.2 , не забравяйте да добавите най-новата версия към раздела за зависимости на файла pom.xml :

 javax javaee-api 7.0 provided 
Последната зависимост може да бъде намерена в хранилището на Maven. Тази зависимост гарантира, че всички API на Java EE 7 са налични по време на компилация. На предвидени обхват гарантира, че веднъж разположени; зависимостта ще бъде предоставена от контейнера, където е разположен.

3. Боб без гражданство

Сесионният боб без гражданство е вид корпоративен боб, който обикновено се използва за извършване на независими операции. Той няма свързано състояние на клиента, но може да запази състоянието си на екземпляр.

Нека да разгледаме един пример, за да покажем как работи бобът без гражданство.

3.1 Създаване на боб без гражданство

Първо, нека създадем StatelessEJB боб. Използваме анотацията @Stateless, за да маркираме компонента като без гражданство:

@Stateless public class StatelessEJB { public String name; }

След това създаваме първия клиент на горепосочения боб без гражданство, наречен EJBClient1 :

public class EJBClient1 { @EJB public StatelessEJB statelessEJB; }

След това декларираме друг клиент, наречен EJBClient2, който осъществява достъп до същия компонент без гражданство:

public class EJBClient2 { @EJB public StatelessEJB statelessEJB; }

3.2 Тестване на боб без гражданство

За да тестваме безгражданството на EJB, можем да използваме двата клиента, които декларирахме по-горе, по следния начин:

@RunWith(Arquillian.class) public class StatelessEJBTest { @Inject private EJBClient1 ejbClient1; @Inject private EJBClient2 ejbClient2; @Test public void givenOneStatelessBean_whenStateIsSetInOneBean _secondBeanShouldHaveSameState() { ejbClient1.statelessEJB.name = "Client 1"; assertEquals("Client 1", ejbClient1.statelessEJB.name); assertEquals("Client 1", ejbClient2.statelessEJB.name); } @Test public void givenOneStatelessBean_whenStateIsSetInBothBeans _secondBeanShouldHaveSecondBeanState() { ejbClient1.statelessEJB.name = "Client 1"; ejbClient2.statelessEJB.name = "Client 2"; assertEquals("Client 2", ejbClient2.statelessEJB.name); } // Arquillian setup code removed for brevity }

Започваме с инжектиране на двата EBJ клиента в модулния тест.

След това, в първия метод за тестване, ние зададохме променливата на името в EJB, която беше инжектирана в EJBClient1, на стойността Client 1. Сега, когато сравним стойността на променливата на име и в двата клиента, трябва да видим, че стойността е равна . Това показва, че състоянието не се запазва в зърната без гражданство .

Нека да покажем, че това е вярно по различен начин. Във втория тестов метод виждаме, че след като зададем променливата на името във втория клиент, тя „презаписва” каквато и да е стойност, дадена й чрез ejbClient1 .

4. Държавен боб

Файловете за сесия с състояние поддържат състояние както в рамките на транзакциите, така и между тях. Ето защо всеки компонент на сесия с състояние е свързан с конкретен клиент. Контейнерите могат да запаметяват и извличат автоматично състоянието на боб, докато управляват пулове от екземпляри на сеанси със статуси на състояние.

4.1 Създаване на държавния боб

Сеансът на състоянието на състоянието е маркиран с анотацията @Stateful . Кодът за боб със статут е както следва:

@Stateful public class StatefulEJB { public String name; }

Първият локален клиент за нашия боб със статут е написан по следния начин:

public class EJBClient1 { @EJB public StatefulEJB statefulEJB; }

Втори клиент, наречен EJBClient2, също се създава точно като EJBClient1 :

public class EJBClient2 { @EJB public StatefulEJB statefulEJB; }

4.2 Тестване на боб със статут

Функционалността на боб с състояние се тества в теста на модула EJBStatefulBeanTest по следния начин:

@RunWith(Arquillian.class) public class StatefulEJBTest { @Inject private EJBClient1 ejbClient1; @Inject private EJBClient2 ejbClient2; @Test public void givenOneStatefulBean_whenTwoClientsSetValueOnBean _thenClientStateIsMaintained() { ejbClient1.statefulEJB.name = "Client 1"; ejbClient2.statefulEJB.name = "Client 2"; assertNotEquals(ejbClient1.statefulEJB.name, ejbClient2.statefulEJB.name); assertEquals("Client 1", ejbClient1.statefulEJB.name); assertEquals("Client 2", ejbClient2.statefulEJB.name); } // Arquillian setup code removed for brevity }

Както и преди, двата EJB клиента се инжектират в модулния тест. В метода на теста можем да видим, че стойността на променливата на име се задава чрез клиента ejbClient1 и се поддържа, въпреки че стойността на името, зададено чрез ejbClient2, е различна. Това показва, че състоянието на EJB се поддържа .

5. Без гражданство срещу държавен сеанс Bean

Сега нека да разгледаме основната разлика между двата вида сеанси.

5.1 Боб без гражданство

  • Сеансите без сесия без състояние не поддържат състояние с клиента. Поради тази причина те могат да се използват за създаване на пул от обекти, които взаимодействат с множество клиенти
  • Тъй като зърната без гражданство нямат състояние на клиент, те са по-добри при изпълнение
  • Те могат да обработват множество заявки от множество клиенти паралелно и
  • Може да се използва за извличане на обекти от бази данни

5.2 Боб със статут

  • Файловете за сесия с състояние могат да поддържат състояние с множество клиенти и задачата не се споделя между клиентите
  • Състоянието продължава по време на сесията. След като сесията бъде унищожена, състоянието не се запазва
  • Контейнерът може да сериализира и съхранява състоянието като остаряло състояние за бъдеща употреба. Това се прави, за да се спестят ресурси на сървъра на приложения и да се поддържат грешки на боб и е пасивиране
  • Може да се използва за решаване на проблеми тип производител-потребител

6. Заключение

Така че ние създадохме два вида сесионни компоненти и съответни клиенти за извикване на методите от компонентите. Проектът демонстрира поведението на двата основни типа сеанси.

Както винаги, изходният код на статията е достъпен на GitHub.