Перезапустить текущий процесс из прослушивателя сообщений jms - PullRequest
0 голосов
/ 09 июля 2020

У меня есть непрерывный рабочий процесс, который мне нужно приостановить на определенном этапе. Затем перезапустите тот же рабочий процесс из прослушивателя JMS на основе сообщения jms.

Здесь я написал делегата для приостановки процесса и сохраните processId вместе с другим идентификатором с именем PkgId.

@Slf4j
@Component
public class ValidationDelegate extends AbstractBaseUtil {

    protected Expression restEndPoint;

    @Autowired
    private ProcessInstancePkgIdMapRepository repo;

    @Override
    public void executeInternal(DelegateExecution delegateExecution) {

        RuntimeService runtimeService = CommandContextUtil.getProcessEngineConfiguration().getRuntimeService();
        runtimeService.suspendProcessInstanceById(delegateExecution.getProcessInstanceId());

        ProcessInstancePkgMap pkgMap= new ProcessInstancePkgMap ();
        pkgMap.setPkgId(1235L);
        pkgMap.setProcessInstanceId(delegateExecution.getProcessInstanceId());

        ProcessInstancePkgMap map = repo.save(pkgMap);

        log.info("saved map {}", map);
    }
}

Затем в отдельном классе, у которого есть метод, работающий как JMS Listener, прослушивает Tibco topi c с именем «test.topic». Этот метод получает сообщение от tibco topi c, которое содержит PkgId. Запрашивая репо с помощью PkgId, я могу найти соответствующий идентификатор экземпляра процесса, который был сохранен в ранее объясненном делегате. Я пытаюсь активировать приостановленный процесс впоследствии с идентификатором экземпляра процесса

@Component
public class JMSListener {

    @Autowired
    private RuntimeService runtimeService;

    @Autowired
    private ProcessInstancePkgIdMapRepository repo;

    @JmsListener(destination = "test.topic", containerFactory = "jmsListenerContainerFactory")
    public void receiveMessage(TextMessage message) throws Exception {

        ObjectMapper objectMapper = new ObjectMapper();
        ValidationMessage validationMessage = objectMapper.readValue(message.getText(), ValidationMessage.class);

        ProcessInstancePkgIdMap idMap =
                repo.findByPkgId(validationMessage.getPkgId());

        runtimeService.activateProcessInstanceById(idMap.getProcessInstanceId());

    }
} 

Но получение исключения как, org.flowable.common.engine.api.FlowableObjectNotFoundException: Cannot find processInstance for id ‘e84d407a-c043-11ea-b877-0a0027000002’., когда runtimeService.activateProcessInstanceById(idMap.getProcessInstanceId()); вызывается из вышеуказанного метода.

I проверил все экземпляры процесса через rest. Но результат был пуст. Что мне здесь не хватает? Прекращает ли процесс приостановку? Как можно перезапустить приостановленный / приостановленный рабочий процесс.

1 Ответ

0 голосов
/ 13 июля 2020

Вы не можете приостановить экземпляр процесса из служебной задачи в этом экземпляре процесса.

То, что вы ищете, - это запускаемая служебная задача, подробно описанная здесь . В двух словах, запускаемая служебная задача - это шаблон для запуска некоторой внешней работы, которая приведет к тому, что служебная задача будет находиться в состоянии ожидания, а затем вы можете запустить экземпляр процесса, когда получите JMS topi c. Затем вашему делегату потребуется реализовать TriggerableActivityBehavior.

...