Java tarafından çağrılan BPMN işlemi
Mikro hizmetim, girdi olarak bir Araba DTO'sunu kabul ettiği (aşağıdaki gibi) bir Rest uç noktasına (getLocationForCar ()) sahiptir, arabayı bir konumda bulmak için bazı iş mantığına sahiptir ve Konum DTO'sunu döndürür (aşağıdaki gibi).
class Car {
String carId;
String carName;
String carType;
String carModel;
String carMake;
}
class Location {
String locationId;
String locationType;
String locationAddress;
}
İş mantığını BPMN ve DMN'ye taşımak istiyorum. BPMN ve DMN'de yeniyim. Camunda'nın birkaç öğreticisinden geçtim ve bunu Camunda ile nasıl çalıştırabileceğimi düşündüm:
- İnput = carId ve output = locationId ile sabit kodlanmış bir DMN tablosu oluşturun.
- Bir BPMN diyagramı oluşturun.
- başlangıç ->
- Rest webservice (getLocationForCar ()) 'a iletilen Car DTO'dan carId'i ayıklayın ->
- carId'yi ona vermek için DMN'yi arayın ->
- DMN'nin çıktısını java sürecine gönderin, böylece bir web hizmeti (getLocationForCar ()) yanıtı olarak gönderilebilir
Bu yaklaşımın sorunları var (aşağıdaki soruların yanıtlanması için yardıma ihtiyacım var):
- Java Rest Webservice kodundan bir BPMN işlemi nasıl çağırılır?
- Car Nesnesini BPMN'ye nasıl geçirebilirim ki carId'yi çıkarabilir, DMN tablosunda kullanabilir ve çıktıyı alabilir?
- Java kodu, gerekli yanıt nesnesini döndürmek için kullanılabilecek BPMN işleminden veya DMN tablosundan nasıl çıktı alacaktır
Camunda'yı (üçüncü bölüm kitaplığı) kullanmak ek yük gibi görünüyor çünkü Camunda kendi sunucusunda çalışıyor ve bunun üzerine bpmn, dmn konuşlandırılıyor, bu sürecimi yavaşlatır. Bu yüzden JBPM'ye daha fazla eğiliyorum (bunlardan herhangi birini kullanarak ihtiyacımı yerine getirip getiremeyeceğime dair hiçbir fikrim olmasa da).
Yanıtlar
DMN, iş mantığınızı çıkarmanın iyi bir yoludur. Imho Camunda en iyi lightweigt ve bunu yapmanın ücretsiz yolu.
İşte sana bir örnek
- Sadece bu iki bağımlılığı kullanın:
org.camunda.bpm.dmn: camunda-engine-dmn
org.camunda.bpm.dmn: camunda-engine-dmn-bom
- DmnEngine oluşturun:
DmnEngine dmnEngine = DmnEngineConfiguration
.createDefaultDmnEngineConfiguration()
.buildEngine();
- Camunda Modeler ile DMN Dosyası Oluşturun (ücretsizdir).
- Karar değerlendirmesi için değişkenleri hazırlayın:
VariableMap variables = Variables
.putValue("carId", carId)
.putValue("carName", carName);
.putValue("carType", carType);
.putValue("carModel", carModel);
.putValue("carMake", carMake);
- 3. adımdaki kararı ayrıştırın (XML kodunu Camunda Modeler'den kopyalayın ve projenizdeki yeni bir xml dosyasına yapıştırın)
InputStream inputStream = CarDecider.class.getResourceAsStream("carDecisionFile.xml");
- Kararı değerlendirin
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());
}
}
}
Daha karmaşık DMN diyagramları kullanmak istiyorsanız, Karar Gereksinimleri Grafiğini kullanabilirsiniz (bkz: https://docs.camunda.org/manual/7.6/reference/dmn11/drg/). Camunda ile, örneğinizde ihtiyaç duyduğunuz gibi birden fazla çıktı değerine sahip olabilirsiniz. Ayrıca, Feel Scala gibi Camunda için Extensions'ı kullanabilirsiniz, bununla DMN dosyalarınızda fonksiyonları kullanabilirsiniz. Ayrıca, DMN için kendi özel işlevlerinizi yazabilirsiniz. Bu yaklaşımla Camunda Platformunu kullanmanıza gerek yok. Sadece 2 bağımlılıkla mantığınızı bu DMN dosyalarına taşıyabilirsiniz. Camunda Modeler ile dmn dosyalarını yükleyebilirsiniz: örneğin bu dosyaları alan ve bir veritabanına kaydeden bir mikro hizmet oluşturabilirsiniz. DmnEngine mikro hizmetiniz bu dosyaları yükleyecek ve kararı değerlendirecektir.