Экземпляры процесса запроса на основе имени начального сообщения

ENV: стандарт 7.4, BPMN 2.0

Дан процесс, который может быть запущен несколькими событиями стартового сообщения.

  1. можно ли запрашивать экземпляры процесса, запущенные конкретными сообщениями, идентифицированными по имени сообщения?
  2. если да, то как?
  3. если нет, то почему?
  4. если не сейчас, то когда?

Некоторые API, такие как IncidentMessages?


person dobedo    schedule 09.05.2016    source источник


Ответы (1)


Это не стандартная функция, но ее легко реализовать с помощью переменных процесса.

Основные шаги:

1. Реализуйте прослушиватель выполнения, который устанавливает имя сообщения как переменную:

public class MessageStartEventListener implements ExecutionListener {

  public void notify(DelegateExecution execution) throws Exception {
    execution.setVariable("startMessage", "MessageName");
  }
}

Обратите внимание, что через DelegateExecution#getBpmnModelElementInstance вы можете получить доступ к элементу BPMN, к которому подключен прослушиватель, поэтому вы можете динамически определять имя сообщения.

2. Объявите прослушиватель выполнения в событиях запуска сообщения:

<process id="executionListenersProcess">
  <startEvent id="theStart">
    <extensionElements>
      <camunda:executionListener
          event="start" class="org.camunda.bpm.examples.bpmn.executionlistener.MessageStartEventListener" />
    </extensionElements>
    <messageEventDefinition ... />
  </startEvent>

  ...
</process>

Обратите внимание, что с помощью прослушивателя синтаксического анализа BPMN вы можете программно добавить такой прослушиватель к каждому событию запуска сообщения в каждом определении процесса. См. этот пример .

3. Сделать фильтрацию запроса экземпляра процесса по этой переменной

RuntimeService runtimeService = processEngine.getRuntimeService();
List<ProcessInstance> matchingInstances = runtimeService
  .createProcessInstanceQuery()
  .variableValueEquals("startMessage", "MessageName")
  .list();
person thorben    schedule 09.05.2016
comment
Неплохой обходной путь с комбинацией шагов 1 и 2. Любые аргументы в пользу того, чтобы не превращать это в: а) механизм, такой как инициатор, б) внутреннее поле экземпляра процесса, startByMessage, например, businessKey - person dobedo; 09.05.2016
comment
Я предполагаю, что это потому, что ваше требование редко запрашивается, и вышеуказанное решение работает нормально. Если вы заинтересованы в подробном обсуждении, я предлагаю вам обсудить это на форумах Camunda: forum.camunda.org - person thorben; 09.05.2016