activiti用法和结构

文章目录
  1. 1. 支持的事件类型
  • 单元测试
  • activiti零零碎碎的记录 包括processengineConfiguration ->processEngine->respositoryService 下面的各个类和方法

    支持的事件类型

    ​ 下面是引擎中可能出现的所有activiti事件类型。每个类型都对应org.activiti.engine.delegate.event.ActivitiEventType中的一个枚举值。

    Table 3.2. 支持的事件**

    事件名称 描述 事件类型
    ENGINE_CREATED 监听器监听的流程引擎已经创建完毕,并准备好接受API调用。 org.activiti...ActivitiEvent
    ENGINE_CLOSED 监听器监听的流程引擎已经关闭,不再接受API调用。 org.activiti...ActivitiEvent
    ENTITY_CREATED 创建了一个新实体。实体包含在事件中。 org.activiti...ActivitiEntityEvent
    ENTITY_INITIALIZED 创建了一个新实体,初始化也完成了。如果这个实体的创建会包含子实体的创建,这个事件会在子实体都创建/初始化完成后被触发,这是与ENTITY_CREATED的区别。 org.activiti...ActivitiEntityEvent
    ENTITY_UPDATED 更新了已存在的实体。实体包含在事件中。 org.activiti...ActivitiEntityEvent
    ENTITY_DELETED 删除了已存在的实体。实体包含在事件中。 org.activiti...ActivitiEntityEvent
    ENTITY_SUSPENDED 暂停了已存在的实体。实体包含在事件中。会被ProcessDefinitions, ProcessInstances 和 Tasks抛出。 org.activiti...ActivitiEntityEvent
    ENTITY_ACTIVATED 激活了已存在的实体,实体包含在事件中。会被ProcessDefinitions, ProcessInstances 和 Tasks抛出。 org.activiti...ActivitiEntityEvent
    JOB_EXECUTION_SUCCESS 作业执行成功。job包含在事件中。 org.activiti...ActivitiEntityEvent
    JOB_EXECUTION_FAILURE 作业执行失败。作业和异常信息包含在事件中。 org.activiti...ActivitiEntityEvent and org.activiti...ActivitiExceptionEvent
    JOB_RETRIES_DECREMENTED 因为作业执行失败,导致重试次数减少。作业包含在事件中。 org.activiti...ActivitiEntityEvent
    TIMER_FIRED 触发了定时器。job包含在事件中。 org.activiti...ActivitiEntityEvent
    JOB_CANCELED 取消了一个作业。事件包含取消的作业。作业可以通过API调用取消, 任务完成后对应的边界定时器也会取消,在新流程定义发布时也会取消。 org.activiti...ActivitiEntityEvent
    ACTIVITY_STARTED 一个节点开始执行 org.activiti...ActivitiActivityEvent
    ACTIVITY_COMPLETED 一个节点成功结束 org.activiti...ActivitiActivityEvent
    ACTIVITY_SIGNALED 一个节点收到了一个信号 org.activiti...ActivitiSignalEvent
    ACTIVITY_MESSAGE_RECEIVED 一个节点收到了一个消息。在节点收到消息之前触发。收到后,会触发ACTIVITY_SIGNALACTIVITY_STARTED,这会根据节点的类型(边界事件,事件子流程开始事件) org.activiti...ActivitiMessageEvent
    ACTIVITY_ERROR_RECEIVED 一个节点收到了一个错误事件。在节点实际处理错误之前触发。 事件的activityId对应着处理错误的节点。 这个事件后续会是ACTIVITY_SIGNALLEDACTIVITY_COMPLETE, 如果错误发送成功的话。 org.activiti...ActivitiErrorEvent
    UNCAUGHT_BPMN_ERROR 抛出了未捕获的BPMN错误。流程没有提供针对这个错误的处理器。 事件的activityId为空。 org.activiti...ActivitiErrorEvent
    ACTIVITY_COMPENSATE 一个节点将要被补偿。事件包含了将要执行补偿的节点id。 org.activiti...ActivitiActivityEvent
    VARIABLE_CREATED 创建了一个变量。事件包含变量名,变量值和对应的分支或任务(如果存在)。 org.activiti...ActivitiVariableEvent
    VARIABLE_UPDATED 更新了一个变量。事件包含变量名,变量值和对应的分支或任务(如果存在)。 org.activiti...ActivitiVariableEvent
    VARIABLE_DELETED 删除了一个变量。事件包含变量名,变量值和对应的分支或任务(如果存在)。 org.activiti...ActivitiVariableEvent
    TASK_ASSIGNED 任务被分配给了一个人员。事件包含任务。 org.activiti...ActivitiEntityEvent
    TASK_CREATED 创建了新任务。它位于ENTITY_CREATE事件之后。当任务是由流程创建时, 这个事件会在TaskListener执行之前被执行。 org.activiti...ActivitiEntityEvent
    TASK_COMPLETED 任务被完成了。它会在ENTITY_DELETE事件之前触发。当任务是流程一部分时,事件会在流程继续运行之前, 后续事件将是ACTIVITY_COMPLETE,对应着完成任务的节点。 org.activiti...ActivitiEntityEvent
    TASK_TIMEOUT 任务已超时,在TIMER_FIRED事件之后,会触发用户任务的超时事件, 当这个任务分配了一个定时器的时候。 org.activiti...ActivitiEntityEvent
    PROCESS_COMPLETED 流程已结束。在最后一个节点的ACTIVITY_COMPLETED事件之后触发。 当流程到达的状态,没有任何后续连线时, 流程就会结束。 org.activiti...ActivitiEntityEvent
    MEMBERSHIP_CREATED 用户被添加到一个组里。事件包含了用户和组的id。 org.activiti...ActivitiMembershipEvent
    MEMBERSHIP_DELETED 用户被从一个组中删除。事件包含了用户和组的id。 org.activiti...ActivitiMembershipEvent
    MEMBERSHIPS_DELETED 所有成员被从一个组中删除。在成员删除之前触发这个事件,所以他们都是可以访问的。 因为性能方面的考虑,不会为每个成员触发单独的MEMBERSHIP_DELETED事件。 org.activiti...ActivitiMembershipEvent

    单元测试

    ​ 业务流程是软件项目的一部分,它也应该和普通的业务流程一样进行测试: 使用单元测试。 因为Activiti是一个嵌入式的java引擎, 为业务流程编写单元测试和写普通单元测试完全一样。

    ​ Activiti支持JUnit 3和4进行单元测试。使用JUnit 3时, 必须集成org.activiti.engine.test.ActivitiTestCase。 它通过保护的成员变量提供ProcessEngine和服务, 在测试的setup()中, 默认会使用classpath下的activiti.cfg.xml初始化流程引擎。 想使用不同的配置文件,可以重写*getConfigurationResource()*方法。 如果配置文件相同的话,对应的流程引擎会被静态缓存, 就可以用于多个单元测试。

    ​ 继承了ActivitiTestCase你,可以在测试方法上使用 org.activiti.engine.test.Deployment注解。 测试执行前,与测试类在同一个包下的, 格式为testClassName.testMethod.bpmn20.xml的资源文件,会被部署。 测试结束后,发布包也会被删除,包括所有相关的流程实例,任务,等等。 Deployment注解也可以直接设置资源的位置。 参考Javadocs获得更多信息。

    ​ 把这些放在一起,JUnit 3测试看起来像这样。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public class MyBusinessProcessTest extends ActivitiTestCase {
    @Deployment
    public void testSimpleProcess() {
    runtimeService.startProcessInstanceByKey("simpleProcess");
    Task task = taskService.createTaskQuery().singleResult();
    assertEquals("My Task", task.getName());
    taskService.complete(task.getId());
    assertEquals(0, runtimeService.createProcessInstanceQuery().count());
    }
    }

    ​ 要想在使用JUnit 4编写单元测试时获得同样的功能, 可以使用org.activiti.engine.test.ActivitiRule。 通过它,可以通过getter方法获得流程引擎和各种服务。 和 ActivitiTestCase一样(参考上面章节),使用这个Rule 也会启用org.activiti.engine.test.Deployment注解(参考上面章节使用和配置的介绍), 它会在classpath下查找默认的配置文件。 如果配置文件相同的话,对应的流程引擎会被静态缓存, 就可以用于多个单元测试。

    ​ 下面的代码演示了JUnit 4单元测试并使用了ActivitiRule的例子。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public class MyBusinessProcessTest {
    @Rule
    public ActivitiRule activitiRule = new ActivitiRule();

    @Test
    @Deployment
    public void ruleUsageExample() {
    RuntimeService runtimeService = activitiRule.getRuntimeService();
    runtimeService.startProcessInstanceByKey("ruleUsage");
    TaskService taskService = activitiRule.getTaskService();
    Task task = taskService.createTaskQuery().singleResult();
    assertEquals("My Task", task.getName());
    taskService.complete(task.getId());
    assertEquals(0, runtimeService.createProcessInstanceQuery().count());
    }
    }

    ​ 当集成Spring时,使用标准的Activiti测试工具类是非常容易的对业务流程进行测试。 下面的例子展示了如何在一个典型的基于Spring单元测试测试业务流程:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    import org.junit.Rule;
    import org.junit.Test;
    import org.junit.runner.RunWith;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.test.context.ContextConfiguration;
    import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

    @RunWith(SpringJUnit4ClassRunner.class)
    @ContextConfiguration("classpath:org/activiti/spring/test/junit4/springTypicalUsageTest-context.xml")
    public class MyBusinessProcessTest {
    @Autowired
    private RuntimeService runtimeService;
    @Autowired
    private TaskService taskService;
    @Autowired
    @Rule
    public ActivitiRule activitiSpringRule;

    @Test
    @Deployment
    public void simpleProcessTest() {
    runtimeService.startProcessInstanceByKey("simpleProcess");
    Task task = taskService.createTaskQuery().singleResult();
    assertEquals("My Task", task.getName());
    taskService.complete(task.getId());
    assertEquals(0, runtimeService.createProcessInstanceQuery().count());
    }
    }