创建数据库
初始化数据库表(方式一)
/**
* 第一种初始化数据库的方法
*/
public static void createTable1(){
//创建activiti配置对象实例
ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
//设置数据库的相关连接属性
configuration.setJdbcDriver("com.mysql.jdbc.Driver");
configuration.setJdbcUrl("jdbc:mysql://:3306/mydatabase");
configuration.setJdbcUsername("");
configuration.setJdbcPassword("");
//设置数据库表的生成方式。设置建表策略
/**
* ProcessEngineConfiguration.DB_SCHEMA_UPDATE_CREATE_DROP;如果存在就不创建
* ProcessEngineConfiguration.DB_SCHEMA_UPDATE_FALSE;不会创建数据库表
* ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE;每次都会创建数据库表
* drop-create 每次都会把数据库里面的activiti相关的表删除,在重新创建
*/
configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
//得到程序引擎的实例
ProcessEngine processEngine = configuration.buildProcessEngine();
}
初始化数据库表(方式二)
使用核心配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcUrl" value="jdbc:mysql://:3306/mydatabase"></property>
<property name="jdbcUsername" value=""></property>
<property name="jdbcPassword" value=""></property>
<property name="jdbcDriver" value="com.mysql.jdbc.Driver"></property>
<!-- false:默认值。activiti在启动时,会对比数据库表中保存的版本,如果没有表或者版本不匹配,将抛出异常
true:activiti会对数据库中所有表进行更新操作,如果表不存在,则自动创建
create_drio:在activiti启动时创建表,在关闭时删除表(必须手动关闭引擎,才能删除表)
drop-create:在activiti启动时删除原来的旧表,然后在创建新表(不需要手动关闭引擎)
-->
<property name="databaseSchemaUpdate" value="true"></property>
</bean>
</beans>
/**
* 第二种方法
*/
public static void createTable2(){
ProcessEngine engine = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("/activiti.cfg.xml").buildProcessEngine();
}
activiti.cfg.xml说明(核心配置文件)
可以使用自带的属性
可以使用外部的数据源
定义数据库配置参数
- jdbcUrl:数据库的JDBCURL
- jdbcDriver:对应不同数据库类型的驱动
- jdbcUSername:连接数据库的用户名
- jdbcPassword:连接数据库的密码
基于JDBC参数配置的数据库连接,会使用默认的MyBatis连接池,下面的参数可以用来配置连接池(来自mybatis参数)
- jdbcMaxActiveConnections:连接池中处于被使用状态的连接的最大值,默认为10
- jdbcMaxIdleConnections:连接池中处于空闲状态的连接的最大值
- jdbcMaxCheckoutTime:连接被取出使用的最长时间,超过时间会被强制回收,默认为20000
- jdbcMaxWaitTime:这是一个底层配置,让连接池可以在长时间无法获得连接时,打印一条日志,并重新尝试获取一个连接(避免因为错误配置导致沉默的操作失败),默认为20000
- dataSource:可以配置其他数据源
- databaseSchemaUpdate:设置数据库表的创建策略
核心API
-
ProcessEngine
//要求核心配置文件的名称必须是/activiti.cfg.xml ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); //管理流程定义 操作的是act_ge_bytearray act_ge_property act_re_deployment act_re_model act_re_procdef RepositoryService repositoryService = processEngine.getRepositoryService(); //管理流程运行的act_ru_event_subscr act_ru_execution act_ru_identitylink act_ru_job act_ru_task act_ru_va RuntimeService runtimeService = processEngine.getRuntimeService(); //操作act_ru_task TaskService taskService = processEngine.getTaskService(); //操作act_id_info act_id_membership act_id_user IdentityService identityService = processEngine.getIdentityService(); //操作act_hi_actinst act_hi_attachment act_hi_comment act_hi_detail act_hi_identitylink act_hi_procinst HistoryService historyService = processEngine.getHistoryService();
说明:
1、在activiti中最核心的可,其他的类都是由他而来
2、产生方式
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
在前面看到了两种创建ProicessEngine(流程引擎)的方式,而这里要简化很多,调用ProcessEngines的getDefaultProcessEngine方法时会自动加载classpath下名为activiti.cfg.xml文件
3、可以产生RepositoryService
RepositoryService repositoryService = processEngine.getRepositoryService();
4、可以产生RuntimeService
RuntimeService runtimeService = processEngine。getRuntimeService();
5、可以产生TaskService
TaskService taskService = processEngine.getTaskService();
6、可以产生IdentityService
IdentityService identityService = processEngine.getIdentityService();
7、可以产生HistoryService
HistoryService historyService = processEngine.getHistoryService();
RepositoryService:管理流程定义
RuntimeService:执行管理,包括启动、推进、删除流程实例等等
TaskService:任务管理
HistoryService:历史管理(执行完的数据的管理)
IdentityService:组织机构管理
FormService:一个可选服务,任务表单管理
ManagerService:管理器服务
-
RepositoryService
是activiti的仓库服务类,所谓的仓库指流程定义文档的两个文件,bpmn文件和流程图片
1、产生方式
RepositoryService repositoryService = processEngine.getRepositoryService();
2、可以产生DeploymentBuilder,用来定义流程部署的相关参数
DeploymentBuilder deploymentBuilder = repositoryService.createDeployment();
3、删除流程定义
repositoryService.deleteDeployment(deploymentId);
-
RuntimeService
是activiti的流程执行服务类。可以从这个服务类中获取很多关于流程执行的相关信息,操作act_ru_execution
-
TaskService
是activiti的任务服务类,可以从这个类中获取任务的信息
操作act_ru_task
-
HistoryService
是Activiti的查询历史信息的类。在一个流程执行完成后,这个对象为我们提供查询历史信息。
-
ProcessDefinition
流程定义类,可以从这里获取资源文件等
-
ProcessInstance
代表流程定义的执行实例,如刘凡请了一天的假,他就必须发出一个流程实例的申请。一个流程实例包括了所有的运行节点。我们可以利用这个对象来了解当前流程实例的进度等信息。流程实例就表示一个流程从开始到结束的最大的流程分支,即一个流程中流程实例只有一个
-
Execution
Activiti用这个对象去描述流程执行的每一个节点,在没有并发的情况下,Execution就如同ProcessInstance。流程按照流程定义的规则执行一次的过程,就可以表示执行对象Execution
总结:一个流程中,执行对象可以存在多个,但是流程实例只能有一个
当流程按照规则只执行一次的时候,那么流程实例就是执行对象
流程图的绘制
此处我使用的时idea绘制流程图
1、引入插件
点击菜单【File】–>【Settings…】打开【Settings】窗口。
点击左侧【Plugins】按钮,在右侧输出"actiBPM",点击下面的【Search in repositories】链接会打开【Browse Repositories】窗口。
2、创建bpmn文件进行绘图
拖动图标进行绘图,将鼠标放在图标中心,出现扇形图标可以进行图标之间的连线
id为流程定义id,name为流程定义的名称
id与name为任务的属性
assignee为任务的执行对象
流程图绘制完成后将对应的bpmn后缀改为xml文件
邮件点击文件show diagrams 然后选择show designer
然后左上角点击export to file(idea中为导出的图标,箭头形式)
与xml文件保存在同一个位置中
HelloWorld程序(模拟流程的执行)
部署流程
public class helloWorld {
/**
* 部署流程
*/
private ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
@Test
public void deployProcess(){
//得到RepositoryService
RepositoryService service = processEngine.getRepositoryService();
//部署
InputStream isBpmn = this.getClass().getResourceAsStream("/LeaveBill.xml");
InputStream isPng = this.getClass().getResourceAsStream("/LeaveBill.png");
Deployment deployment = service.createDeployment().name("请假流程001")//部署的名称
.addInputStream("LeaveBill.xml", isBpmn)//设置;流程图的xml文件
.addInputStream("LeaveBill.png", isPng)//设置流程图的PNG文件
.deploy();//确定
/**
* act_re_deployment:流程部署表
* act_re_model:
* act_re_procdef:流程定义表,它和部署表里面的数据是一一对应的
* act_ge_bytearray:二进制文件存放表,和部署表和定义表是2-1关系
* act_ge_property:系统内置表存放activiti的版本和自动增长的字段
*/
System.out.println("流程部署成功:");
System.out.println("部署ID:" + deployment.getId());
System.out.println("部署名称:" + deployment.getName());
System.out.println("部署时间:" + deployment.getDeploymentTime().toLocaleString());
}
}
启动流程
/**
* 启动流程
*/
@Test
public void startProcess(){
/**
* act_ru_execution:流程实例ID,里面有流动ID,流程定义ID
* act_ru_identitylink:当前流程节点的办理人信息
* act_ru_task:当前正在执行的流程任务表
* act_ru_variable:执行的流程变量
*/
//得到流程运行服务
RuntimeService runtimeService = this.processEngine.getRuntimeService();
//启动流程、
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("LeaveBill");
System.out.println("流程启动成功");
System.out.println("流程实例ID:" + processInstance.getId());
}
完成任务:
/**
* 完成任务
*/
@Test
public void completeTask(){
String taskId = "2505";
//得到任务的Service
TaskService taskService = this.processEngine.getTaskService();
taskService.complete(taskId);
System.out.println("任务完成");
}