מבוא לאקטיביטי עם אביב

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

פשוט שים, Activiti היא פלטפורמת ניהול תהליכים ועסקים עסקיים.

אנו יכולים להתחיל במהירות על ידי יצירת a ProcessEngineConfiguration (מבוסס בדרך כלל על קובץ תצורה). מכאן נוכל להשיג א ProcessEngine - ודרך ProcessEngine, אנו יכולים לבצע פעולות זרימת עבודה ו- BPM.

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

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

אם אתה חדש בממשק ה- API, עיין ב מבוא ל- Activiti API עם Java. במאמר זה נדון כיצד נוכל להגדיר את ממשק ה- API של Activiti בתוך יישום Spring Boot.

2. התקנה עם מגף קפיץ

בואו נראה כיצד נוכל להגדיר את Activiti כיישום Spring Boot Maven ולהתחיל להשתמש בו.

2.1. הגדרה ראשונית

כרגיל, עלינו להוסיף את התלות של maven:

 org.activiti activiti-spring-boot-starter-basic 

הגרסה היציבה האחרונה של ה- API נמצאת כאן. זה עובד עם אביב אתחול עד v1.5.4. זה עדיין לא עובד עם v2.0.0.M1.

אנו יכולים גם ליצור פרויקט Spring Boot באמצעות //start.spring.io ולבחור Activiti כתלות.

רק על ידי הוספת התלות הזו ו- @EnableAutoConfiguration ביאור ליישום אתחול האביב, הוא יבצע את ההתקנה הראשונית:

  • צור מקור נתונים (ה- API דורש מסד נתונים כדי ליצור את ה- ProcessEngine)
  • צור וחשוף את ProcessEngine אפונה
  • צור וחשוף את שעועית שירותי Activiti
  • צור את מנהל עבודות האביב

2.2. יצירה והפעלה של תהליך

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

כדי להגדיר תהליך נצטרך ליצור קובץ BPMN. לשם כך, אנו יכולים להשתמש //activiti.alfresco.com/activiti-app/editor כדי ליצור הגדרת תהליך.

לאחר מכן פשוט הורד את קובץ BPMN. נצטרך לשים את הקובץ הזה ב- src / main / resources / תהליכים תיקיה. כברירת מחדל, Spring Boot יחפש בתיקיה זו כדי לפרוס את הגדרת התהליך.

ניצור תהליך הדגמה המכיל משימות משתמש אחת:

המקבל את משימת המשתמש מוגדר כיוזם התהליך. קובץ BPMN להגדרת תהליך זה נראה כך:

כעת ניצור בקר REST לטיפול בבקשות להתחיל בתהליך זה:

@ RuntimeService פרטית אוטומטית @ runtimeService; @GetMapping ("/ start-process") ציבורי startProcess מחרוזת () {runtimeService.startProcessInstanceByKey ("התהליך שלי"); החזר "התהליך התחיל. מספר מופעי התהליך" + "הפועלים כעת =" + runtimeService.createProcessInstanceQuery (). count (); }

פה, runtimeService.startProcessInstanceByKey ("התהליך שלי") מתחיל את ביצוע התהליך שמפתחו "התהליך שלי". runtimeService.createProcessInstanceQuery (). count () יביא לנו את מספר מקרי התהליך.

בכל פעם שאנחנו יוצאים לדרך "/ תהליך התחלתי", חדש ProcessInstance תיווצר ונראה תוספת בספירת התהליכים הפועלים כעת.

מקרה מבחן JUnit מראה לנו את ההתנהגות הזו:

@Test ציבורי בטל givenProcess_whenStartProcess_thenIncreaseInProcessInstanceCount () זורק חריגה {String responseBody = this.mockMvc .perform (MockMvcRequestBuilders.get ("/ start-process")). AndReturn (). GetResponse (). GetContent; assertEquals ("התהליך התחיל. מספר מופעי התהליך" + "הפועלים כעת = 1", responseBody); responseBody = this.mockMvc .perform (MockMvcRequestBuilders.get ("/ start-process")) .andReturn (). getResponse (). getContentAsString (); assertEquals ("התהליך התחיל. מספר מופעי התהליך" + "הפועלים כעת = 2", responseBody); responseBody = this.mockMvc .perform (MockMvcRequestBuilders.get ("/ start-process")) .andReturn (). getResponse (). getContentAsString (); assertEquals ("התהליך התחיל. מספר מופעי התהליך" + "הפועלים כעת = 3", responseBody); } 

3. משחק עם תהליכים

עכשיו שיש לנו תהליך פועל ב- Activiti באמצעות Spring Boot בואו נרחיב את הדוגמה שלעיל כדי להדגים כיצד אנו יכולים לגשת לתהליך ולשמור עליו.

3.1. קבל את רשימת משימות לנתון ProcessInstance

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

האובייקטים, כמו מְשִׁימָה, לא ניתן לשלוח כתגובה ישירות ולכן עלינו ליצור אובייקט מותאם אישית ולהמיר את מְשִׁימָה לאובייקט המותאם אישית שלנו. אנחנו נקרא לשיעור הזה הצגת משימות:

class TaskRepresentation {private String id; שם מחרוזת פרטי; תהליך מחרוזת פרטיInstanceId; // בונים סטנדרטיים}

שיטת המטפל תיראה כך:

@ GetMapping ("/ get-Tasks / {processInstanceId}") רשימה רשימת ציבורים getTasks (@PathVariable String processInstanceId) {List usertasks = taskService.createTaskQuery () .processInstanceId (processInstanceId) .list (); להחזיר usertasks.stream () .map (task -> TaskRepresentation חדש (task.getId (), task.getName (), task.getProcessInstanceId ())) .collect (Collectors.toList ()); } 

פה, taskService.createTaskQuery (). processInstanceId (processInstanceId) .list () שימושים TaskService ומביא לנו את רשימת המשימות הקשורות לנתון processInstanceId. אנו יכולים לראות שכאשר נתחיל להריץ את התהליך שיצרנו, נקבל את המשימה א על ידי הגשת בקשה לשיטה שהגדרנו זה עתה:

@Test ציבורי בטל givenProcess_whenProcessInstance_thenReceivedRunningTask () זורק חריג {this.mockMvc.perform (MockMvcRequestBuilders.get ("/ תהליך תהליך")). AndReturn () .getResponse (); ProcessInstance pi = runtimeService.createProcessInstanceQuery () .orderByProcessInstanceId () .desc () .list () .get (0); מחרוזת responseBody = this.mockMvc .perform (MockMvcRequestBuilders.get ("/ get-משימות /" + pi.getId ())). AndReturn () .getResponse () .getContentAsString (); ממפה ObjectMapper = ObjectMapper חדש (); משימות רשימה = Arrays.asList (ממפה .readValue (responseBody, TaskRepresentation []. Class)); assertEquals (1, task.size ()); assertEquals ("A", Tasks.get (0) .getName ()); }

3.2. השלמת א מְשִׁימָה

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

@GetMapping ("/ complete-task-A / {processInstanceId}") חלל ציבורי completeTaskA (@PathVariable String processInstanceId) {Task task = taskService.createTaskQuery () .processInstanceId (processInstanceId) .singleResult (); taskService.complete (task.getId ()); }

taskService.createTaskQuery (). processInstanceId (processInstanceId) .singleResult () יוצר שאילתה על שירות המשימות ונותן לנו את משימת הנתון processInstance. זה משימת משתמש א. השורה הבאה taskService.complete (task.getId) מסיים משימה זו.

לפיכך, כעת התהליך הגיע לסופו ול RuntimeService אינו מכיל ProcessInstances. אנו יכולים לראות זאת באמצעות מקרה הבדיקה JUnit:

@Test הציבור בטל givenProcess_whenCompleteTaskA_thenNoProcessInstance () זורק חריג {this.mockMvc.perform (MockMvcRequestBuilders.get ("/ תהליך תהליך")). AndReturn () .getResponse (); ProcessInstance pi = runtimeService.createProcessInstanceQuery () .orderByProcessInstanceId () .desc () .list () .get (0); this.mockMvc.perform (MockMvcRequestBuilders.get ("/ complete-task-A /" + pi.getId ())). andReturn () .getResponse () .getContentAsString (); רשימת רשימה = runtimeService.createProcessInstanceQuery (). List (); assertEquals (0, list.size ()); }

כך אנו יכולים להשתמש בשירותי Activiti לעבוד עם תהליכים.

4. מסקנה

במאמר זה עברנו על סקירה כללית של השימוש ב- API של Activiti עם Spring Boot. מידע נוסף על ה- API ניתן למצוא במדריך למשתמש. ראינו גם כיצד ליצור תהליך ולבצע בו פעולות שונות באמצעות שירותי Activiti.

Spring Boot מקל על השימוש מכיוון שאיננו צריכים לדאוג ליצירת מסד הנתונים, פריסת התהליכים או יצירת ה- ProcessEngine.

זכור שהשילוב של Activiti עם Spring Boot נמצא עדיין בשלב הניסוי והוא עדיין לא נתמך על ידי Spring Boot 2.

כמו תמיד, ניתן למצוא יישום של כל הדוגמאות שראינו ב- GitHub.


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