工作流引擎能够配置自由节点工作流
从配置文件方面理解
上面是一个简单的流程图和流程配置文件
process 流程定义 元素有两个属性
id:映射为 Activti 中 ProcessDefinition 对象的 key 属性。这个 id 可以通过 RuntimeService 的 startProcessInstanceByKey 方法来启动该流程定义的一个新流程实例。这个方法总是选取流程定义的最新部署版本。
name:该属性是可选的,映射为 ProcessDefinition 对象的 name 属性。
StartEvent事件表示流程的开始。定义了流程如何被启动的 start 事件类型(当收到消息、特定的时间间隔、等等,启动流程) 是以一个小图标来形象表示事件的。
user tasks 声明是对流程中人为任务的描述。
assignee 属性:自定义流程任务直接分配给用户,也可以单独一个用户。
formKey是由流程 API 的 String FormService.getStartFormData(String processDefinitionId).getFormKey()和 String FormService.getTaskFormData(String taskId).getFormKey()公布的,用它来存储部署中模板的全名.
sequenceFlow :顺序流是两个流程元素的连接器。一个元素在流程执行期间被访问后,流程会沿着该元素所有输出的顺序流继续执行,顺序流要有流程唯一的 id,以及指向现有起始元素和目标元素的引用.
extensionElements:在流程执行时调用类,该类实现org.activiti.engine.delegate.JavaDelegate 接口,重写execute方法,在 execute 方法中提供必要的逻辑。当流程执行到此步,会执行定义在该方法中的逻辑。
Bpmndi:都是流程图形位置图像属性,通过可视化界面设计后自动生成的。
从业务代码上理解
1.在已有流程模型的的基础上,每个流程实例当前任务可以任意驳回/撤回或者向后续节点任意跳转而无需在相关的两个节点之间显示地画跳转路径(简称自由节点),通过在Activiti的流程组件TaskService接口中增加以下两个方法来达到上述目的:
public void complateTask(String taskid,String destTaskKey)
public void complateTask(String taskid,Map<String,Object> vars,String destTaskKey)
destTaskKey参数告诉流程引擎在结束taskID任务后直接跳转到destTaskKey对应的任务节点,可以实现简单人工任务和会签人工任务的驳回/撤回或者向后连跳n个节点。
2.在TaskService接口中增加了驳回到上个环节的默认接口:
将当前任务驳回到上一个任务处理人处,并更新流程变量参数
void rejecttoPreTask(String taskId, Map<String, Object> variables);
将当前任务驳回到上一个任务处理人处
void rejecttoPreTask(String taskId);
工作流引擎能够追踪状态,并以图形化界面进行显示
追踪状态
(就是查看流程图中的一小步)
1.使用任务ID,查询任务对象
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
String processInstanceId = task.getProcessInstanceId();
2.拿到流程实例ID,查询正在执行的执行对象表,获取当前活动对应的流程实例对象
ProcessInstance pi = runtimeService.createProcessInstanceQuery()//创建流程实例查询
.processInstanceId(processInstanceId)//使用流程实例ID查询
.singleResult();
3得到当前状态信息
比如当前执行的活动:pi.findActiveActivityNames()
流程图跟踪
1.获取任务ID,查询任务对象
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
2.获取流程定义ID
String processDefinitionId = task.getProcessDefinitionId();
3.查询流程定义的对象
ProcessDefinition pd = repositoryService.createProcessDefinitionQuery()
.processDefinitionId(processDefinitionId)
.singleResult();
4.获取流程部署id:pd.getDeploymentId();流程图片名称:pd.getDiagramResourceName()
获取当前活动坐标对应的x,y,width,height
Map<String, Object> map = workflowService.findCoordingByTask(taskId);
public Map<String, Object> findCoordingByTask(String taskId) {
4.1存放坐标
Map<String, Object> map = new HashMap<String,Object>();
4.2使用任务ID,查询任务对象(前面已获取 可省略)
Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
4.3获取流程定义的ID(可省略)
String processDefinitionId = task.getProcessDefinitionId();
4.4获取流程定义的实体对象(对应.bpmn文件中的数据)
ProcessDefinitionEntity processDefinitionEntity = (ProcessDefinitionEntity)repositoryService.getProcessDefinition(processDefinitionId);
4.5流程实例ID
String processInstanceId = task.getProcessInstanceId();
4.6使用流程实例ID,查询正在执行的执行对象表,获取当前活动对应的流程实例对象
ProcessInstance pi = runtimeService.createProcessInstanceQuery()//创建流程实例查询
.processInstanceId(processInstanceId)//使用流程实例ID查询
.singleResult();
4.7获取当前活动的ID
String activityId = pi.getActivityId();
4.8获取当前活动对象
ActivityImpl activityImpl = processDefinitionEntity.findActivity(activityId);//活动ID
4.9获取坐标
map.put("x", activityImpl.getX());
map.put("y", activityImpl.getY());
map.put("width", activityImpl.getWidth());
map.put("height", activityImpl.getHeight());
return map;
}
工作流引擎能够进行图形化配置
配置讲解
使用Activiti Explorer,从官网下载activiti-explorer.war放到tomcat容器,Tomcat启动后,打开浏览器访问http://localhost:8080/activiti-explorer。
注意配置:运行前是没有数据库表的,数据库到包下的db.properties文件更改,再修改activiti-standalone-context.xml中databaseSchemaUpdate,设置建表策略,如果没有表,自动创建表 <property name="databaseSchemaUpdate" value="true" />
1.默认使用管理员kermit/kermit登录,登陆成功后进入activiti控制台界面,点击流程,左边菜单显示已部署流程定义,右边显示流程图。(如果没有可以到流程设计工作区创建流程)
2.点击右上角的转换为可编辑模型,会显示如下页面,左边是模型菜单,中间是所编辑的流程图,右边是属性定义。
常用功能
开始事件startevent 一个流程的开始
结束事件endevent 一个流程的结束
默认顺序流Squence flow 引导执行下一个步骤
排他网关 exclusive gateway 通过条件判断执行某个步骤
java服务任务 service task 用来调用外部java类
边界消息 boundary signal event 根据引用的消息定义捕获相同消息名称的消息
子流程 subprocess 子流程是一个包含其他节点,网关,事件等等的节点。 它自己就是一个流程,同时是更大流程的一部分。 子流程是完全定义在父流程里的;
比如下面的排他网关,判断内容是不是草稿 isDraft,是草稿则需要人员审批,否则自动通过到servicetask中,关联到java代码方法执行业务。