Повторите попытку с компенсационной активностью в камунде

#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)