ProcessInstanceQuery не возвращает результат во второй задаче обслуживания после эксклюзивного шлюза в камунде

#spring #camunda

Вопрос:

У меня есть бизнес с какой-то служебной задачей, которую эксклюзивный шлюз решает переключить между ними. поэтому для добавления других переменных для обработки в следующей задаче обслуживания мне нужно запросить api camunda orderBestProviders , но он ничего не возвращает! смотрите мой код:

     @Override
    @Transactional
    public void startProcess(MerchantRequestDto dto) {
        dto.setId(UUID.randomUUID().toString());

        Map<String, Object> map = new HashMap<>();
        map.put("modelId", dto.getId());
        map.put("input", dto);
        log.info(map.get("modelId"));
        runtimeService.createProcessInstanceByKey("SwitchEngine")
                .setVariables(map)
                .businessKey(switchProcessKey   dto.getId())
                .execute();
    }

    @Override
    @Transactional
    public void orderBestProviders(String modelId) {
        Stack<Long> orderedProviders = new Stack<>();
        orderedProviders.push(10L);
        orderedProviders.push(1L);
        orderedProviders.push(2L);

        ProcessInstance instance = runtimeService.createProcessInstanceQuery()
                .processInstanceBusinessKey(switchProcessKey   modelId)
                .singleResult();

        Map<String, Object> map = new HashMap<>();
        map.put("providers", orderedProviders);
        map.put("providerExists", orderedProviders.size() > 0);

        String processInstanceId = instance.getProcessInstanceId();
        runtimeService.setVariables(
                processInstanceId, map
        );
    }
 

что случилось?
есть ли другой способ решить это требование?

Ответ №1:

основываясь на управлении транзакциями в камунде (см. Эту ссылку), транзакция не фиксируется до тех пор, пока процесс не увидит состояния ожидания, поэтому я не могу получить переменные процесса из такого запроса:

 runtimeService.createProcessInstanceQuery()
                .processInstanceBusinessKey(switchProcessKey   modelId)
                .singleResult();
 

наконец, для решения этой проблемы я ввожу выполнение в метод, и моя проблема решена

 import org.camunda.bpm.engine.runtime.Execution;

@Override
public void orderBestProviders(Execution execution) {
    Stack<Long> orderedProviders = new Stack<>();
    orderedProviders.push(10L);
    orderedProviders.push(1L);
    orderedProviders.push(2L);

    Map<String, Object> map = new HashMap<>();
    map.put("providers", orderedProviders);
    map.put("providerExists", orderedProviders.size() > 0);

    runtimeService.setVariables(
            execution.getId(), map
    );
}