工作流的定义
工作流是指一类能够完全自动执行的经营过程,根据一系列过程规则,将文档、信息或任务在不同的执行者之间进行传递与执行。说的直白一点工作流就是封装好的一种框架,我们利用这种框架来解决需要多个人或者多个部门协同完成的某项工作。
依赖jar
org.activiti:activiti-engine:jar:5.12.1+- org.apache.commons:commons-email:jar:1.2:compile
| +- javax.mail:mail:jar:1.4.1:compile
| \- javax.activation:activation:jar:1.1:compile
+- org.apache.commons:commons-lang3:jar:3.1:compile
+- org.mybatis:mybatis:jar:3.1.1:compile
+- org.springframework:spring-beans:jar:3.1.2.RELEASE:compile
| \- org.springframework:spring-core:jar:3.1.2.RELEASE:compile
| +- org.springframework:spring-asm:jar:3.1.2.RELEASE:compile
| \- commons-logging:commons-logging:jar:1.1.1:compile
\- joda-time:joda-time:jar:2.1:compile
数据库表
ACT_RE_*: 'RE'表示
repository
。 这个前缀的表包含了流程定义和流程静态资源 (图片,规则,等等)。ACT_RU_*: 'RU'表示
runtime
。 这些运行时的表,包含流程实例,任务,变量,异步任务,等运行中的数据。 Activiti只在流程实例执行过程中保存这些数据, 在流程结束时就会删除这些记录。 这样运行时表可以一直很小速度很快。ACT_ID_*: 'ID'表示
identity
。 这些表包含身份信息,比如用户,组等等。ACT_HI_*: 'HI'表示
history
。 这些表包含历史数据,比如历史流程实例, 变量,任务等等。ACT_GE_*:
通用
数据, 用于不同场景下。
Service
RepositoryService 静态资源管理,它提供了管理和控制发布包
和流程定义
的操作。
RuntimeService 负责启动一个流程定义的新实例。
TaskService 所有与任务有关的功能
IdentityService 它可以管理(创建,更新,删除,查询...)群组和用户
FormService 可选服务 提供了启动表单和任务表单两个概念。 启动表单会在流程实例启动之前展示给用户, 任务表单会在用户完成任务时展示。
HistoryService 提供了Activiti引擎的所有历史数据。查询需要用到
ManagementService 查询数据库的表和表的元数据。另外,它提供了查询和管理异步操作的功能。
历史是一个组件,它可以捕获发生在进程执行中的信息并永久的保存,与运行时数据不同的是,当流程实例运行完成之后它还会存在于数据库中。
有5个历史实体对象:
HistoricProcessInstances
包含当前和已经结束的流程实例信息。HistoricVariableInstance
s 包含最新的流程变量或任务变量。HistoricActivityInstance
s 包含一个活动(流程上的节点)的执行信息 。HistoricTaskInstance
s 包含关于当前和过去的(已完成或已删除)任务实例信息。HistoricDetail
s 包含历史流程实例、活动实例、任务实例的各种信息。
这些实体可以通过HistoryService create出来
ActivitiExceptions
ActivitiWrongDbException
:当Activiti引擎发现数据库版本号和引擎版本号不一致时抛出。ActivitiOptimisticLockingException
:对同一数据进行并发方法并出现乐观锁时抛出。ActivitiClassLoadingException
:当无法找到需要加载的类或在加载类时出现了错误(比如,JavaDelegate,TaskListener等。ActivitiObjectNotFoundException
:当请求或操作的对应不存在时抛出。ActivitiIllegalArgumentException
:这个异常表示调用Activiti API时传入了一个非法的参数,可能是引擎配置中的非法值,或提供了一个非法制,或流程定义中使用的非法值。ActivitiTaskAlreadyClaimedException
:当任务已经被认领了,再调用taskService.claim(...)
就会抛出。
BPMN
bpmn是用来写工作流流程定义的 可以使用JavaEE6的UEL
具体写法参考 http://www.mossle.com/docs/activiti/index.html#bpmn20
配置文件解释
<?xml version="1.0" encoding="UTF-8"?><beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:task="http://www.springframework.org/schema/task" xmlns:jpa="http://www.springframework.org/schema/data/jpa" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.1.xsd http://www.springframework.org/schema/data/jpa http://www.springframework.org/schema/data/jpa/spring-jpa.xsd http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd"> <bean id="processEngineConfiguration" class="org.activiti.spring.SpringProcessEngineConfiguration"> <!--H2数据库类型 没使用默认的H2数据库就必须设置这项--> <property name="databaseType" value="mysql"/> <!--数据源直接引用--> <!--jdni的话需要配置java:comp/env/jdbc/和serve.xml--> <property name="dataSource" ref="dataSource"/> <!--事务管理器配置,单数据源事务 --> <property name="transactionManager" ref="transactionManager"/> <!--设置流程引擎启动和关闭时如何处理数据库表。create-drop: 构建流程引擎时创建数据库表,关闭流程引擎时删除这些表。org/activiti/db/create有sql--> <property name="databaseSchemaUpdate" value="false"/> <!--不使用activiti的用户组--> <property name="dbIdentityUsed" value="false"/> <property name="jpaEntityManagerFactory" ref="entityManagerFactory"/> <property name="jpaHandleTransaction" value="true"/> <property name="jpaCloseEntityManager" value="true"/> <!--流程文件缓存--> <property name="deploymentResources" value="classpath*:acts/*.bpmn"/> <!--JobExecutor是管理一系列线程的组件,可以触发定时器(也包含后续的异步消息)。--> <property name="jobExecutorActivate" value="false"/> <!-- 生成流程图的字体 --> <property name="activityFontName" value="宋体"/> <property name="labelFontName" value="宋体"/> <!--邮件服务器--> <!--<property name="mailServerHost" value="mail.my-corp.com" />--> <!--<property name="mailServerPort" value="5025" />--> <!--配置历史--> <!--none: 忽略所有历史存档。这是流程执行时性能最好的状态,但没有任何历史信息可用。--> <!--activity: 保存所有流程实例信息和活动实例信息。 在流程实例结束时, 最后一个流程实例中的最新的变量值将赋值给历史变量。 不会保存过程中的详细信息。--> <!--audit: 这个是默认值. 它保存所有流程实例信息, 活动信息, 保证所有的变量和提交的表单属性保持同步 这样所有用户交互信息都是可追溯的,可以用来审计。--> <!--full: 这个是*别的历史信息存档,同样也是最慢的。 这个级别存储发生在审核以及所有其它细节的信息, 主要是更新流程变量。--> <!--<property name="history" value="audit" />--> <!--配置部署缓存默认不限制 LRU缓存 Least Recently Used 的缩写“最近最少使用”,--> <!--<property name="processDefinitionCacheLimit" value="10" />--> </bean> <bean id="processEngine" class="org.activiti.spring.ProcessEngineFactoryBean"> <property name="processEngineConfiguration" ref="processEngineConfiguration"/> </bean> <bean id="repositoryService" factory-bean="processEngine" factory-method="getRepositoryService"/> <bean id="runtimeService" factory-bean="processEngine" factory-method="getRuntimeService"/> <bean id="actTaskService" factory-bean="processEngine" factory-method="getTaskService"/> <bean id="historyService" factory-bean="processEngine" factory-method="getHistoryService"/> <bean id="identityService" factory-bean="processEngine" factory-method="getIdentityService"/> <bean id="managementService" factory-bean="processEngine" factory-method="getManagementService"/> <bean id="formService" factory-bean="processEngine" factory-method="getFormService"/></beans>