מבוא ל- Flowable

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

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

2. הבנת תהליכים עסקיים

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

OMG (קבוצת ניהול אובייקטים) הגדירה תקן שנקרא מודל וציון עסקים (BPMN) לעסקים להגדיר ולתקשר את התהליכים שלהם. BPMN זכתה לתמיכה מקובלת ונרחבת בענף. ה- Flowable API תומך באופן מלא ביצירה ובפריסה של הגדרות תהליך BPMN 2.0.

3. יצירת הגדרות תהליך

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

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

אנו יוצרים הגדרות תהליכים כקבצי XML תוך שימוש בתקן XML של BPMN 2.0.

בואו נגדיר את התהליך הפשוט שלנו לפי תקן BPMN 2.0:

עכשיו יש כאן מספר לא קטן של אלמנטים שהם דברים XML סטנדרטיים, בעוד שאחרים ספציפיים ל- BPMN 2.0:

  • ה התהליך כולו עטוף בתג שנקרא "תהליך", שהוא בתורו חלק מתג שנקרא "הגדרות"
  • תהליך מורכב מאירועים, זרימות, משימות ושערים
  • אירוע הוא אירוע התחלה או אירוע סיום
  • זרימה (בדוגמה זו, זרימת רצף) מחברת אלמנטים אחרים כמו אירועים ומשימות
  • המשימות הן המקום בו נעשית העבודה בפועל; אלה יכולים להיות "משימות משתמש" או "משימות שירות", בין היתר
  • משימת משתמש מחייבת שמשתמש אנושי יקיים אינטראקציה עם ה- Flowable API וינקט בפעולה
  • משימת שירות מייצגת משימה אוטומטית, שיכולה להיות שיחה למחלקת Java או אפילו שיחת HTTP
  • שער מבצע על סמך התכונה "אושרה"; זה ידוע כמשתנה תהליךונראה כיצד להגדיר אותם בהמשך

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

4. עבודה עם Flowable API

כעת, לאחר שהגדרנו את התהליך הפשוט שלנו בקובץ XML לפי תקן BPMN 2.0, אנו זקוקים לדרך להגישו ולהריצו. Flowable מספק את ה- API של מנוע התהליך לאינטראקציה עם מנועי Flowable. Flowable הוא מאוד גמיש ומציע מספר דרכים לפרוס את ה- API הזה.

בהתחשב בכך ש- Flowable הוא API של Java, אנו יכולים לכלול את מנוע התהליך בכל יישום Java על ידי פשוט לכלול את קבצי ה- JAR הנדרשים. אנו יכולים למנף את Maven מאוד לניהול תלות אלה.

יתר על כן, Flowable מגיע עם ממשקי API מקושרים לאינטראקציה עם Flowable באמצעות HTTP. אנו יכולים להשתמש ב- APIs בכדי לעשות כל דבר אחר אפשרי באמצעות API Flowable.

סוף כל סוף, ל- Flowable תמיכה מצוינת בשילוב עם Spring and Spring Boot! נשתמש בשילוב Flowable ו- Spring Boot במדריך שלנו.

5. יצירת יישום הדגמה עם מנוע תהליכים

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

אנו ניצור את ההדגמה שלנו כיישום Boot Boot.

5.1. תלות

ראשית, בואו נראה את התלות שאנחנו צריכים למשוך ממייבן:

 org.springframework.boot spring-boot-starter-web org.flowable flowable-spring-boot-starter 6.4.1 com.h2database h2 runtime 

התלות שאנו זקוקים לכולם זמינים ב- Maven Central:

  • Spring Boot Starter for Web - זהו סטרטר סטנדרטי עבור Spring Boot
  • מתחיל זורם למגף קפיצי - זה נדרש עבור מנועי זרימה של מגף האביב
  • מסד נתונים של H2 - Flowable דורש מסד נתונים לאחסון נתונים, ו- H2 הוא מסד הנתונים המוגדר כברירת מחדל בזיכרון

5.2. הגדרת תהליך

כאשר אנו מתחילים את יישום Spring Boot שלנו, הוא מנסה לטעון באופן אוטומטי את כל הגדרות התהליך הקיימות תחת התיקיה "משאבים / תהליכים". לכן, בואו ניצור קובץ XML עם הגדרת התהליך שיצרנו לעיל, עם השם "article-workflow.bpmn20.xml" ונניח אותו בתיקיה זו.

5.3. תצורות

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

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

5.4. נציגי ג'אווה

בהגדרת התהליך שלנו, השתמשנו בכמה שיעורי Java שאמורים להיות מופעלים כחלק ממשימות השירות. שיעורים אלה מיישמים את JavaDelegate ממשק והם ידועים כ- Java Delegates ב- Flowable. נגדיר כעת שיעורי דמה עבור נציגי Java הבאים:

מחלקה ציבורית PublishArticleService מיישמת את JavaDelegate {public void execute (DelegateExecution)) {System.out.println ("פרסום המאמר שאושר."); }}
מחלקה ציבורית SendMailService מיישמת את JavaDelegate {ביצוע חלל ציבורי (ביצוע DelegateExecution) {System.out.println ("שליחת דואר דחייה למחבר."); }}

ברור שעלינו להחליף את שיעורי הדמה האלה בשירותים בפועל כדי לפרסם מאמר או לשלוח דוא"ל.

5.5. ממשקי API של HTTP

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

נתחיל בהגדרת בקר החושף שלוש נקודות קצה:

@ RestController מחלקה ציבורית ArticleWorkflowController {@ שירות פרטי ArticleWorkflowService פרטי; @PostMapping ("/ submit") הגשת חלל ציבורי (מאמר מאמר @RequestBody) {service.startProcess (מאמר); } @GetMapping ("/ משימות") רשימה רשימת ציבורים getTasks (@RequestParam מקבל מחרוזת) {return service.getTasks (assignee); } @PostMapping ("/ review") סקירת חללים ציבורית (אישור אישור @RequestBody) {service.submitReview (אישור); }}

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

למעשה אנו מאצילים את מרבית העבודה ArticleWorkflowService:

@Service בכיתה ציבורית ArticleWorkflowService {@RuntimeService פרטי פרטי; @ TaskService taskService פרטית אוטומטית; @Transactional public void startProcess (מאמר מאמר) {משתני מפה = HashMap חדש (); variables.put ("מחבר", article.getAuthor ()); variables.put ("url", article.getUrl ()); runtimeService.startProcessInstanceByKey ("articleReview", משתנים); } @Transactional ציבורי רשימת getTasks (מחרוזת מקבל) {רשימת משימות = taskService.createTaskQuery () .taskCandidateGroup (מקצה) .list (); להחזיר את המשימות.זרם () .מפה (משימה -> {מפה משתנים = taskService.getVariables (task.getId ()); להחזיר מאמר חדש (task.getId (), (מחרוזת) variables.get ("מחבר"), ( String) variables.get ("url"));}) .collect (Collectors.toList ()); } @ Transactional public void submitReview (אישור אישור) {משתני מפה = HashMap חדש (); variables.put ("אושר", approval.isStatus ()); taskService.complete (approval.getId (), משתנים); }}

עכשיו, רוב הקוד כאן די אינטואיטיבי, אבל בואו נבין את הנקודות הבולטות:

  • RuntimeService להסדיר את התהליך להגשה מסוימת
  • TaskService לשאילתה ולעדכון משימות
  • עוטף את כל שיחות מסד הנתונים בעסקאות הנתמכות על ידי Spring
  • שמירת פרטים כמו מחבר וכתובת אתר, בין היתר, בא מַפָּהושמירה במופע התהליך; אלה ידועים כמשתני תהליכים, ואנחנו יכולים לגשת אליהם במסגרת הגדרת תהליך, כפי שראינו קודם

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

6. תהליכי בדיקת יחידות

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

@ExtendWith (FlowableSpringExtension.class) @ExtendWith (SpringExtension.class) מחלקה ציבורית ArticleWorkflowUnitTest {@RuntimeService פרטי פרטית אוטומטית; @ TaskService taskService פרטית אוטומטית; @Test @Deployment (resources = {"תהליכים / מאמר-workflow.bpmn20.xml"}) בטל מאמרApprovalTest () {משתני מפה = HashMap חדש (); variables.put ("מחבר", "[מוגן באמצעות דוא"ל]"); variables.put ("url", "//baeldung.com/dummy"); runtimeService.startProcessInstanceByKey ("articleReview", משתנים); משימת משימה = taskService.createTaskQuery (). SingleResult (); assertEquals ("עיין במדריך שהוגש", task.getName ()); variables.put ("אושרה", נכון); taskService.complete (task.getId (), משתנים); assertEquals (0, runtimeService.createProcessInstanceQuery (). count ()); }}

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

7. הבנת פריסת תהליכים

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

בדרך כלל, תהליכים מאוחסנים כארכיון עסקי (BAR) ונפרסים ביישום. במהלך פריסתו, ארכיון זה נסרק לאיתור חפצים - כמו הגדרות תהליך - ומעובד. יתכן ששמת לב למוסכמה של קובץ הגדרת התהליך המסתיים ב- ".Bpmn20.xml".

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

בעוד שב- BPMN 2.0 עצמו אין מושג של גרסאות, Flowable יוצר תכונת גרסה לתהליך, אשר נפרסת במסד הנתונים. אם נפרסת גרסה מעודכנת של אותו תהליך, כפי שזוהה על ידי התכונה "id", נוצר ערך חדש עם הגדלת הגרסה. כאשר אנו מנסים להתחיל תהליך על ידי "id", מנוע התהליך מביא את הגרסה האחרונה של הגדרת התהליך שנפרסה.

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

8. היסטוריית גלישה של מופעי תהליכים

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

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

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

HistoryService historyService = processEngine.getHistoryService (); רשימת פעילויות = historyService .createHistoricActivityInstanceQuery () .processInstanceId (processInstance.getId ()) .finished () .orderByHistoricActivityInstanceEndTime () .asc () .list ();

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

9. תהליכי ניטור

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

Flowable מספק אמצעי MB ספציפיים שאליהם אנו יכולים לגשת דרך JMX, לא רק לאסוף נתונים לצורך ניטור אלא גם לבצע פעילויות רבות אחרות. אנו יכולים לשלב זאת עם כל לקוח JMX רגיל, כולל jconsole, שנמצא לצד הפצות Java סטנדרטיות.

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

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

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

10. מסקנה

במדריך זה דנו בתהליכים עסקיים וכיצד להגדיר אותם בתקן BPMN 2.0. לאחר מכן, דנו ביכולות של מנוע תהליכים Flowable ו- APIs לפרוס ולבצע תהליכים. ראינו כיצד לשלב זאת ביישום Java, במיוחד ב- Spring Boot.

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

כמו תמיד, הקוד לדוגמאות זמין ב- GitHub.