שעועית מושב סינגלטון בג'קרטה איי

1. סקירה כללית

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

במדריך זה, אנו הולכים לחקור את זה באמצעות דוגמה, עם יישום EE של ג'קרטה.

2. מייבן

ראשית כל, עלינו להגדיר תלות נדרשת של Maven ב pom.xml.

בואו נגדיר את התלות עבור ממשקי ה- API של EJB והמיכל EJB המוטבע לפריסת ה- EJB:

 javax javaee-api 8.0 סיפק org.apache.openejb tomee-embedded 1.7.5 

את הגרסאות העדכניות ביותר תוכלו למצוא ב- Maven Central ב- JavaEE API וב- tomEE.

3. סוגי שעועית מושב

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

3.1. שעועית מושב ממלכתית

שעון מושב סטטיסטי שומר על מצב השיחה עם הלקוח שהוא מתקשר.

כל לקוח יוצר מופע חדש של Stateful Bean ואינו משותף עם לקוחות אחרים.

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

3.2. שעועית מושב חסרת מדינה

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

הפעלות שיטות עוקבות אינן תלויות בניגוד לשעועית ההפעלה הסטטית.

המכולה שומרת על מאגר שעועית חסרת מצב וניתן לשתף מקרים אלה בין לקוחות מרובים.

3.3. שעועית מושב סינגלטון

שעועית מושב של סינגלטון שומרת על מצב השעועית במשך מחזור החיים המלא של היישום.

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

המופע היחיד של השעועית משותף בין מספר לקוחות וניתן לגשת אליו במקביל.

4. יצירת שעועית מושב של סינגלטון

נתחיל ביצירת ממשק עבורו.

לדוגמא זו, בואו נשתמש ב- javax.ejb. מקומי ביאור להגדרת הממשק:

ממשק ציבורי מקומי @ CountryState {רשימה getStates (מדינה מחרוזת); בטל setStates (מדינה מחרוזת, מדינות רשימה); }

באמצעות @מְקוֹמִי פירושו שנגישים לשעועית באותה יישום. יש לנו גם אפשרות להשתמש מרחוק ביאור המאפשר לנו להתקשר ל- EJB מרחוק.

כעת נגדיר את מעמד שעועית EJB ליישום. אנו מסמנים את השיעור כשעועית מושב של סינגלטון על ידי שימוש ב- javax ההערות.ejb סינגלטון.

בנוסף, בואו נסמן גם את השעועית בג'אווה.ejb.Startup ביאור כדי להודיע ​​למיכל EJB לאתחל את השעועית בעת ההפעלה:

@Singleton @Startup המחלקה הציבורית CountryStateContainerManagedBean מיישמת את CountryState {...}

זה נקרא אתחול להוט. אם אנחנו לא משתמשים @סטארט - אפ, מיכל EJB קובע מתי לאתחל את השעועית.

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

הערך עבור @תלוי ב ביאור הוא מערך של שמות שמות מחלקת שעועית שעועית שלנו תלויה בהם:

@Singleton @ Startup @ DependsOn ({"DependentBean1", "DependentBean2"}) מחלקה ציבורית CountryStateCacheBean מיישמת את CountryState {...}

נגדיר לְאַתחֵל() שיטה שמאתחלת את השעועית, והופכת אותה לשיטת קריאה חוזרת במחזור החיים באמצעות javax.annotation.PostConstruct ביאור.

עם הערה זו, היא תקרא על ידי המכולה עם יישום השעועית:

@PostConstruct חלל ציבורי מאותחל () {רשימת מצבים = ArrayList חדש (); states.add ("טקסס"); states.add ("אלבמה"); states.add ("אלסקה"); states.add ("אריזונה"); states.add ("ארקנסו"); countryStatesMap.put ("UnitedStates", מדינות); }

5. מקביליות

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

ההערה javax.ejb.ConcurrencyManagement מגדיר את מדיניות המקבילות לשיטה. כברירת מחדל, מיכל ה- EJB משתמש במקביל המנוהל על ידי מכיל.

ה @ConcurrencyManagement ההערה לוקחת א javax.ejb.ConcurrencyManagementType ערך. האפשרויות הן:

  • ConcurrencyManagementType.CONTAINER עבור מקבילות מנוהלות על ידי מכולות.
  • ConcurrencyManagementType.BEAN עבור מקבילות מנוהלות שעועית.

5.1. מקבילות מנוהלת על ידי מיכל

במילים פשוטות, במקביל המנוהל על ידי מכולות, המכולה שולטת כיצד הגישה של הלקוחות לשיטות.

בואו נשתמש ב- @ConcurrencyManagement ביאור עם ערך javax.ejb.ConcurrencyManagementType.CONTAINER:

@Singleton @Startup @ConcurrencyManagement (ConcurrencyManagementType.CONTAINER) מחלקה ציבורית CountryStateContainerManagedBean מיישמת את CountryState {...}

כדי לציין את רמת הגישה לכל אחת מהשיטות העסקיות של הסינגלטון, נשתמש javax.ejb.Lock ביאור. javax.ejb.LockType מכיל את הערכים עבור ה- @לנעול ביאור. javax.ejb.LockType מגדיר שני ערכים:

  • LockType.WRITE - ערך זה מספק נעילה בלעדית ללקוח המתקשר ומונע מכל שאר הלקוחות גישה לכל שיטות השעועית. השתמש בזה לשיטות המשנות את מצב שעועית הסינגלטון.
  • LockType.READערך זה מספק נעילה במקביל למספר לקוחות כדי לגשת לשיטה.

    השתמש באפשרות זו לשיטות שקוראות רק נתונים מהשעועית.

עם זאת בחשבון, נגדיר את setStates () שיטה עם @Lock (LockType.WRITE) ביאור, כדי למנוע עדכונים בו-זמנית של המדינה על ידי לקוחות.

כדי לאפשר ללקוחות לקרוא את הנתונים במקביל, נרשום getStates () עם @Lock (LockType.READ):

@Singleton @Startup @ConcurrencyManagement (ConcurrencyManagementType.CONTAINER) מחלקה ציבורית CountryStateContainerManagedBean מיישמת CountryState {מפה פרטית סופית

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

להשתמש ב @ AccessTimeout ביאור להגדרת מספר פסק הזמן של שיטת אלפיות השנייה. לאחר פסק הזמן המכולה זורק א javax.ejb.ConcurrentAccessTimeoutException וביצוע השיטה מסתיים.

5.2. מקבילות מנוהלת שעועית

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

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

למידע נוסף על מקביליות קרא על java.util.concurrent כאן ומשתנים אטומיים כאן.

עבור מקבילות מנוהלת שעועית, נגדיר את @ConcurrencyManagement ביאור עם javax.ejb.ConcurrencyManagementType.BEAN ערך לשיעור שעועית הפגישה של סינגלטון:

@Singleton @Startup @ConcurrencyManagement (ConcurrencyManagementType.BEAN) מחלקה ציבורית CountryStateBeanManagedBean מיישמת את CountryState {...}

לאחר מכן נכתוב את setStates () שיטה המשנה את מצב השעועית באמצעות מסונכרן מילת מפתח:

בטל סנכרון בטל ציבורי setStates (מחרוזת, מדינות רשימה) {countryStatesMap.put (מדינה, מדינות); }

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

ה getStates () השיטה לא משנה את המצב של השעועית ולכן היא לא צריכה להשתמש ב- מסונכרן מילת מפתח.

6. לקוח

כעת נוכל לכתוב ללקוח לגשת לשעועית הפגישה של סינגלטון.

אנו יכולים לפרוס את ה- Session Bean על שרתי מכולות יישומים כמו JBoss, Glassfish וכו '. כדי לשמור על דברים פשוטים, נשתמש ב- javax.ejb.embedded.EJBContainer מעמד. מיכל EJBC פועל באותו JVM כמו הלקוח ומספק את מרבית השירותים של מיכל שעועית ארגוני.

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

מחלקה ציבורית CountryStateCacheBeanTest {EJBContainer פרטי ejbContainer = null; הקשר פרטי פרטי = null; @ לפני init בטל פומבי () {ejbContainer = EJBContainer.createEJBContainer (); context = ejbContainer.getContext (); }}

לאחר מכן, נקבל את javax.naming.Context אובייקט מאובייקט המיכל מאותחל. משתמש ב הֶקשֵׁר למשל, נוכל לקבל את ההתייחסות אליו CountryStateContainerManagedBean וקרא לשיטות:

@ מבחן ציבורי בטל כאשר CallGetStatesFromContainerManagedBean_ReturnsStatesForCountry () זורק חריג {String [] expectStates = {"Texas", "Alabama", "Alaska", "Arizona", "Arkansas"}; CountryState countryStateBean = (CountryState) הקשר .lookup ("java: global / singleton-ejb-bean / CountryStateContainerManagedBean"); רשימת actualStates = countryStateBean.getStates ("UnitedStates"); assertNotNull (actualStates); assertArrayEquals (expectStates, actualStates.toArray ()); } @Test הציבור בטל כאשר CallSetStatesFromContainerManagedBean_SetsStatesForCountry () זורק חריג {String [] expectStates = {"California", "Florida", "Hawaii", "Pennsylvania", "Michigan"}; CountryState countryStateBean = (CountryState) הקשר .lookup ("java: global / singleton-ejb-bean / CountryStateContainerManagedBean"); countryStateBean.setStates ("UnitedStates", Arrays.asList (expectedStates)); רשימת actualStates = countryStateBean.getStates ("UnitedStates"); assertNotNull (actualStates); assertArrayEquals (expectStates, actualStates.toArray ()); }

באופן דומה, אנו יכולים להשתמש ב- הֶקשֵׁר למשל כדי לקבל את ההפניה עבור שעועית סינגלטון מנוהלת שעועית ולקרוא לשיטות המתאימות:

@ מבחן ציבורי בטל כאשר CallGetStatesFromBeanManagedBean_ReturnsStatesForCountry () זורק חריג {String [] expectStates = {"Texas", "Alabama", "Alaska", "Arizona", "Arkansas"}; CountryState countryStateBean = (CountryState) הקשר .lookup ("java: global / singleton-ejb-bean / CountryStateBeanManagedBean"); רשימת actualStates = countryStateBean.getStates ("UnitedStates"); assertNotNull (actualStates); assertArrayEquals (expectStates, actualStates.toArray ()); } @ מבחן ציבורי בטל כאשר CallSetStatesFromBeanManagedBean_SetsStatesForCountry () זורק חריג {String [] expectStates = {"California", "Florida", "Hawaii", "Pennsylvania", "Michigan"}; CountryState countryStateBean = (CountryState) הקשר .lookup ("java: global / singleton-ejb-bean / CountryStateBeanManagedBean"); countryStateBean.setStates ("UnitedStates", Arrays.asList (expectStates)); רשימת actualStates = countryStateBean.getStates ("UnitedStates"); assertNotNull (actualStates); assertArrayEquals (expectStates, actualStates.toArray ()); }

סיים את המבחנים על ידי סגירת ה- מיכל EJBC בתוך ה סגור() שיטה:

@ לאחר הריק הציבורי סגור () {אם (ejbContainer! = Null) {ejbContainer.close (); }}

7. מסקנה

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

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

את קוד המקור של הדרכה זו ניתן למצוא באתר GitHub.


$config[zx-auto] not found$config[zx-overlay] not found