Как установить переменную процесса BPMN из результата пользовательской задачи? - PullRequest
2 голосов
/ 27 июня 2019

У меня есть простой процесс утверждения BPMN. Я хочу назначить результат (вывод данных?) Из пользовательской задачи («Одобрить») переменной процесса, которая затем используется в эксклюзивном шлюзе, следующем за этой пользовательской задачей. Результат задачи пользователя устанавливается в Java в карте данных / переменных при выполнении задачи. Что бы я ни пытался и искал, я не мог заставить его работать. Я получаю сообщение об ошибке «XOR split не может найти хотя бы одно действующее исходящее соединение для split Approved?». Может кто-нибудь помочь, пожалуйста?

Я пытался указать с и а и многое другое.

Мой источник BPMN:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL"
             xmlns:ns2="http://www.omg.org/spec/DD/20100524/DI"
             xmlns:ns3="http://www.omg.org/spec/DD/20100524/DC"
             xmlns:ns4="http://www.omg.org/spec/BPMN/20100524/DI"
             targetNamespace="http://www.omg.org/bpmn20">

  <itemDefinition id="_approval" isCollection="false" structureRef="java.lang.Boolean"/>

  <process id="modelio-approval"
           name="Process"
           isClosed="false"
           processType="None">

    <property id="approval" name="approval" itemSubjectRef="_approval"/>

    <startEvent id="StartId"
                name="Start"
                isInterrupting="true"
                parallelMultiple="false">
      <outgoing>FromStartToApprove</outgoing>
    </startEvent>

    <sequenceFlow id="FromStartToApprove"
                  name="FromStartToApprove"
                  sourceRef="StartId"
                  targetRef="ApproveId"/>

    <userTask id="ApproveId"
              name="Approve"
              isForCompensation="false"
              startQuantity="1"
              completionQuantity="1">
      <incoming>FromStartToApprove</incoming>
      <outgoing>ToApprovedGateway</outgoing>
      <ioSpecification>
        <dataOutput id="approvalOutRef" itemSubjectRef="_approval" name="approvalOut"/>
        <outputSet id="OutputSet_1">
          <dataOutputRefs>approvalOutRef</dataOutputRefs>
        </outputSet>
      </ioSpecification>
      <dataOutputAssociation id="doAssIdApproval">
        <sourceRef>approvalOutRef</sourceRef>
        <targetRef>approval</targetRef>
      </dataOutputAssociation>
    </userTask>

    <sequenceFlow id="ToApprovedGateway"
                  name="ToApprovedGateway"
                  sourceRef="ApproveId"
                  targetRef="ApprovedGateway"/>

    <exclusiveGateway id="ApprovedGateway"
                      name="Approved?"
                      gatewayDirection="Diverging">
      <incoming>ToApprovedGateway</incoming>
      <outgoing>ToFinish</outgoing>
      <outgoing>ToDisapproved</outgoing>
    </exclusiveGateway>

    <sequenceFlow id="ToFinish"
                  name="ToFinish"
                  sourceRef="ApprovedGateway"
                  targetRef="FinishId">
      <conditionExpression>approval == true</conditionExpression>
    </sequenceFlow>

    <sequenceFlow id="ToDisapproved"
                  name="disapproved"
                  sourceRef="ApprovedGateway"
                  targetRef="DisapprovedId">
      <conditionExpression>approval == false</conditionExpression>
    </sequenceFlow>

    <userTask id="FinishId"
              name="Finish"
              isForCompensation="false"
              startQuantity="1"
              completionQuantity="1">
      <incoming>ToFinish</incoming>
      <outgoing>ToEnd</outgoing>
    </userTask>

    <sequenceFlow sourceRef="FinishId"
                  targetRef="EndId"
                  name="ToEnd"
                  id="ToEnd"/>

    <endEvent id="EndId" name="End">
      <incoming>ToEnd</incoming>
    </endEvent>

    <endEvent id="DisapprovedId" name="Disapproved">
      <incoming>ToDisapproved</incoming>
    </endEvent>

  </process>

</definitions>

В коде Java я пытаюсь установить данные задачи «утверждение» для пользовательской задачи «Утверждение» следующим образом:

Map<String, Object> data = new HashMap(1);
data.put("approvalOut", true);
taskService.complete(taskId, userId, data);

Но всегда появляется сообщение об ошибке:

Ошибка: [modelio-Approving: 25 - Approved?: 6] - XOR split не смог найти хотя бы одно действующее исходящее соединение для split Approved?

Я ожидаю, что поток перейдет к задаче "Завершить" (sequenceFlow "ToFinish"), но получит ошибку "XOR split не может найти хотя бы одно действующее исходящее соединение для разделения Approved?".

Должен ли я использовать данные для ввода вместо вывода? Что на самом деле устанавливает taskService.complete(taskId, userId, data);? К сожалению нет Javadoc .

1 Ответ

1 голос
/ 01 июля 2019

Проблема в том, что ваша задача не может вывести свои данные в процесс и, следовательно, в XOR. Я думаю, что ваше отображение вывода задачи неверно.

Быстрое решение:

  1. Нажмите на вашу задачу пользователя (Одобрить) в редакторе и перейдите в окно свойств. Найдите раздел под названием «Задания».
  2. В «Входах и назначениях данных» создайте переменную с именем «userAction» типа boolean.
  3. В «Выходных данных и назначениях» используйте то же имя «userAction», введите «boolean» и в «target» выберите переменную процесса «Approval». в 'target' он должен быть доступен в раскрывающемся списке, иначе учтите, что при создании переменной процесса произошла ошибка.
  4. Сохраните и разверните свой bpmn.
  5. Код Java для выполнения изменится на
Map<String, Object> data = new HashMap(1);
data.put("userAction", true);
taskService.complete(taskId, userId, data);

Пожалуйста, попробуйте это решение и дайте мне знать, если у вас возникнут какие-либо проблемы.

Объяснение: Для этого вам необходимо понять область действия различных переменных.

  1. Переменные процесса - они доступны для всех элементов процесса.

  2. Переменные задачи - они создаются при запуске задачи и уничтожаются при ее завершении.

Когда мы проектируем задачу, мы создаем переменные задачи. Если нам нужен какой-либо ввод для этой задачи, «назначение ввода» используется для преобразования данных переменных процесса в переменные задачи. Переменные задачи используются для обработки задачи. Когда работа над задачей завершена, и если нам нужно отправить выходные данные задачи, то переменные задачи сопоставляются с переменными процесса с помощью «назначения вывода».

Дайте мне знать, если у вас есть сомнения. Рад помочь вам.

...