Activiti - 信号和调用 Activity

Activiti - Signal and Call Activity

下面是我们的Activiti(5.21版本)主图: 代码:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
  <signal id="alertSignal" name="alert"></signal>
  <process id="Call" name="Call" isExecutable="true">
    <callActivity id="callactivity1" name="Call activity 1" calledElement="Call1">
      <extensionElements>
    <activiti:in source="VARIABLE1" target="VARIABLE1"></activiti:in>
    <activiti:in source="VARIABLE2" target="VARIABLE2"></activiti:in>
       </extensionElements>
    </callActivity>
    <callActivity id="callactivity2" name="Call activity 2" calledElement="Call2">
      <extensionElements>
    <activiti:in source="VARIABLE1" target="VARIABLE1"></activiti:in>
    <activiti:in source="VARIABLE2" target="VARIABLE2"></activiti:in>
      </extensionElements>
    </callActivity>
    <callActivity id="callactivity3" name="Call activity 3" calledElement="Call3">
      <extensionElements>
    <activiti:in source="VARIABLE1" target="VARIABLE1"></activiti:in>
    <activiti:in source="VARIABLE2" target="VARIABLE2"></activiti:in>
      </extensionElements>
    </callActivity>
    <startEvent id="startevent1" name="Start"></startEvent>
    <endEvent id="endevent1" name="End"></endEvent>
    <endEvent id="endevent2" name="End"></endEvent>
    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="callactivity1"></sequenceFlow>
    <sequenceFlow id="flow2" sourceRef="callactivity1" targetRef="callactivity2"></sequenceFlow>
    <sequenceFlow id="flow3" sourceRef="callactivity2" targetRef="endevent1"></sequenceFlow>
    <sequenceFlow id="flow4" sourceRef="callactivity3" targetRef="endevent2"></sequenceFlow>
    <boundaryEvent id="boundarysignal1" name="Signal" attachedToRef="callactivity1" cancelActivity="true">
      <signalEventDefinition signalRef="alertSignal"></signalEventDefinition>
    </boundaryEvent>
    <sequenceFlow id="flow5" sourceRef="boundarysignal1" targetRef="callactivity3"></sequenceFlow>
  </process>
</definitions>

第一个电话 activity: 代码:

<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:activiti="http://activiti.org/bpmn" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:omgdc="http://www.omg.org/spec/DD/20100524/DC" xmlns:omgdi="http://www.omg.org/spec/DD/20100524/DI" typeLanguage="http://www.w3.org/2001/XMLSchema" expressionLanguage="http://www.w3.org/1999/XPath" targetNamespace="http://www.activiti.org/test">
  <signal id="alertSignal" name="alert"></signal>
  <process id="Call1" name="Call1" isExecutable="true">
    <startEvent id="startevent1" name="Start"></startEvent>
    <userTask id="test-a" name="test-a">
      <extensionElements>
    <activiti:taskListener event="create" expression="#{VARIABLE1.allow(task)}"></activiti:taskListener>
      </extensionElements>
    </userTask>
    <parallelGateway id="parallelgateway1" name="Parallel Gateway"></parallelGateway>
    <userTask id="test-b" name="test-b">
      <extensionElements>
    <activiti:taskListener event="create" expression="#{VARIABLE1.allow(task)}"></activiti:taskListener>
      </extensionElements>
    </userTask>
    <endEvent id="endevent1" name="End"></endEvent>
    <sequenceFlow id="flow1" sourceRef="startevent1" targetRef="test-a"></sequenceFlow>
    <sequenceFlow id="flow2" sourceRef="test-a" targetRef="parallelgateway1"></sequenceFlow>
    <sequenceFlow id="flow3" sourceRef="parallelgateway1" targetRef="test-b"></sequenceFlow>
    <sequenceFlow id="flow4" sourceRef="test-b" targetRef="endevent1"></sequenceFlow>
    <intermediateThrowEvent id="signalintermediatethrowevent1" name="SignalThrowEvent">
      <signalEventDefinition signalRef="alertSignal"></signalEventDefinition>
    </intermediateThrowEvent>
    <sequenceFlow id="flow5" sourceRef="parallelgateway1" targetRef="signalintermediatethrowevent1"></sequenceFlow>
  </process>
</definitions>

问题是变量 "VARIABLE1" 和 "VARIABLE2" 没有传递给 "Call activity 2",我猜边界信号可能有问题?因为它们正在传递给 "Call Activity 1"。有什么想法吗?

你怎么知道变量没有被发送到 Call Activity 2? 您是否在进程启动时注入变量?

我问是因为如果你在到达 Called Activity 1 之前没有初始化流程变量,那么它们实际上不会作为变量传递到子流程中,而是在实例化时初始化调用 activity 1 个子进程。

因此,如果变量在调用 Activity 1 的入口处不存在,则没有变量传递给调用 activity 2

这应该是一个相对容易创建的单元测试,用于演示可以解决您的场景中的任何问题。

谢谢 格雷格