Процесс BPMN, запущенный Java
У моего микросервиса есть конечная точка отдыха (getLocationForCar ()), где он принимает в качестве входных данных Car DTO (как показано ниже), имеет некоторую бизнес-логику для поиска автомобиля в определенном месте и возвращает Location DTO (как показано ниже).
class Car {
String carId;
String carName;
String carType;
String carModel;
String carMake;
}
class Location {
String locationId;
String locationType;
String locationAddress;
}
Я хочу перенести бизнес-логику в BPMN и DMN. Я новичок в BPMN и DMN. Я просмотрел несколько руководств Camunda и подумал, что вот как я могу заставить это работать с Camunda:
- Создайте жестко запрограммированную таблицу DMN с input = carId и output = locationId.
- Создайте диаграмму BPMN с
- начало ->
- извлечь carId из Car DTO, который передается веб-сервису Rest (getLocationForCar ()) ->
- позвоните в DMN, чтобы передать ему carId ->
- отправить вывод DMN в java-процесс, чтобы его можно было отправить как ответ веб-службы (getLocationForCar ())
У этого подхода есть проблемы (мне нужна помощь, чтобы получить ответы на следующие вопросы):
- Как вызвать процесс BPMN из кода Java Rest Webservice?
- Как передать объект Car в BPMN, чтобы он мог извлечь carId, использовать его в таблице DMN и получить результат?
- Как Java-код получит вывод из процесса BPMN или таблицы DMN, который можно использовать для возврата требуемого объекта ответа
Использование Camunda (библиотеки третьей части) кажется накладными расходами, потому что Camunda работает на своем собственном сервере и на нем развернуты bpmn, dmn, это замедлит мой процесс. Поэтому я больше склоняюсь к JBPM (хотя я понятия не имею, смогу ли я выполнить свои требования, используя что-либо из этого).
Ответы
DMN - хороший способ извлечь вашу бизнес-логику. Имхо Камунда - лучшая легковесная и бесплатная возможность сделать это.
Вот вам пример
- Просто используйте эти две зависимости:
org.camunda.bpm.dmn: camunda-engine-
dmn org.camunda.bpm.dmn: camunda-engine-dmn-bom
- Создайте DmnEngine:
DmnEngine dmnEngine = DmnEngineConfiguration
.createDefaultDmnEngineConfiguration()
.buildEngine();
- Создайте файл DMN с помощью Camunda Modeler (бесплатно).
- Подготовьте переменные для оценки решения:
VariableMap variables = Variables
.putValue("carId", carId)
.putValue("carName", carName);
.putValue("carType", carType);
.putValue("carModel", carModel);
.putValue("carMake", carMake);
- Решение синтаксического анализа из шага 3 (скопируйте XML-код из Camunda Modeler и вставьте в новый XML-файл в своем проекте)
InputStream inputStream = CarDecider.class.getResourceAsStream("carDecisionFile.xml");
- Оценить решение
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());
}
}
}
Если вы хотите использовать более сложные DMN-диаграммы, вы можете использовать Decision Requirements Graph (см .: https://docs.camunda.org/manual/7.6/reference/dmn11/drg/). С Camunda вы можете иметь несколько выходных значений, как вам это нужно в вашем примере. Более того, вы можете использовать расширения для Camunda, такие как Feel Scala, с помощью которых вы можете использовать функции в своих файлах DMN. Кроме того, вы можете написать свои собственные пользовательские функции для DMN. При таком подходе вам не нужно использовать платформу Camunda. Всего с двумя зависимостями вы можете переместить свою логику в эти файлы DMN. С помощью Camunda Modeler вы можете загружать файлы dmn: например, вы можете создать микросервис, который получает эти файлы и сохраняет их в базе данных. Ваш микросервис DmnEngine загрузит эти файлы и оценит решение.