Activiti学习笔记一

Activiti 开源工作流是也;

必要的软件

JDK 6+

Eclipse
BPMN插件( Activiti Designer编辑器)的安装

打开 Help -> Install New Software. 在如下面板中 , 点击 Add 按钮, 然后填入下列字段:

· Name: Activiti BPMN 2.0 designer

· Location: http://activiti.org/designer/update/

clip_image002

Activiti 流程引擎的配置文件是名为:activiti.cfg.xml,注意:这与Spring方式创建流程殷勤是一样的

ProcessEngineConfiguration

目前可以使用的类:如下:
1. org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration

单独运行的流程引擎。Activiti会自己处理事务。默认数据库只在引擎启动时检测(如果Activiti的表或者表结构不正确就会抛出异常)

2.org.activiti.engine.impl.cfg.StandaloneInMemProcessEngineConfiguration

单元测试时的辅助类。Activiti会自己控制事务。 默认使用H2内存数据库。数据库表会在引擎启动时创建,关闭时删除。使用它时,不需要其他配置(除非使用job执行器或邮件功能)。

3. org.activiti.spring.SpringProcessEngineConfiguration:

在Spring环境下使用流程引擎。

4. org.activiti.engine.impl.cfg.JtaProcessEngineConfiguration:

单独运行流程引擎,并使用JTA事务。

支持的数据库:

Activiti数据库类型

JDBC URL实例

备注

h2

jdbc:h2:tcp://localhost/activiti

默认配置的数据库

mysql

jdbc:mysql://localhost:3306/activiti?autoReconnect=true

使用mysql-connector-java驱动测试

oracle

jdbc:oracle:thin:@localhost:1521:xe

 

postgres

jdbc:postgresql://localhost:5432/activiti

 

db2

jdbc:db2://localhost:50000/activiti

 

mssql

jdbc:sqlserver://localhost:1433/activiti

 

理解数据库表的命名

Activiti的表都以ACT_开头。第二部分是表示表的用途的两个字母标识。用途也和服务的API对应。

1.ACT_RE_* :‘RE’表示Repository。这个前缀的表包含了流程定义和流程静态资源(图片,规则,等等)

2. ACT_RU_*:‘RU’表示runtime。这是运行时的表存储着流程变量,用户任务,变量,职责(job)等运行时的数据。Activiti只存储实例执行期间的运行时数据,当流程实例结束时,将删除这些记录。这就保证了这些运行时的表小且快。

3.ACT_ID_*:‘ID’表示identity。这些表包含标识的信息,如用户,用户组,等;

4.ACT_HI_*:‘history’。就是这些表包含着历史的相关数据,如结束的流程实例,变量,任务,等;

5.ACT_GE_*:普通数据,各种情况都使用的数据;

数据库表结构图:

clip_image004

clip_image005

名词解释:

关键对象

Deployment:流程部署对象,部署一个流程是创建。

ProcessDefinitions:流程定义,部署 成功后自动创建。

ProcessInstances:流程实例,启动流程是创建。

Task:任务,在Activiti中的Task仅值有角色参与的任务,即定义中的UserTask。

Execution:执行计划,流程实例和流程执行中的所有节点都是Execution,如UserTask、ServiceTask等。

服务接口

clip_image007

clip_image009

ProcessEngine:流程引擎接口,提供流程管理和运作的所有接口。

RuntimeService:运行时服务接口,提供流程启动服务,运行中流程查询,运行变量设置和获取。

TaskService:用户任务接口(UserTask),提供运行时任务查询、认领、完成、删除及变量设置用户管理等服务。

IdentityService:用户和组管理接口。

ManagementService流程引擎管理接口。

HistoryService:流程处理查询接口,包括执行中流程查询和历史流程查询。

Activiti 的使用

流程定义:

流程图如下:

clip_image011

流程定义如下:

<definitions id="definitions"

targetNamespace="http://activiti.org/bpmn20"

xmlns:activiti="http://activiti.org/bpmn"

xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL">

<process id="financialReport" name="Monthly financial report reminder process">

<startEvent id="theStart" />

<sequenceFlow id='flow1' sourceRef='theStart' targetRef='writeReportT ask' />

<userT ask id="writeReportT ask" name="Write monthly financial report" >

<documentation>

Write monthly financial report for publication to shareholders.

</documentation>

<potentialOwner>

<resourceAssignmentExpression>

<formalExpression>accountancy</formalExpression>

</resourceAssignmentExpression>

</potentialOwner>

</userT ask>

<sequenceFlow id='flow2' sourceRef='writeReportT ask' targetRef='verifyReportT ask'/>

<userT ask id="verifyReportT ask" name="Verify monthly financial report" >

<documentation>

Verify monthly financial report composed by the accountancy department.

Thisfinancial report is going to be sent toall the company shareholders.

</documentation>

<potentialOwner>

<resourceAssignmentExpression>

<formalExpression>management</formalExpression>

</resourceAssignmentExpression>

</potentialOwner>

</userT ask>

<sequenceFlow id='flow3' sourceRef='verifyReportT ask' targetRef='theEnd'/>

<endEvent id="theEnd" />

</process>

</definitions>

配置文件

默认文件名称:activiti.cfg.xml,放在 classpath 下。

内容如下:

<beansxmlns="http://www.springframework.org/schema/beans"

xmlns:xsi="http://www. w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://www.springframework.org/schema/beans

http://www.springframework.org/schema/beans/spring-beans.xsd">

<bean id="processEngineConfiguration"

class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">

<property name="jdbcUrl" value="jdbc:h2:mem:activiti;DB_CLOSE_DELA Y=1000"/>

<property name="jdbcDriver"value="org.h2.Driver"/>

<property name="jdbcUsername"value="sa" />

<property name="jdbcPassword"value=""/>

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

<property name="jobExecutorActivate"value="false"/>

<property name="mailServerHost" value="mail.my-corp.com"/>

<property name="mailServerPort"value="5025" />

</bean>

</beans>

结合 Spring

Spring 中定义数据连接及事务管理

<bean id="dataSource"

class="org.springframework.jdbc.datasource.DriverManagerDataSource">

<property name="driverClassName"value="com.mysql.jdbc.Driver" />

<property name="url"

value="jdbc:mysql://localhost:3306/boss?autoReconnect=true&amp;characterEncoding=UTF-8&amp;characterSe

tResults=UTF-8"/>

<property name="username" value="root"/>

<property name="password" value=""/>

</bean>

<bean id="transactionManager"

class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property name="dataSource" ref="dataSource" />

</bean>

定义 Activiti 配置

<bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration">

<property name="dataSource" ref="dataSource" />

<property name="transactionManager" ref="transactionManager" />

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

<property name="jobExecutorActivate"value="false" />

<property name="mailServerHost" value="mail.xxxx.com"/>

<property name="mailServerPort" value="25" />

<property name="mailServerDefaultFrom"value="hrj@xxxx.com"/>

<property name="mailServerUsername"value="xxxx" />

<property name="mailServerPassword"value="xxxx" />

</bean>

定义流程引擎

<bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean">

<property name="processEngineConfiguration" ref="processEngineConfiguration"/>

</bean>

定义流程中使用的对象

<bean id="myServiceTask" class="hrj.activiti.MyServiceTask">

<property name="processEngine" ref="processEngine" />

</bean>

<bean id="myActivityBehavior" class="hrj.activiti.MyActivityBehavior">

<property name="processEngine" ref="processEngine" />

</bean>

<bean id="myExecutionListener" class="hrj.activiti.MyExecutionListener">

</bean>

<bean id="valueBean" class="hrj.activiti. ValueBean">

<property name="value"value="张三李四" />

</bean>

创建流程引擎:

1. 根据默认的配置文件创建默认的流程引擎。

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();

2. 也可以通过代码由ProcessEngineConfiguration创建一个流程引擎,这种方式不需要配置文件,可以在ProcessEngineConfiguration中设置文件中的所有参数。

ProcessEngine processEngine = ProcessEngineConfiguration

.createProcessEngineConfigurationFromResourceDefault()

.setMailServerHost("gmail.com")

.setJdbcUsername("mickey")

.setJdbcPassword("mouse")

.buildProcessEngine();

3. 由Spring创建流程引擎。

部署流程:

public void deployFlow() throws Exception{

//1、创建核心流程引擎对象ProcessEngine

ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine();

//2、使用ProcessEngine获取需要的服务对象

RepositoryService repositoryService= processEngine.getRepositoryService();

//3、使用服务对象相关的方法完成操作

//创建发布配置对象

DeploymentBuilder builder= repositoryService.createDeployment();

//指定发布的文件

builder.addClasspathResource("HelloWorld.bpmn").addClasspathResource("HelloWorld.png");

//发布流程

builder.deploy();

}

还可以通过字符串,zip包,inputStream等方式部署流程。

@Test

public void deployProcessZIP() throws Exception{

// 创建一个发布配置对象

DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();

// 添加发布的资源文件(“流程规则文件” 和 “流程图片”)

InputStream in=this.getClass().getResourceAsStream("/leave.zip") ;

ZipInputStream zipInputStream = new ZipInputStream(in);

deploymentBuilder.addZipInputStream(zipInputStream);

//发布

deploymentBuilder.deploy();

}

启动流程

@Test

public void startFlow() throws Exception{

//1、创建核心流程引擎对象ProcessEngine

ProcessEngine processEngine= ProcessEngines.getDefaultProcessEngine();

//2、创建运行时服务对象

RuntimeService runtimeService=processEngine.getRuntimeService();

//3.使用服务

runtimeService.startProcessInstanceByKey("myProcess");

}

启动流程使用流程定义中的process id = “myProcess”,可以绑定一个Sting类型的businessKey和一个Map类型的流程变量集合

查询任务

流程定义中,第一个任务是指定 accountancy 角色处理的。

<potentialOwner>

<resourceAssignmentExpression>

<formalExpression>accountancy</formalExpression>

</resourceAssignmentExpression>

</potentialOwner>

取得任务接口

TaskService taskService = processEngine.getTaskService();

查询流转到 accountancy 的任务

List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("accountancy").list();

领取任务:

如果 fozzie 是 accountancy 下的一个用户

for (Task task : tasks) {

// fozzie 领取任务

taskService.claim(task.getId(), "fozzie");

}

完成任务:

tasks = taskService.createTaskQuery().taskAssignee("fozzie").list();

for (Task task : tasks) {

//完成任务

taskService.complete(task.getId());

}

查询:

流程部署查询:

DeploymentQuery deploymentQuery = repositoryService.createDeploymentQuery();

List<Deployment> deploymentList = deploymentQuery .list();

流程定义查询:

ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();

List<ProcessDefinition> processDefinitionList = processDefinitionQuery .orderByProcessDefinitionId().asc().list();

处理中的流程实例查询:

RuntimeService runtimeService = processEngine.getRuntimeService();

List<ProcessInstance> processInstanceList = runtimeService.createProcessInstanceQuery().list();

处理完成的流程实例查询:

HistoricProcessInstanceQuery historicProcessInstanceQuery = processEngine.getHistoryService()

.createHistoricProcessInstanceQuery();

List<HistoricProcessInstance> historicProcessInstanceList =

historicProcessInstanceQuery .finished().orderByProcessInstanceStartTime().asc().list();

流程处理记录查询:

仅得到流程中的UserTask节点

HistoricTaskInstanceQuery historicTaskInstanceQuery = processEngine.getHistoryService()

.createHistoricT askInstanceQuery();

List<HistoricTaskInstance> historicTaskInstanceList = historicT askInstanceQuery .processInstanceId(processInstanceId)

.orderByHistoricActivityInstanceStartTime().asc().list();

查询流程中所有节点

HistoricActivityInstanceQuery

historicActivityInstanceQuery=processEngine.getHistoryService().createHistoricActivityInstanceQuery();

List<HistoricActivityInstance> historicActivityInstanceList =

historicActivityInstanceQuery .processInstanceId(processInstanceId).orderByHistoricActivityInstanceStartTime().

asc().list();

转载于:https://my.oschina.net/u/997542/blog/271037

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值