מה זה EJB? האבולוציה של Enterprise JavaBeans

Enterprise JavaBeans (EJB) הוא מפרט לפיתוח יישומים עסקיים גדולים ומופצים בפלטפורמת Java. EJB 1.0 שוחרר בשנת 1998. המהדורה העדכנית ביותר, EJB 3.2.3, אומצה להכללה בג'קרטה EE, שם תוחלף שם ג'קרטה שעועית ארגונית.

אדריכלות EJB

ארכיטקטורת EJB מורכבת משלושה מרכיבים עיקריים: שעועית ארגונית (EJB), מיכל ה- EJB ושרת היישומים Java. EJBs פועלים בתוך מיכל EJB, ומיכל EJB פועל בתוך שרת יישומי Java.

ישנם שני סוגים של EJB - שעועית הפעלה ושעועית מונעת הודעה:

  • שעועית הפעלה מופעלת על ידי הלקוח והופכת פונקציונליות ארגונית כגון עסקאות וניהול משאבים לרשות הלקוח באופן פרוגרמטי.
  • שעועית מונעת הודעות גם מעסיקה ומספקת פונקציונליות ארגונית, אך הן אסינכרוניות ומונעות אירועים. שעועית מונעת הודעות מקשיבה ומגיבה לאירועים, ואינה יכולה להיות מופעלת על ידי הלקוח.

לאחר ששימשו לספק התמדה במערכת EJB, שעועית ישויות הוחלפה על ידי API של Persistence Java. המשך לקרוא כדי ללמוד עוד על שעועית הפעלה ושעועית מונעת הודעות.

EJB לעומת JavaBeans

Enterprise JavaBeans היה המודל הראשון לפיתוח רכיבים עבור Java EE. EJB דומה ל- JavaBeans בהיותו מבוסס רכיב, אך שם מסתיים הדמיון:

  • JavaBean הוא בכיתה Java שעוטפת מספר אובייקטים ותואמים מוסכמים מסוימים. JavaBeans משמשים בעיקר לפיתוח בצד הלקוח.
  • שעועית עסק (EJB) היא מחלקה Java חדור יכולות בצד השרת ספציפיות. שעועית ארגונית משמשת ביישומים ומערכות עסקיות בקנה מידה גדול.

שעועית מושב

שעועית פגישה היא הסוג הגנרית ביותר של שעועית עסק, מייצגי נתח של פונקציונליות עסקיות שיכול להיקרא על ידי לקוח. הלקוח במקרה זה יכול להיות מחלקה אחרת ב- JVM המקומי או שיחה מרחוק.

מיכל ה- EJB מנהל את מחזור החיים של שעועית ההפעלה, אשר נקבע על פי מצב השעועית:

  • שעועית הפעלה חסרת מדינה דומה להיקף הבקשה ב- Java Servlet API. שעועית הפעלה חסרת מדינה מכילה נתח של פונקציונליות הניתנת להתקשרות אך אחרת היא חסרת מדינה.
  • שעועית הפעלה סטטית משויכת ללקוח אחד בלבד, ומצורפת למפגש המתמשך של אותו לקוח. שעועית הפעלה סטטית פועלת באופן דומה להיקף ההפעלה ב- API של Servlet.
  • שעועית סינגלטון דומה להיקף היישומים ב- API של Servlet. שעועית הפעלה של סינגלטון קיימת פעם אחת בלבד עבור כל לקוח.

בטיחות חוטים עם שעועית הפעלה

לקוח אחד בכל פעם ניתן להגיע לשעועית מושבתת בלבד, ולכן בטיחות החוט מובטחת כשאתה עובד עם סוג זה של שעועית. שעועית הפעלה חסרת סטטוס ושעועית סינגלטון גמישות יותר, ומאפשרות חיבורים מקבילים, אשר עליהם להיות מנוהלים על ידי היזם. אתה אחראי על בטיחות החוטים בעבודה עם סוגים אלה של שעועית.

שעועית מונעת הודעות

שעועית מונעת הודעות (MDB) מופעלת באמצעות הודעות JMS (Java Message Service). JMS עובד כמו דפוס פיקוד מבוזר, שבו שעועית מונעת המסר משמשת כמאזין לפקודה. כאשר מגיעה הודעה על נושא או תור, מופעלת השעועית מונעת ההודעה המקשיבה בנושא זה.

שעועית מונעת הודעות איננה נפוצה כמו שעועית הפעלה, אך הן חזקות. בהיותם אסינכרוניים ומונעים אירועים, הם שימושיים במיוחד עבור עבודות ארוכות טווח בהן חשוב לשמור על משאבים.

הארכיטקטורה הפשוטה ביותר תכלול יישום EJB והמכולה והשרת שלו, שמתאמים עם שירות המסרים העיבוד של ה- MDB. בייצור, האדריכלות שלך תכלול ככל הנראה רכיב שלישי המוקדש לצריכת השעועית. בפיתוח, כל הרכיבים הללו יכולים לפעול על אותה מכונה מקומית.

איור 1 מציג ארכיטקטורה מונחית אירועים עם שעועית מונעת הודעות.

מתיו טייסון

עבודה עם שעועית מונעת הודעות מעורבת יותר משימוש בשעועית הפעלה. בסביבה מונחית אירועים בדרך כלל תזדקק למתווך הודעות כמו ActiveMQ.

בעוד שעועית הפעלה פשוטה יותר, ובכך נפוצה יותר ב- EJB, ארכיטקטורות מונעות אירועים הפכו פופולריות, במיוחד עם התפוצצות המיקרו-שירותים. 

ביאורי EJB

הגדרה וצריכה של שעועית ארגונית הייתה נקודת דבק עבור מפתחים רבים עד ל- EJB 3.0, שהציג הערות למפרט EJB. ביאורים מקלים מאוד על הגדרת שעועית ארגונית למגוון רחב של פונקציונליות המצויה ב- Java EE. המשך לקרוא כדי להתחיל בהערות EJB.

@ סטטלס: הגדר שעועית הפעלה חסרת מדינה

על מנת לייעד כיתה כשעועית הפעלה חסרת מדינה, אתה משתמש javax.ejb.Statelessבהערה, כפי שמוצג ברשימה 1.

רישום 1. דוגמה להערת @Stateless

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

שעועית חסרת אזרחות זו מכילה חתימה פשוטה שאינה לוקחת ויכוחים ומחזירה מחרוזת. אל תיתן לפשטות להטעות אותך: שעועית זו יכולה לעשות כל מה שאתה צריך, כולל אינטראקציה עם שעועית אחרת, שירותים או שכבת הנתונים של היישום שלך.

@EJB: צרכו שעועית ללא הפעלת מדינה

לאחר שהגדרת שעועית הפעלה, השימוש בה כל כך פשוט:

רישום 2. דוגמה להערת @EJB

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

כאן אנו מזריקים את השעועית חסרת המדינה לסרוולט ואז היא זמינה לשימוש. שימו לב כיצד מזוהה השעועית תחת @EJBההערה. הכינוי "חסר המדינה" אומר לנו שעועית זו לא תעקוב אחר הלקוח. מכיוון שהוא חסר מדינה, אנו גם יודעים כי שעועית זו כפופה להשחלה אם היא עושה עבודה כלשהי מחוץ לשיטה המופעלת.

@Remote: הגדר ממשק EJB מרוחק

בדוגמאות שלעיל הנחתי שלקוח EJB ו- EJB פועל באותו JVM. אם שעועית הארגון והלקוח שלה פועלים במכשירי JVM נפרדים, על EJB להגדיר @Remoteממשק. במקרה זה, עליכם להגדיר וליישם את הממשק, כפי שמוצג ברשימה 3.

רישום 3. דוגמה לביאור מרחוק @

 @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 היה המפרט הראשון שהציע דרך קלה להכיל ולהשתמש מחדש בלוגיקה עסקית ביישומי Java ארגוניים. הרחק מלהיות המשקל הכבד של פעם, EJB כיום מהווה מסגרת רזה המבוססת על הערות המאפשרת לך לגשת למגוון רחב של פונקציונליות ארגונית, מייד מהקופסה. שקול את EJB בפעם הבאה שתתבקש להגביר במהירות יישום עסקי מבוזר וניתן להרחבה. אתה עלול להיות מופתע לטובה.

סיפור זה, "מהו EJB? האבולוציה של Enterprise JavaBeans" פורסם במקור על ידי JavaWorld.