Što je EJB? Razvoj Enterprise JavaBeans-a

Enterprise JavaBeans (EJB) specifikacija je za razvoj velikih, distribuiranih poslovnih aplikacija na Java platformi. EJB 1.0 objavljen je 1998. Najnovije izdanje, EJB 3.2.3, usvojeno je za uključivanje u Jakarta EE, gdje će biti preimenovano u Jakarta Enterprise Beans.

EJB arhitektura

EJB arhitektura sastoji se od tri glavne komponente: grah poduzeća (EJB), spremnik EJB i poslužitelj Java aplikacija. EJB se izvode unutar EJB spremnika, a EJB spremnik unutar poslužitelja Java aplikacija.

Postoje dvije vrste EJB - grah sesije i grah vođen porukom:

  • Klijent poziva grah sesije i klijentu programski stavlja na raspolaganje poslovne funkcije poput transakcija i upravljanja resursima.
  • Grahovi vođeni porukama također enkapsuliraju i isporučuju poslovne funkcije, ali su asinkroni i vođeni događajima. Grahovi vođeni porukama slušaju i reagiraju na događaje i ne mogu se pozivati ​​od strane klijenta.

Jednom korišteni za pružanje postojanosti u EJB sustavu, grah entiteta zamijenio je Java Perzistentni API. Nastavite čitati kako biste saznali više o grahu sesije i grahu na temelju poruka.

EJB vs JavaBeans

Enterprise JavaBeans bio je prvi razvojni model zasnovan na komponentama za Java EE. EJB je sličan JavaBeansu po tome što se temelji na komponentama, ali tu sličnost završava:

  • JavaBean je Java klasa koja oblaže više objekata i odgovara određenim konvencijama. JavaBeans se uglavnom koriste za razvoj na strani klijenta.
  • Poduzeće grah (EJB) je Java klase prožeta određenim strani poslužitelja sposobnosti. Poduzetnički grah koristi se u velikim poslovnim aplikacijama i sustavima.

Sesionski grah

Bean sesije je najopćenitija vrsta poslovnog graha koji predstavlja dio poslovne funkcionalnosti koju klijent može nazvati. Klijent u ovom slučaju može biti druga klasa u lokalnom JVM-u ili udaljeni poziv.

Spremnik EJB upravlja životnim ciklusom graha sesije, koji se određuje stanjem graha:

  • Gradovi sesije bez državljanstva slični su opsegu zahtjeva u API-ju Java Servlet. Grahovi sesije bez državljanstva sadrže dio funkcionalnosti koja se može pozvati, ali su u suprotnom bez državljanstva.
  • Grahovi sesije sa statusom povezani su samo s jednim klijentom i pridružuju se trajnoj sesiji tog klijenta. Grahovi sesije sa statusom funkcioniraju slično opsegu sesije u API-ju Servlet.
  • Singleton grah sličan je opsegu primjene u API-ju Servlet. Grah pojedinačne sesije postoji samo jednom za svakog klijenta.

Sigurnost niti s grahom za sjedenje

Beanu sesije sa statusom stanja može pristupiti samo jedan klijent odjednom, tako da je sigurnost niti zajamčena kada radite s ovom vrstom graha. Gradovi sesije bez državljanstva i pojedinačni grahovi fleksibilniji su, omogućujući istodobne veze, kojima mora upravljati programer. Odgovorni ste za sigurnost niti pri radu s ovim vrstama graha.

Grah vođen porukom

Grahovi vođeni porukama (MDB) pozivaju se putem JMS (Java Message Service) poruka. JMS radi poput distribuiranog obrasca naredbe, gdje grah vođen porukom djeluje kao preslušač naredbe. Kada poruka stigne u temu ili red, poziva se grah na temelju poruke koji preslušava tu temu.

Grahovi koji se pokreću porukama nisu toliko uobičajeni kao grah sesija, ali su moćni. Budući da su asinkroni i vođeni događajima, posebno su korisni za dugotrajne poslove gdje je važno uštedjeti resurse.

Najjednostavnija arhitektura sastojala bi se od aplikacije EJB i njezinog spremnika i poslužitelja, koji se koordiniraju s uslugom poruka koja obrađuje MDB-ove. U proizvodnji bi vaša arhitektura vjerojatno sadržavala treću komponentu posvećenu konzumiranju graha. U razvoju su sve ove komponente mogle raditi na istom lokalnom stroju.

Slika 1 prikazuje tipičnu arhitekturu vođenu događajima s grahom vođenim porukama.

Matthew Tyson

Rad s grahom koji se pokreće porukom više je uključen nego korištenje graha sesije. U okruženju vođenom događajima obično će vam trebati posrednik poruka kao što je ActiveMQ.

Iako su grah sesije jednostavniji i stoga se češće koristi u EJB-u, arhitekture vođene događajima postale su popularne, posebno s eksplozijom mikroservisa. 

EJB bilješke

Definiranje i potrošnja graha poduzeća bila je strijelja za mnoge programere sve do EJB 3.0, koji je uveo napomene u EJB specifikaciju. Bilješke čine vrlo jednostavnim konfiguriranje poslovnog graha za širok raspon funkcionalnosti koje se nalaze u Javi EE. Nastavite čitati da biste započeli s EJB bilješkama.

@Stateless: Definirajte grah sesije bez državljanstva

Da biste klasificirali klasu kao grah sesije bez državljanstva, koristite javax.ejb.Statelessnapomenu, kao što je prikazano u Popisu 1.

Popis 1. Primjer bilješke @Stateless

 import javax.ejb.Stateless; @Stateless public class MyStatelessBean { public String getGreeting() { return "Hello JavaWorld."; } } 

Ovaj grah bez državljanstva sadrži jednostavan potpis koji ne uzima argumente i vraća niz. Ipak, nemojte dopustiti da vas jednostavnost zavara: ovaj grah može učiniti sve što vam treba, uključujući interakciju s drugim grahom, uslugama ili podatkovnim slojem vaše aplikacije.

@EJB: Konzumirajte grah sesije bez državljanstva

Jednom kada definirate grah sesije, korištenje je tako jednostavno:

Unos 2. Primjer bilješke @EJB

 public class MyServlet extends HttpServlet { @EJB MyStatelessBean myEjb; public void doGet(HttpServletRequest request, HttpServletResponse response) { response.getWriter().write("EJB Says " + testStatelessEjb.getGreeting()); } } 

Ovdje ubrizgavamo grah bez državljanstva u servlet i on je onda dostupan za upotrebu. Primijetite kako je grah identificiran ispod @EJBbilješke. Oznaka "bez državljanstva" govori nam da ovaj grah neće pratiti klijenta. Budući da nema državljanstvo, također znamo da je ovaj grah podložan navoju ako radi bilo koji posao izvan pozvane metode.

@Udaljeno: Definirajte udaljeno EJB sučelje

U gornjim primjerima pretpostavio sam da EJB i EJB klijent rade u istom JVM-u. Ako se grah poduzeća i njegov klijent izvode u odvojenim JVM-ovima, tada EJB mora definirati @Remotesučelje. U ovom slučaju, na vama je da definirate i implementirate sučelje, kao što je prikazano na popisu 3.

Popis 3. @ Primjer daljinske bilješke

 @Remote public interface MyStatelessEjbRemote { String sayHello(String name); } 

The remote interface is sent to the client to invoke. Calls to it will then be fulfilled by the EJB's server-side implementation. The MyStatelessBean example in Listing 4 implements the remote interface.

Listing 4. Implementing a remote interface

 public class MyStatelessBean implements MyStatelessEjbRemote{ ... } 

A remote interface is implemented just like a normal class implementing an interface. As the consumer of a remote EJB, the client application must be able to access the class definition for the remote interface. You can package the class definition for the remote interface as a dependency JAR.

Local vs remote interface

While it's important to know how to implement a remote interface, in practice it's more common to use a local interface. The local interface is used by default and works whenever the EJB is invoked within the same JVM context. Using the remote interface comes into play when the application is distributed across multiple JVMs.

Stateful sessions beans and singleton beans

The process for defining and consuming stateful @Session beans and @Singleton beans is the same as what you've seen for @Stateless beans. Remember the semantics:

  • Multiple session beans can be instantiated and used for the same client.
  • A singleton bean will exist only once for the entire application.

Thread safety and scheduling with singletons

Thread safety is built in when you're working with session beans, but both stateless and singleton beans can be accessed concurrently by multiple clients. Developers are responsible for thread safety when implementing these types of beans.

Singleton beans offer some support for thread safety via the @Lock annotation. You can use the @Lock annotation on singleton bean methods to set read/write privileges for each method. The two options are @Lock(LockType.READ) or @Lock(LockType.WRITE), which is the default.

Another useful feature of singleton beans is the ability to schedule tasks in a simple way, using the @Schedule annotation. Listing 5 shows how to schedule a task daily at noon.

Listing 5. @Schedule annotation example

 @Singleton public class MySchedulerBean { @Schedule(hour = "12") void doIt() { System.out.println("Hello at Noon!"); } } 

CDI vs EJB

CDI, or Context and Dependency Injection is a newer enterprise specification that some developers have proposed could replace EJB.

At a high level, CDI offers a general-purpose component framework, while EJB stands out for its richly featured, individual components. Whereas CDI uses dependency injection to define and reference any software component, EJB components are more formally defined, with each offering a specific set of capabilities out of the box. Both specs are planned for future development as part of Jakarta EE, where the question of whether CDI should replace EJB will eventually be resolved.

Conclusion

Enterprise JavaBeans prva je specifikacija koja nudi jednostavan način enkapsulacije i ponovne upotrebe poslovne logike u korporativnim Java aplikacijama. Daleko od teškog behemota starih vremena, EJB je danas mršav okvir zasnovan na napomenama koji vam omogućuje pristup širokom spektru poslovnih funkcija, odmah iz kutije. Razmislite o EJB-u kada sljedeći put budete trebali brzo povećati distribuiranu, skalabilnu poslovnu aplikaciju. Mogli biste biti ugodno iznenađeni.

Ovu priču, "Što je EJB? Razvoj Enterprise JavaBeans" izvorno je objavio JavaWorld.