BPMN2.0规范

目录

一、什么是BPMN2.0

BPMN2.0元素

二、BPMN2.0事件分类

捕获事件与抛出事件

定时事件

定时开始事件

定时边界事件

三、错误事件

四、信号事件

信号中间事件

消息事件定义

五、用户任务

1.用户任务定义

2.用户任务候选人/组配置

3.用户任务代理人配置


一、什么是BPMN2.0

BPMN2.0(Business Process Model and Notation)是一套业务流程模型与符号建模标准,它用精准的执行语义来描述元素的操作;以XML为载体,以符号可视化业务。

BPMN2.0元素

BPMN2.0元素包括流对象,连接对象,数据,泳道和描述对象。

五大元素所包含的具体元素对象:

二、BPMN2.0事件分类

捕获事件与抛出事件

捕获事件等待触发,而抛出事件会自动运行得到结果。因此可以认为所有的结束事件都是抛出事件。

定时事件

定时事件定义

  • 指定时间(timeDate)
  • 指定持续时间(timeDuration)
  • 周期执行(timeCycle)
<timeEventDefinition>

      <timeDate>2018-01-01T10:10:00</timeDate>

</timeEventDefinition>

定时开始事件

<startEvent id="timerstartevent" name="Timer start">   
    <timerEventDefinition>
        <timeCyclen>R5/PT5M</timeCycle>
    </timerEventDefinition>
</startEvent>

定时边界事件

上述流程定义文件描述为:

<process id="my-process">
    <startEvent id="startEvent" name="startEvent"/>
    <userTask id="commonTask" name="Common Task"/>
    <boundaryEvent id="boundaryEvent" name="Timer" attachedToRef="commonTask"  cancelActivity="true">
        <timerEventDefinition>
            <timeDuration>PT5S</timeDuration>
        </timerEventDefinition>
    </boundaryEvent>
    <userTask id="timeoutTask"></userTask>
    <endEvent id="end1"></endEvent>
    <endEvent id="end2"></endEvent>

    <sequenceFlow sourceRef="startEvent" targetRef="commonTask"/>
    <sequenceFlow sourceRef="commonTask" targetRef="end1"/>
    <sequenceFlow sourceRef="boundaryEvent" targetRef="timeoutTask"/>
    <sequenceFlow sourceRef="timeoutTask" targetRef="end2"/>
</process>

流程配置文件添加两条:

<property name="asyncExecutorActivate" value="true"/>

<property name="enableVerboseExecutionTreeLogging" value="true"/>

查询事件分类(开始事件,边界事件,定时事件等):

    private static final Logger LOGGER = LoggerFactory.getLogger(TimerEventTest.class);
    @Rule
    public ActivitiRule activitiRule = new ActivitiRule();
    @Test
    @Deployment(resources="my-process-timer-boundry.bpmn20.xml")
    public void testTimerBoundary() throws InterruptedException{
        ProcessInstance processInstance = activitiRule.getRuntimeService().startProcessInstanceByKey("my-process");
        List<Task> tasks = activitiRule.getTaskService().createTaskQuery().listPage(0,100);
        for(Task task:tasks){
            LOGGER.info("task.name={}",task.getName());
        }
        LOGGER.info("tasks.size={}",tasks.size());
        Thread.sleep(1000*15);
        tasks = activitiRule.getTaskService().createTaskQuery().listPage(0,100);
        for(Tasktask:tasks){
            LOGGER.info("task.name={}",task.getName());
        }
        LOGGER.info("tasks.size={}",tasks.size());
    }

三、错误事件

一个是正常结束,一个是异常结束

举一个比较复杂的错误边界事件:

四、信号事件

有一个信号触发,与常规的开始事件不同。开始事件中有一个信号的引用:

<signalEventDefinition id = "xxx" signalRef = "xxx" />

信号中间事件

消息事件定义

消息事件是针对流程中具体的事件

五、用户任务

  • Service Task是服务任务,可以用于调用外部服务或自动执行程序。
  • Send Task是发送任务,用于向外部参与人发送消息的工作。
  • Receive Task接受任务
  • User Task 是最重要的任务,需要人参与可以用来配置候选人,候选组等
  • Script Task脚本任务,可以用于执行定义好的脚本程序。

1.用户任务定义

2.用户任务候选人/组配置

Activiti提供的更简洁的配置:

候选用户:

<userTask id = "theTask" name = "my task" activiti:candidateUsers = "kermit, gonzo" />

候选组:

<userTask id = "theTask" name = "my task" activiti:candidateGroups = "management, accountancy"/>

3.用户任务代理人配置

代理人:真正的操作人员

<userTask id='theTask' name='important task' >
    <humanPerformer>
        <resourceAssignmentExpression>
            <formalExpression>kermit</formalExpression>
        </resourceAssignmentExpression>
    </humanPerformer>

Activiti提供的简化的设置:

<userTask id="theTask" name="my task" activiti:assignee="kermit" />

为代理人设置时间限制:

<userTask id="theTask" name="important task" activiti:dueDate = "${dateVariable}" />

通过任务监听器自定义配置:

event的四种事件类型: create, assignment, complete, delete

代码实现:

public class MyTaskListener implements TaskListener{
        @Override
        public void notify(DelegateTask delegateTask){
            delegateTask.setAssignee("kermit");
            delegateTask.setVariable("key1", "value1");
            //... setXXX
            delegateTask.setDueDate(DueDate.now().plusDays(3).toDate());
    }
}

使用监听器方式设置代理人:

public class MyTaskListener implements TaskListener {
    private static final Logger LOGGER = LoggerFactory.getLogger(MyTaskListener.class);
    @Override
    public void notify(DelegateTask delegateTask) {
        String eventName = delegateTask.getEventName();
        if(StringUtils.equals("create",eventName)){
            LOGGER.info("config by listener");
            //代理任务
            delegateTask.addCandidateUsers(Lists.newArrayList("user1", "user2"));
            delegateTask.addCandidateGroup("group");
            delegateTask.setVariable("key1", "value1");
            delegateTask.setDueDate(DateTime.now().plusDays(3).toDate());
        }
        else if(StringUtils.equals("complete",eventName)){
            LOGGER.info("task complete");
        }
    }
}

my-process-usertask2.bpmn20.xml文件:

<process id="my-process">

<startEvent id="start" />
<sequenceFlow id="flow1" sourceRef="start" targetRef="someTask" />

<userTask id="someTask" name="User Task">
    <extensionElements>
    <activiti:taskListener event="create" class="com.syc.activiti.example.MyTaskListener"/>
    <!--event设置为create,表示在系统创建的时候设置它的一些属性-->
    <activiti:taskListener event="complete" class="com.syc.activiti.example.MyTaskListener"/>
    </extensionElements>
</userTask>

<sequenceFlow id="flow2" sourceRef="someTask" targetRef="end" />

<endEvent id="end" />
</process>

测试代码:

@Test
@Deployment(resources = "my-process-usertask2.bpmn20.xml")
public void testUserTask2(){
    ProcessInstance processInstance = activitiRule.getRuntimeService().startProcessInstanceByKey("my-process");

    TaskService taskService = activitiRule.getTaskService();

    Task task = taskService.createTaskQuery().taskCandidateUser("user1").singleResult();
    LOGGER.info("find by user1 task={}",task);
    taskService.complete(task.getId());
}
发布了66 篇原创文章 · 获赞 32 · 访问量 8523

猜你喜欢

转载自blog.csdn.net/shao_yc/article/details/105339759