Pengenalan Activiti dengan Spring

1. Gambaran keseluruhan

Ringkasnya, Activiti adalah alur kerja dan platform Pengurusan Proses Perniagaan.

Kita dapat memulakan dengan cepat dengan membuat ProcessEngineConfiguration (biasanya berdasarkan fail konfigurasi). Dari ini, kita dapat memperoleh ProcessEngine - dan melalui ProcessEngine, kita dapat melaksanakan aliran kerja & operasi BPM.

API menyediakan pelbagai perkhidmatan yang dapat digunakan untuk mengakses dan menguruskan proses. Perkhidmatan ini dapat memberi kami maklumat mengenai sejarah proses, proses yang sedang berjalan dan proses yang diterapkan tetapi belum berjalan.

Perkhidmatan juga boleh digunakan untuk menentukan struktur proses dan memanipulasi keadaan proses, seperti menjalankan, menangguhkan, membatalkan, dll.

Jika Anda baru menggunakan API, lihat Pengenalan API Activiti kami dengan Java . Dalam artikel ini, kita akan membincangkan bagaimana kita dapat mengatur Activiti API dalam aplikasi Spring Boot.

2. Persediaan Dengan Spring Boot

Mari lihat bagaimana kita dapat mengatur Activiti sebagai aplikasi Spring Boot Maven dan mula menggunakannya.

2.1. Persediaan Awal

Seperti biasa, kita perlu menambahkan kebergantungan maven:

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

Versi stabil terkini API boleh didapati di sini. Ia berfungsi dengan Spring Boot sehingga v1.5.4. Ia belum berfungsi dengan v2.0.0.M1.

Kami juga boleh menghasilkan projek Spring Boot menggunakan //start.spring.io dan pilih Activiti sebagai pergantungan.

Hanya dengan menambahkan ketergantungan ini dan anotasi @EnableAutoConfiguration ke Spring Boot Application, ia akan melakukan persediaan awal:

  • Buat Sumber Data (API memerlukan pangkalan data untuk membuat ProcessEngine )
  • Buat dan Paparkan kacang ProcessEngine
  • Buat dan Paparkan kacang perkhidmatan Activiti
  • Buat Pelaksana Kerja Spring

2.2. Membuat dan Menjalankan Proses

Mari kita bina contoh membuat dan menjalankan proses perniagaan.

Untuk menentukan proses, kita perlu membuat fail BPMN. Untuk ini, kita boleh menggunakan //activiti.alfresco.com/activiti-app/editor untuk membuat definisi proses.

Kemudian, muat turun fail BPMN. Kita perlu meletakkan fail ini di folder src / main / resources / processing. Secara lalai, Spring Boot akan mencari di folder ini untuk menerapkan definisi proses.

Kami akan membuat proses demo yang mengandungi satu tugas pengguna:

Penerima tugas pengguna ditetapkan sebagai Pemula proses. Fail BPMN untuk definisi proses ini kelihatan seperti:

Sekarang, kami akan membuat pengawal REST untuk menangani permintaan untuk memulakan proses ini:

@Autowired private RuntimeService runtimeService; @GetMapping("/start-process") public String startProcess() { runtimeService.startProcessInstanceByKey("my-process"); return "Process started. Number of currently running" + "process instances = " + runtimeService.createProcessInstanceQuery().count(); }

Di sini, runtimeService.startProcessInstanceByKey ("my-process") memulakan pelaksanaan proses yang kuncinya adalah "my-proses" . runtimeService.createProcessInstanceQuery (). hitung () akan memberi kita jumlah kejadian proses.

Setiap kali kita mencapai jalan "/ start-process" , ProcessInstance baru akan dibuat dan kita akan melihat kenaikan dalam jumlah proses yang sedang berjalan.

Kes ujian JUnit menunjukkan kepada kita tingkah laku ini:

@Test public void givenProcess_whenStartProcess_thenIncreaseInProcessInstanceCount() throws Exception { String responseBody = this.mockMvc .perform(MockMvcRequestBuilders.get("/start-process")) .andReturn().getResponse().getContentAsString(); assertEquals("Process started. Number of currently running" + " process instances = 1", responseBody); responseBody = this.mockMvc .perform(MockMvcRequestBuilders.get("/start-process")) .andReturn().getResponse().getContentAsString(); assertEquals("Process started. Number of currently running" + " process instances = 2", responseBody); responseBody = this.mockMvc .perform(MockMvcRequestBuilders.get("/start-process")) .andReturn().getResponse().getContentAsString(); assertEquals("Process started. Number of currently running" + " process instances = 3", responseBody); } 

3. Bermain Dengan Proses

Sekarang kita mempunyai proses yang sedang berjalan di Activiti menggunakan Spring Boot mari kita lanjutkan contoh di atas untuk menunjukkan bagaimana kita dapat mengakses dan memanipulasi proses tersebut.

3.1. Dapatkan Senarai Tugas untuk Proses yang Diberi

Kami mempunyai dua tugas-tugas pengguna A dan B . Apabila kita memulakan proses, ia akan menunggu untuk tugas pertama A siap dan akan melaksanakan tugas B . Mari kita mencipta kaedah pengendali yang menerima permintaan untuk melihat tugas-tugas yang berkaitan dengan yang diberikan processInstance .

Objek, seperti Task , tidak dapat dikirim sebagai respons langsung dan oleh itu kita perlu membuat objek khusus dan mengubah Task ke objek khusus kita. Kami akan memanggil kelas ini TaskRepresentation :

class TaskRepresentation { private String id; private String name; private String processInstanceId; // standard constructors }

Kaedah pengendali akan kelihatan seperti:

@GetMapping("/get-tasks/{processInstanceId}") public List getTasks( @PathVariable String processInstanceId) { List usertasks = taskService.createTaskQuery() .processInstanceId(processInstanceId) .list(); return usertasks.stream() .map(task -> new TaskRepresentation( task.getId(), task.getName(), task.getProcessInstanceId())) .collect(Collectors.toList()); } 

Di sini, taskService.createTaskQuery (). ProcessInstanceId (processInstanceId) .list () menggunakan TaskService dan memberi kami senarai tugas yang berkaitan dengan prosesInstanceId yang diberikan . Kita dapat melihat bahawa ketika kita mulai menjalankan proses yang kita buat, kita akan mendapat tugas A dengan membuat permintaan ke metode yang baru kita tentukan:

@Test public void givenProcess_whenProcessInstance_thenReceivedRunningTask() throws Exception { this.mockMvc.perform(MockMvcRequestBuilders.get("/start-process")) .andReturn() .getResponse(); ProcessInstance pi = runtimeService.createProcessInstanceQuery() .orderByProcessInstanceId() .desc() .list() .get(0); String responseBody = this.mockMvc .perform(MockMvcRequestBuilders.get("/get-tasks/" + pi.getId())) .andReturn() .getResponse() .getContentAsString(); ObjectMapper mapper = new ObjectMapper(); List tasks = Arrays.asList(mapper .readValue(responseBody, TaskRepresentation[].class)); assertEquals(1, tasks.size()); assertEquals("A", tasks.get(0).getName()); }

3.2. Menyelesaikan Tugas

Sekarang, kita akan lihat apa yang berlaku apabila kita lengkap tugas A . Kami mencipta kaedah pengendali yang akan mengendalikan permintaan untuk menyelesaikan tugas A untuk diberikan processInstance :

@GetMapping("/complete-task-A/{processInstanceId}") public void completeTaskA(@PathVariable String processInstanceId) { Task task = taskService.createTaskQuery() .processInstanceId(processInstanceId) .singleResult(); taskService.complete(task.getId()); }

taskService.createTaskQuery().processInstanceId(processInstanceId).singleResult() creates a query on the task service and gives us the task of the given processInstance. This is the UserTask A. The next line taskService.complete(task.getId) completes this task.

Hence, now the process has reached the end and the RuntimeService doesn't contain any ProcessInstances. We can see this using the JUnit test case:

@Test public void givenProcess_whenCompleteTaskA_thenNoProcessInstance() throws Exception { this.mockMvc.perform(MockMvcRequestBuilders.get("/start-process")) .andReturn() .getResponse(); ProcessInstance pi = runtimeService.createProcessInstanceQuery() .orderByProcessInstanceId() .desc() .list() .get(0); this.mockMvc.perform(MockMvcRequestBuilders.get("/complete-task-A/" + pi.getId())) .andReturn() .getResponse() .getContentAsString(); List list = runtimeService.createProcessInstanceQuery().list(); assertEquals(0, list.size()); }

This is how we can use Activiti services work with processes.

4. Conclusion

Dalam artikel ini, kami melihat gambaran keseluruhan penggunaan Activiti API dengan Spring Boot . Maklumat lebih lanjut mengenai API boleh didapati di panduan pengguna. Kami juga melihat bagaimana membuat proses dan melaksanakan pelbagai operasi di dalamnya menggunakan perkhidmatan Activiti.

Spring Boot menjadikannya mudah digunakan kerana kita tidak perlu bimbang untuk membuat pangkalan data, menyebarkan proses atau membuat ProcessEngine .

Perlu diingat bahawa integrasi Activiti dengan Spring Boot masih dalam fasa percubaan dan belum disokong oleh Spring Boot 2.

Seperti biasa, pelaksanaan semua contoh yang kita lihat dapat dilihat di GitHub.