מבוא לשילוב האביב

1. הקדמה

מאמר זה יהיה להציג את מושגי הליבה של שילוב אביב בעיקר באמצעות דוגמאות קטנות ומעשיות.

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

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

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

2. התקנה

 org.springframework.integration spring-integration-core 4.3.5.RELEASE org.springframework.integration spring-integration-file 4.3.5.RELEASE 

תוכלו להוריד את הגרסאות העדכניות ביותר של Core Integration Core ותמיכה של Spring File Integration מ Maven Central.

3. דפוס המסרים

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

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

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

4. שילוב מסרים בפעולה

בואו נשקול דוגמה בסיסית שמעתיק קובץ וידאו MPEG מתיקיה ייעודית לתיקייה מוגדרת אחרת:

@Configuration @ EnableIntegration מחלקה ציבורית BasicIntegrationConfig {public String INPUT_DIR = "the_source_dir"; מחרוזת ציבורית OUTPUT_DIR = "the_dest_dir"; מחרוזת ציבורית FILE_PATTERN = "* .mpeg"; @Bean MessageChannel ציבורי fileChannel () {להחזיר DirectChannel חדש (); } @Bean @InboundChannelAdapter (value = "fileChannel", poller = @Poller (fixedDelay = "1000")) MessageSource ציבורי fileReadingMessageSource () {FileReadingMessageSource sourceReader = FileReadingMessageSource חדש (); sourceReader.setDirectory (קובץ חדש (INPUT_DIR)); sourceReader.setFilter (SimplePatternFileListFilter חדש (FILE_PATTERN)); source returnReader; } @Bean @ServiceActivator (inputChannel = "fileChannel") מסר ציבורי MessageHandlerWritingMessageHandler () {FileWritingMessageHandler handler = FileWritingMessageHandler חדש (קובץ חדש (OUTPUT_DIR)); handler.setFileExistsMode (FileExistsMode.REPLACE); handler.setExpectReply (false); מטפל בחזרה; }}

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

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

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

ריק סטטי ציבורי ראשי (String ... args) {AbstractApplicationContext context = new AnnotationConfigApplicationContext (BasicIntegrationConfig.class); context.registerShutdownHook (); סורק סורק = סורק חדש (System.in); System.out.print ("אנא הזן q ולחץ כדי לצאת מהתוכנית:"); בעוד (נכון) {קלט מחרוזת = scanner.nextLine (); if ("q" .equals (input.trim ())) {break; }} System.exit (0); }

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

5. רכיבי שילוב אביב

5.1. הוֹדָעָה

ה org.springframework.integration.Message ממשק מגדיר את הודעת הקפיץ: יחידת העברת הנתונים בהקשר של שילוב קפיץ.

ממשק ציבורי הודעה {T getPayload (); MessageHeaders getHeaders (); }

הוא מגדיר נגישים לשני אלמנטים מרכזיים:

  • כותרות הודעות, למעשה מיכל-ערך מפתח שיכול לשמש להעברת מטא-נתונים, כהגדרתו ב- org.springframework.integration.MessageHeaders מעמד
  • מטען המטען של ההודעה, שהם הנתונים בפועל שהם בעלי ערך להעברה - במקרה השימוש שלנו, קובץ הווידאו הוא המטען

5.2. עָרוּץ

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

אתה יכול לחשוב על זה כעל צינור מילולי שדרכו מערכת או תהליך משולב יכולים לדחוף הודעות למערכות אחרות (או לקבל הודעות).

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

נקודה לנקודה (P2P) ערוצים משמשים להקמת קווי תקשורת 1 ל -1 בין מערכות או רכיבים. רכיב אחד מפרסם ערוץ לערוץ כדי שאחר יוכל לאסוף אותו. יכול להיות רק רכיב אחד בכל קצה הערוץ.

כפי שראינו, הגדרת תצורה של ערוץ היא פשוטה כמו החזרת מופע של DirectChannel:

@Bean MessageChannel ציבורי fileChannel1 () {להחזיר DirectChannel חדש (); } @Bean MessageChannel ציבורי fileChannel2 () {להחזיר DirectChannel חדש (); } @Bean MessageChannel ציבורי fileChannel3 () {להחזיר DirectChannel חדש (); }

הנה, הגדרנו שלושה ערוצים נפרדים שכולם מזוהים לפי שם שיטות הגטר שלהם.

פרסום-מנוי (פאב-סוב) ערוצים משמשים להקמת קו תקשורת אחד לרבים בין מערכות או רכיבים. זה יאפשר לנו לפרסם את כל 3 הערוצים הישירים שיצרנו קודם.

אז בעקבות הדוגמה שלנו, אנו יכולים להחליף את ערוץ P2P בערוץ פאב-משנה:

@Bean MessageChannel פומבי pubSubFileChannel () {להחזיר PublishSubscribeChannel חדש (); } @Bean @InboundChannelAdapter (value = "pubSubFileChannel", poller = @Poller (fixedDelay = "1000")) MessageSource ציבורי fileReadingMessageSource () {FileReadingMessageSource sourceReader = FileReadingMessageSource חדש (); sourceReader.setDirectory (קובץ חדש (INPUT_DIR)); sourceReader.setFilter (SimplePatternFileListFilter חדש (FILE_PATTERN)); source returnReader; } 

כעת המירו את מתאם הערוץ הנכנס לפרסום לערוץ Pub-Sub. זה יאפשר לנו לשלוח את הקבצים שקוראים מתיקיית המקור ליעדים מרובים.

5.3. לְגַשֵׁר

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

במקרה שלנו, אנו יכולים להשתמש בגשר כדי לחבר את ערוץ Pub-Sub שלנו לשלושה ערוצי P2P שונים (מכיוון שלא ניתן לחבר ערוצי P2P ו- Pub-Sub ישירות):

@Bean @BridgeFrom (value = "pubSubFileChannel") ציבורי MessageChannel fileChannel1 () {להחזיר DirectChannel חדש (); } @Bean @ BridgeFrom (value = "pubSubFileChannel") fileChannel fileChannel2 () ציבורי ציבורי () {להחזיר DirectChannel חדש (); } @Bean @BridgeFrom (value = "pubSubFileChannel") ציבורי MessageChannel fileChannel3 () {להחזיר DirectChannel חדש (); }

תצורת השעועית הנ"ל מגשרת כעת על pubSubFileChannel לשלושה ערוצי P2P. ה @BridgeFrom ביאור הוא מה שמגדיר גשר וניתן להחיל אותו על כל מספר ערוצים שצריך להירשם לערוץ Pub-Sub.

אנו יכולים לקרוא את הקוד הנ"ל כ"יצירת גשר מה- pubSubFileChannel ל fileChannel1, fileChannel2 ו- fileChannel3 כך שהודעות מאת pubSubFileChannel ניתן להזין את כל שלושת הערוצים בו זמנית. "

5.4. מפעיל שירות

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

בדוגמה שלנו, מפעיל השירות שלנו מקבל קובץ מהתצורה המוגדרת ערוץ קלט וכותב אותו לתיקיה המוגדרת.

5.5. מַתאֵם

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

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

מתאמים מתחלקים לשתי קטגוריות רחבות - נכנסות ויוצאות.

בואו נבחן קטגוריות אלה בהקשר של המתאמים הנמצאים בשימוש בתרחיש המדגם שלנו:

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

תצורת המתאם הנכנס שלנו מורכבת מ:

  • An @ InboundChannelAdapter ביאור המסמן את תצורת השעועית כמתאם - אנו מגדירים את הערוץ אליו המתאם יעביר את הודעותיו (במקרה שלנו, קובץ MPEG) ו פוקר, רכיב המסייע למתאם לסקור את התיקיה שהוגדרה במרווח שצוין
  • כיתת תצורה קבועה של Spring Java המחזירה a FileReadingMessageSource, יישום כיתת האביב שילוב המטפל בסקרים של מערכת קבצים

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

6. מסקנה

בדקנו מקרה שימוש בסיסי עם Spring Integration המדגים את התצורה מבוססת java של הספרייה ושימוש חוזר ברכיבים הזמינים.

קוד שילוב אביב ניתן לפרוס כפרויקט עצמאי בתוך JavaSE כמו גם כחלק ממשהו גדול יותר בסביבת ג'קרטה EE. היא אמנם לא מתחרה ישירות עם מוצרים ודפוסים אחרים הממוקדים ב- EAI כמו אוטובוסי שירות ארגוניים (ESB), אך היא מהווה אלטרנטיבה קיימא וקלה לפיתרון רבות מאותן בעיות שה- ESB נבנו כדי לפתור.

אתה יכול למצוא את קוד המקור של מאמר זה בפרויקט Github.


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