Отправка Message в bproc

Добрый вечер.

Подскажите, пожалуйста, возможно ли и каким образом бросить “снаружи” message и/или signal в экземпляр процесса?

Отвечу сам себе. В core-модуле можно выполнить следующее:

final RuntimeService runtimeService = ProcessEngines.getDefaultProcessEngine().getRuntimeService();
runtimeService.messageEventReceived(messageName, executionId);

Все работает. Правда теперь есть два дополнительных вопроса:

  1. Странно, что сообщение бросается по имени, а не по идентификатору. Есть возможность получить имя сигнала по его идентификатору? Или Id тут чисто “кубинская” добавка?
    image
  2. Аналогичный вопрос по executionId, возможно ли найти всех подписчиков (executionId) данного сообщения, дабы не хардкодить id?

Здравствуйте,

  1. Id - это не кубинская добавка. В XML с процессом, например, видно, что все сслыки на signal, message, и т.п. внутри модели осуществляеются по его id. В качестве примера signal boundary event:
    <boundaryEvent id="BoundaryEvent_0wvfpwh" attachedToRef="Task_1utj4v2">
      <signalEventDefinition signalRef="signal1" />
    </boundaryEvent>

signal1 здесь - это id сигнала.

Почему в API Flowable используются имена сообщений и сигналов, а не идентификаторы, я не знаю, многим интуитивно хочется передать туда id. Подумаем, может быть как-то получится с нашей стороны облегчить эту “неявность”.

Получить список сигналов процесса можно из объекта BpmnModel. Сам объект получается так:

BpmnModel bpmnModel = ProcessEngines.getDefaultProcessEngine()
     .getRepositoryService()
     .getBpmnModel(processDefinitionId);

Далее вызывается у него соответствующий метод: getSignals(), getMessages() и т.д.

  1. Вы что-то подобное имеете в виду?
List<ExecutionData> executions = bprocRuntimeService.createExecutionDataQuery()
          .signalEventSubscriptionName("signal1")
          .list();
1 симпатия