#java #spring-boot #microservices #camunda
Вопрос:
У меня есть 3 микросервиса, и я пытаюсь реализовать компенсационную деятельность для каждой службы. Теперь допустим, что после срабатывания события компенсации ошибок и теперь это действие компенсации само выдает ошибку. Если действие компенсации завершится неудачно, я хочу повторить его 5 раз. Вот пример кода, который я реализовал, но он не работает. Любые предложения по этому поводу.
public static BpmnModelInstance createSaga() {
// define saga as BPMN process
ProcessBuilder flow = Bpmn.createExecutableProcess("poc");
// - flow of activities and compensating actions
flow.startEvent()
.serviceTask("Project2").name("Save Project2").camundaClass(SaveProject2.class)
.boundaryEvent().compensateEventDefinition().compensateEventDefinitionDone()
.compensationStart().serviceTask("RollbackProject2").camundaClass(RollbackProject2.class).camundaFailedJobRetryTimeCycle("R5/PT5S").compensationDone()
.serviceTask("Project3").name("Save Project3").camundaClass(SaveProject3.class)
.boundaryEvent().compensateEventDefinition().compensateEventDefinitionDone()
.compensationStart().serviceTask("RollbackProject3").camundaFailedJobRetryTimeCycle("R5/PT1M").camundaClass(RollbackProject3.class).compensationDone()
.serviceTask("Project4").name("Save Project4").camundaClass(SaveProject4.class)
.boundaryEvent().compensateEventDefinition().compensateEventDefinitionDone()
.compensationStart().serviceTask("RollbackProject4").camundaClass(RollbackProject4.class).compensationDone()
.endEvent();
// - trigger compensation in case of any exception (other triggers are possible)
flow.eventSubProcess()
.startEvent().error("java.lang.Throwable")
.intermediateThrowEvent().compensateEventDefinition()
.compensateEventDefinitionDone()
.endEvent();
// ready
BpmnModelInstance saga = flow.done();
Ответ №1:
Вы можете активировать асинхронное продолжение в Задаче обслуживания, обрабатывающей компенсацию, что позволяет настроить параметры повторных попыток для компенсации.
Комментарии:
1. Все еще не работает — flow.startEvent() .ServiceTask(«Проект 2»).имя(«Сохранить проект 2»).camundaClass(SaveProject2.class) .boundaryEvent().camundaAsyncBefore(true).compensateEventDefinition().compensateEventDefinitionDone().compensationStart().serviceTask(«RollbackProject2»).camundaClass(RollbackProject2.class).camundaFailedJobRetryTimeCycle(«R5/PT5S»).compensationDone() .Задача службы(«Проект 3»).имя(«Сохранить проект 3»).Класс camundaClass(SaveProject3.class) .boundaryEvent().camundaAsyncBefore(true).compensateEventDefinition().compensateEventDefinitionDone()
2. Я недостаточно ясно выразился: асинхронное продолжение должно быть добавлено в служебную задачу, обрабатывающую компенсацию, а не событие границы компенсации. Я отредактировал свой ответ.
3. Извините за поздний ответ, на самом деле я застрял с другими задачами…
4. Все еще не работает — flow.startEvent().ServiceTask(«Проект 2»).имя(«Сохранить Project2»).camundaClass(SaveProject2.class).boundaryEvent().compensateEventDefinition().compensateEventDefinitionDone().compensationStart().serviceTask(«RollbackProject2»).camundaClass(RollbackProject2.class).camundaAsyncBefore(true).camundaFailedJobRetryTimeCycle(«R5/PT5S»).compensationDone().serviceTask(«Project3»).name(«Сохранить Project3»).camundaClass(SaveProject3.class).boundaryEvent().compensateEventDefinition().compensateEventDefinitionDone().compensationStart().serviceTask(«RollbackProject3»).camundaAsyncBefore(true)