Proses BPMN dipanggil oleh Java
Layanan mikro saya memiliki titik akhir Istirahat (getLocationForCar ()) di mana ia menerima DTO Mobil (seperti di bawah) sebagai masukannya, memiliki beberapa logika bisnis untuk menemukan mobil di suatu lokasi dan mengembalikan Lokasi DTO (seperti di bawah).
class Car {
String carId;
String carName;
String carType;
String carModel;
String carMake;
}
class Location {
String locationId;
String locationType;
String locationAddress;
}
Saya ingin memindahkan logika bisnis ke BPMN dan DMN. Saya baru mengenal BPMN dan DMN. Saya pergi melalui beberapa tutorial tentang Camunda dan berpikir ini adalah bagaimana saya bisa membuatnya bekerja dengan Camunda:
- Buat tabel DMN hardcode dengan input = carId dan output = locationId.
- Buat diagram BPMN yang memiliki file
- mulai ->
- ekstrak carId dari Car DTO yang diteruskan ke webservice Rest (getLocationForCar ()) ->
- panggil DMN untuk memberikan carId padanya ->
- kirim output DMN ke proses java sehingga bisa dikirim sebagai respons webservice (getLocationForCar ())
Pendekatan ini memiliki masalah (saya butuh bantuan untuk menjawab pertanyaan-pertanyaan berikut):
- Bagaimana cara memanggil proses BPMN dari kode Java Rest Webservice?
- Bagaimana cara mengirimkan Objek Mobil ke BPMN sehingga dapat mengekstrak carId, menggunakannya di tabel DMN dan mengembalikan output?
- Bagaimana kode java akan mendapatkan output dari proses BPMN atau tabel DMN, yang dapat digunakan untuk mengembalikan objek respons yang diperlukan
Menggunakan Camunda (perpustakaan bagian ketiga) tampaknya seperti overhead karena Camunda berjalan di servernya sendiri dan bpmn, dmn digunakan untuk itu, ini akan memperlambat proses saya. Jadi saya lebih condong ke arah JBPM (walaupun saya tidak tahu apakah saya dapat mencapai persyaratan saya menggunakan salah satu dari ini).
Jawaban
DMN adalah cara yang baik untuk mengekstrak logika bisnis Anda. Imho Camunda adalah lightweigt terbaik dan kemungkinan gratis untuk melakukan itu.
Berikut contoh untuk Anda
- Cukup gunakan dua dependensi ini:
org.camunda.bpm.dmn: camunda-engine-dmn
org.camunda.bpm.dmn: camunda-engine-dmn-bom
- Buat DmnEngine:
DmnEngine dmnEngine = DmnEngineConfiguration
.createDefaultDmnEngineConfiguration()
.buildEngine();
- Buat File DMN dengan Camunda Modeler (gratis).
- Siapkan variabel untuk evaluasi keputusan:
VariableMap variables = Variables
.putValue("carId", carId)
.putValue("carName", carName);
.putValue("carType", carType);
.putValue("carModel", carModel);
.putValue("carMake", carMake);
- Keputusan parse dari langkah 3 (salin kode XML dari Camunda Modeler dan tempelkan ke file xml baru di proyek Anda)
InputStream inputStream = CarDecider.class.getResourceAsStream("carDecisionFile.xml");
- Evaluasi keputusan
try {
DmnDecision decision = dmnEngine.parseDecision("decision", inputStream);
// evaluate decision
DmnDecisionTableResult result = dmnEngine.evaluateDecisionTable(decision, variables);
// print result
String desiredLocation = result.getSingleResult().getSingleEntry();
System.out.println("Decision: " + desiredLocation);
}
finally {
try {
inputStream.close();
}
catch (IOException e) {
System.err.println("Could not close stream: "+e.getMessage());
}
}
}
Jika Anda ingin menggunakan diagram DMN yang lebih kompleks, Anda dapat menggunakan Grafik Persyaratan Keputusan (lihat: https://docs.camunda.org/manual/7.6/reference/dmn11/drg/). Dengan Camunda Anda dapat memiliki beberapa nilai keluaran, seperti yang Anda butuhkan dalam contoh Anda. Selain itu, Anda dapat menggunakan Ekstensi untuk Camunda, seperti Feel Scala, dengan itu Anda dapat menggunakan fungsi di file DMN Anda. Selanjutnya Anda dapat menulis fungsi kustom Anda sendiri untuk DMN. Dengan pendekatan ini Anda tidak perlu menggunakan Platform Camunda. Hanya dengan 2 dependensi Anda dapat memindahkan logika Anda ke file DMN tersebut. Dengan Camunda Modeler Anda dapat mengunggah file dmn: misalnya Anda dapat membuat layanan mikro yang menerima file tersebut dan menyimpannya dalam database. Layanan mikro DmnEngine Anda akan memuat file itu dan mengevaluasi keputusan.