- 浏览: 134295 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
di1984HIT:
学习了,学习了~
工作流引擎activiti 获取下一节点 -
q418584383:
现在这个只能获取到当前页行号 如果是翻页后的行号 怎么获取啊。 ...
easyui datagrid 获取行号 -
it_palmer:
好用
Tomcat内存溢出(java.lang.OutOfMemoryError: PermGen space)的解决办法 -
wang_kejian:
其实可以用迭代循环去做
工作流引擎activiti 获取下一节点 -
wang_kejian:
其实你只是针对网关进行了判断,没有针对子流程进行判断,如果存在 ...
工作流引擎activiti 获取下一节点
最近公司需要使用工作流引擎,选用了activiti。需求中提到的流程比较简单,也就3级审核,送审时需要选择下一节点的用户,所以必须在流程中需要获取当前节点的下一个节点。代码如下:
思路是通过实例ID获取当前节点,然后查找当前节点后后面所有的活动,主要查找的活动是exclusiveGateway和userTask,如果exclusiveGateway中的条件符合${iscorrect==1}就直接查找exclusiveGateway后的活动,直到找到userTask为止。如果当前节点后的活动是userTask,说明这个userTask就是你想要的。
代码中${iscorrect==1}表达式是流程中定义,表示审核通过。当时对于在java中解析表达式遇到困难,所以使用字符串来比较,代码
if((Boolean)e.getValue(context)){
nodeMap.put(sourceFlowElement.getId(), sourceFlowElement);
上面e.getValue(context)这句话老是报错啊,
/** * 根据实例编号查找下一个任务节点 * @param String procInstId :实例编号 * @return */ public TaskDefinition nextTaskDefinition(String procInstId){ //流程标示 String processDefinitionId = historyService.createHistoricProcessInstanceQuery().processInstanceId(procInstId).singleResult().getProcessDefinitionId(); ProcessDefinitionEntity def = (ProcessDefinitionEntity) ((RepositoryServiceImpl)repositoryService).getDeployedProcessDefinition(processDefinitionId); //执行实例 ExecutionEntity execution = (ExecutionEntity) runtimeService.createProcessInstanceQuery().processInstanceId(procInstId).singleResult(); //当前实例的执行到哪个节点 String activitiId = execution.getActivityId(); //获得当前任务的所有节点 List<ActivityImpl> activitiList = def.getActivities(); String id = null; for(ActivityImpl activityImpl:activitiList){ id = activityImpl.getId(); if(activitiId.equals(id)){ System.out.println("当前任务:"+activityImpl.getProperty("name")); return nextTaskDefinition(activityImpl, activityImpl.getId(),"${iscorrect==1}"); // System.out.println(taskDefinition.getCandidateGroupIdExpressions().toArray()[0]); // return taskDefinition; } } return null; } /** * 下一个任务节点 * @param activityImpl * @param activityId * @param elString * @return */ private TaskDefinition nextTaskDefinition(ActivityImpl activityImpl, String activityId, String elString){ if("userTask".equals(activityImpl.getProperty("type")) && !activityId.equals(activityImpl.getId())){ TaskDefinition taskDefinition = ((UserTaskActivityBehavior)activityImpl.getActivityBehavior()).getTaskDefinition(); // taskDefinition.getCandidateGroupIdExpressions().toArray(); return taskDefinition; }else{ List<PvmTransition> outTransitions = activityImpl.getOutgoingTransitions(); List<PvmTransition> outTransitionsTemp = null; for(PvmTransition tr:outTransitions){ PvmActivity ac = tr.getDestination(); //获取线路的终点节点 if("exclusiveGateway".equals(ac.getProperty("type"))){ outTransitionsTemp = ac.getOutgoingTransitions(); if(outTransitionsTemp.size() == 1){ return nextTaskDefinition((ActivityImpl)outTransitionsTemp.get(0).getDestination(), activityId, elString); }else if(outTransitionsTemp.size() > 1){ for(PvmTransition tr1 : outTransitionsTemp){ Object s = tr1.getProperty("conditionText"); if(elString.equals(StrUtils.trim(s.toString()))){ return nextTaskDefinition((ActivityImpl)tr1.getDestination(), activityId, elString); } } } }else if("userTask".equals(ac.getProperty("type"))){ return ((UserTaskActivityBehavior)((ActivityImpl)ac).getActivityBehavior()).getTaskDefinition(); }else{ logger.debug(ac.getProperty("type")); } } return null; } }
思路是通过实例ID获取当前节点,然后查找当前节点后后面所有的活动,主要查找的活动是exclusiveGateway和userTask,如果exclusiveGateway中的条件符合${iscorrect==1}就直接查找exclusiveGateway后的活动,直到找到userTask为止。如果当前节点后的活动是userTask,说明这个userTask就是你想要的。
代码中${iscorrect==1}表达式是流程中定义,表示审核通过。当时对于在java中解析表达式遇到困难,所以使用字符串来比较,代码
if(elString.equals(StrUtils.trim(s.toString())))就是用于判断表达式。后来发现可以通说juel来解析,以下是解析的代码:
ExpressionFactory factory = new ExpressionFactoryImpl(); SimpleContext context = new SimpleContext(); context.setVariable("count", factory.createValueExpression(10000, String.class)); ValueExpression e = factory.createValueExpression(context, "${count>=1000}", boolean.class); System.out.println(e.getValue(context));
评论
3 楼
sbwfgihc
2016-02-25
like-echo 写道
查询下一步节点,更简单的实现方式。
/**
* 查询流程当前节点的下一步节点。用于流程提示时的提示。
* @param taskId
* @return
* @throws Exception
*/
public Map<String, FlowNode> findNextTask(String taskId) throws Exception{
Map<String, org.activiti.bpmn.model.FlowNode> nodeMap = new HashMap<String, org.activiti.bpmn.model.FlowNode>();
ProcessInstance processInstance = findProcessInstanceByTaskId(taskId);
//查询当前节点
HistoricTaskInstance histask = findHistricTaskById(taskId, processInstance.getProcessInstanceId());
//查询流程定义 。
BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId());
List<org.activiti.bpmn.model.Process> listp = bpmnModel.getProcesses();
org.activiti.bpmn.model.Process process = listp.get(0);
//当前节点流定义
FlowNode sourceFlowElement = ( FlowNode) process.getFlowElement(histask.getTaskDefinitionKey());
// 找到当前任务的流程变量
List<HistoricVariableInstance> listVar=historyService.createHistoricVariableInstanceQuery().processInstanceId(processInstance.getId()).list() ;
iteratorNextNodes(process, sourceFlowElement, nodeMap,listVar);
return nodeMap;
}
/**
* 查询流程当前节点的下一步节点。用于流程提示时的提示。
* @param process
* @param sourceFlowElement
* @param nodeMap
* @param listVar
* @throws Exception
*/
private void iteratorNextNodes(org.activiti.bpmn.model.Process process, FlowNode sourceFlowElement, Map<String, FlowNode> nodeMap,List<HistoricVariableInstance> listVar)
throws Exception {
List<SequenceFlow> list = sourceFlowElement.getOutgoingFlows();
for (SequenceFlow sf : list) {
sourceFlowElement = ( FlowNode) process.getFlowElement( sf.getTargetRef());
if(StringUtils.isNotEmpty(sf.getConditionExpression() )){
ExpressionFactory factory = new ExpressionFactoryImpl();
SimpleContext context = new SimpleContext();
for(HistoricVariableInstance var :listVar){
context.setVariable(var.getVariableName(), factory.createValueExpression(var.getValue(), var.getValue().getClass()));
}
ValueExpression e = factory.createValueExpression(context, sf.getConditionExpression(), boolean.class);
if((Boolean)e.getValue(context)){
nodeMap.put(sourceFlowElement.getId(), sourceFlowElement);
break;
}
}
if (sourceFlowElement instanceof org.activiti.bpmn.model.UserTask) {
nodeMap.put(sourceFlowElement.getId(), sourceFlowElement);
break;
}else if (sourceFlowElement instanceof org.activiti.bpmn.model.ExclusiveGateway) {
iteratorNextNodes(process, sourceFlowElement, nodeMap,listVar);
}
}
}
/**
* 查询流程当前节点的下一步节点。用于流程提示时的提示。
* @param taskId
* @return
* @throws Exception
*/
public Map<String, FlowNode> findNextTask(String taskId) throws Exception{
Map<String, org.activiti.bpmn.model.FlowNode> nodeMap = new HashMap<String, org.activiti.bpmn.model.FlowNode>();
ProcessInstance processInstance = findProcessInstanceByTaskId(taskId);
//查询当前节点
HistoricTaskInstance histask = findHistricTaskById(taskId, processInstance.getProcessInstanceId());
//查询流程定义 。
BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId());
List<org.activiti.bpmn.model.Process> listp = bpmnModel.getProcesses();
org.activiti.bpmn.model.Process process = listp.get(0);
//当前节点流定义
FlowNode sourceFlowElement = ( FlowNode) process.getFlowElement(histask.getTaskDefinitionKey());
// 找到当前任务的流程变量
List<HistoricVariableInstance> listVar=historyService.createHistoricVariableInstanceQuery().processInstanceId(processInstance.getId()).list() ;
iteratorNextNodes(process, sourceFlowElement, nodeMap,listVar);
return nodeMap;
}
/**
* 查询流程当前节点的下一步节点。用于流程提示时的提示。
* @param process
* @param sourceFlowElement
* @param nodeMap
* @param listVar
* @throws Exception
*/
private void iteratorNextNodes(org.activiti.bpmn.model.Process process, FlowNode sourceFlowElement, Map<String, FlowNode> nodeMap,List<HistoricVariableInstance> listVar)
throws Exception {
List<SequenceFlow> list = sourceFlowElement.getOutgoingFlows();
for (SequenceFlow sf : list) {
sourceFlowElement = ( FlowNode) process.getFlowElement( sf.getTargetRef());
if(StringUtils.isNotEmpty(sf.getConditionExpression() )){
ExpressionFactory factory = new ExpressionFactoryImpl();
SimpleContext context = new SimpleContext();
for(HistoricVariableInstance var :listVar){
context.setVariable(var.getVariableName(), factory.createValueExpression(var.getValue(), var.getValue().getClass()));
}
ValueExpression e = factory.createValueExpression(context, sf.getConditionExpression(), boolean.class);
if((Boolean)e.getValue(context)){
nodeMap.put(sourceFlowElement.getId(), sourceFlowElement);
break;
}
}
if (sourceFlowElement instanceof org.activiti.bpmn.model.UserTask) {
nodeMap.put(sourceFlowElement.getId(), sourceFlowElement);
break;
}else if (sourceFlowElement instanceof org.activiti.bpmn.model.ExclusiveGateway) {
iteratorNextNodes(process, sourceFlowElement, nodeMap,listVar);
}
}
}
if((Boolean)e.getValue(context)){
nodeMap.put(sourceFlowElement.getId(), sourceFlowElement);
上面e.getValue(context)这句话老是报错啊,
2 楼
like-echo
2015-03-16
查询下一步节点,更简单的实现方式。
/**
* 查询流程当前节点的下一步节点。用于流程提示时的提示。
* @param taskId
* @return
* @throws Exception
*/
public Map<String, FlowNode> findNextTask(String taskId) throws Exception{
Map<String, org.activiti.bpmn.model.FlowNode> nodeMap = new HashMap<String, org.activiti.bpmn.model.FlowNode>();
ProcessInstance processInstance = findProcessInstanceByTaskId(taskId);
//查询当前节点
HistoricTaskInstance histask = findHistricTaskById(taskId, processInstance.getProcessInstanceId());
//查询流程定义 。
BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId());
List<org.activiti.bpmn.model.Process> listp = bpmnModel.getProcesses();
org.activiti.bpmn.model.Process process = listp.get(0);
//当前节点流定义
FlowNode sourceFlowElement = ( FlowNode) process.getFlowElement(histask.getTaskDefinitionKey());
// 找到当前任务的流程变量
List<HistoricVariableInstance> listVar=historyService.createHistoricVariableInstanceQuery().processInstanceId(processInstance.getId()).list() ;
iteratorNextNodes(process, sourceFlowElement, nodeMap,listVar);
return nodeMap;
}
/**
* 查询流程当前节点的下一步节点。用于流程提示时的提示。
* @param process
* @param sourceFlowElement
* @param nodeMap
* @param listVar
* @throws Exception
*/
private void iteratorNextNodes(org.activiti.bpmn.model.Process process, FlowNode sourceFlowElement, Map<String, FlowNode> nodeMap,List<HistoricVariableInstance> listVar)
throws Exception {
List<SequenceFlow> list = sourceFlowElement.getOutgoingFlows();
for (SequenceFlow sf : list) {
sourceFlowElement = ( FlowNode) process.getFlowElement( sf.getTargetRef());
if(StringUtils.isNotEmpty(sf.getConditionExpression() )){
ExpressionFactory factory = new ExpressionFactoryImpl();
SimpleContext context = new SimpleContext();
for(HistoricVariableInstance var :listVar){
context.setVariable(var.getVariableName(), factory.createValueExpression(var.getValue(), var.getValue().getClass()));
}
ValueExpression e = factory.createValueExpression(context, sf.getConditionExpression(), boolean.class);
if((Boolean)e.getValue(context)){
nodeMap.put(sourceFlowElement.getId(), sourceFlowElement);
break;
}
}
if (sourceFlowElement instanceof org.activiti.bpmn.model.UserTask) {
nodeMap.put(sourceFlowElement.getId(), sourceFlowElement);
break;
}else if (sourceFlowElement instanceof org.activiti.bpmn.model.ExclusiveGateway) {
iteratorNextNodes(process, sourceFlowElement, nodeMap,listVar);
}
}
}
/**
* 查询流程当前节点的下一步节点。用于流程提示时的提示。
* @param taskId
* @return
* @throws Exception
*/
public Map<String, FlowNode> findNextTask(String taskId) throws Exception{
Map<String, org.activiti.bpmn.model.FlowNode> nodeMap = new HashMap<String, org.activiti.bpmn.model.FlowNode>();
ProcessInstance processInstance = findProcessInstanceByTaskId(taskId);
//查询当前节点
HistoricTaskInstance histask = findHistricTaskById(taskId, processInstance.getProcessInstanceId());
//查询流程定义 。
BpmnModel bpmnModel = repositoryService.getBpmnModel(processInstance.getProcessDefinitionId());
List<org.activiti.bpmn.model.Process> listp = bpmnModel.getProcesses();
org.activiti.bpmn.model.Process process = listp.get(0);
//当前节点流定义
FlowNode sourceFlowElement = ( FlowNode) process.getFlowElement(histask.getTaskDefinitionKey());
// 找到当前任务的流程变量
List<HistoricVariableInstance> listVar=historyService.createHistoricVariableInstanceQuery().processInstanceId(processInstance.getId()).list() ;
iteratorNextNodes(process, sourceFlowElement, nodeMap,listVar);
return nodeMap;
}
/**
* 查询流程当前节点的下一步节点。用于流程提示时的提示。
* @param process
* @param sourceFlowElement
* @param nodeMap
* @param listVar
* @throws Exception
*/
private void iteratorNextNodes(org.activiti.bpmn.model.Process process, FlowNode sourceFlowElement, Map<String, FlowNode> nodeMap,List<HistoricVariableInstance> listVar)
throws Exception {
List<SequenceFlow> list = sourceFlowElement.getOutgoingFlows();
for (SequenceFlow sf : list) {
sourceFlowElement = ( FlowNode) process.getFlowElement( sf.getTargetRef());
if(StringUtils.isNotEmpty(sf.getConditionExpression() )){
ExpressionFactory factory = new ExpressionFactoryImpl();
SimpleContext context = new SimpleContext();
for(HistoricVariableInstance var :listVar){
context.setVariable(var.getVariableName(), factory.createValueExpression(var.getValue(), var.getValue().getClass()));
}
ValueExpression e = factory.createValueExpression(context, sf.getConditionExpression(), boolean.class);
if((Boolean)e.getValue(context)){
nodeMap.put(sourceFlowElement.getId(), sourceFlowElement);
break;
}
}
if (sourceFlowElement instanceof org.activiti.bpmn.model.UserTask) {
nodeMap.put(sourceFlowElement.getId(), sourceFlowElement);
break;
}else if (sourceFlowElement instanceof org.activiti.bpmn.model.ExclusiveGateway) {
iteratorNextNodes(process, sourceFlowElement, nodeMap,listVar);
}
}
}
1 楼
philhong
2015-01-08
很有用,谢谢
发表评论
-
Java NIO
2014-12-15 17:07 717Java NIO非堵塞应用通常 ... -
eclipse tomcat 出现内存溢出
2014-09-24 17:04 720在 tomcat vmage 后加入-Xms256m -Xmx ... -
java书籍
2013-11-28 10:10 740大型网站技术架构:核心原理与案例分析 http://prod ... -
JRockit + tomcat
2013-09-11 13:47 796将tomcat中的文件catalina.bat最上面加上 se ... -
使用JRockit检测内存泄露,使用startup.bat启动tomcat
2013-08-14 15:41 01、在安装了JRockit的情况下,比如JRockit安装在c ... -
TOMCAT并发设置
2013-03-20 11:24 711<Resource name="Use ... -
批量转换文件编码格式
2013-03-08 15:25 2308import java.io.BufferedReader ... -
工作流引擎activiti 获取下一节点
2012-10-17 10:46 12854最近公司需要使用工作流引擎,选用了activiti。需求中提到 ... -
sql server 2008存储过程分页
2012-10-14 15:49 2866USE [hospital] GO /****** O ... -
Tomcat内存溢出(java.lang.OutOfMemoryError: PermGen space)的解决办法
2012-09-27 15:48 25352Tomcat启动时报如下错误: java.lang. ... -
STUTS2 下载 getOutputStream() has already been called for this response异常的原因
2012-09-08 10:10 7045public String excel() throws Ex ... -
iReport与JasperReport生成pdf乱码
2012-07-26 19:48 0在使用iReport与JasperReport ... -
getOutputStream() has already been called for this response异常的原因
2012-07-13 15:04 1395Caused by: java.lang.IllegalSta ... -
批量转换文件编码格式
2012-03-31 16:47 1176import java.io.BufferedReader ... -
JAVA的内存
2012-02-15 17:03 8661. 寄存器:最快的存储区 , 由编译器根据需求进行分配 , ... -
动态代理结合事物的应用
2009-10-14 12:14 1218在jdk1.3中或更高版本中继承java.lang.refle ... -
java导出Excel , xml设置表头
2009-10-09 13:27 6330import java.sql.SQLException; ... -
强制下线的实现
2009-10-09 13:16 2275import java.util.HashMap; impo ...
相关推荐
activiti三种表单的demo实现 运行方式: 1,修改连接的数据库 2,sql文件在resources\sql下 3,访问地址http://localhost:8080/activiti-demo/main/index
Activiti是一个开源的工作流引擎,它实现了BPMN 2.0规范,可以发布设计好的流程定义,并通过api进行流程调度。 Activiti 作为一个遵从 Apache 许可的工作流和业务流程管理开源平台,其核心是基于 Java 的超快速、超...
3.1:工作流引擎 2 3.2:BPMN 2 3.3:数据库(先学后看) 2 3.4:activiti.cfg.xml(activiti的配置文件) 4 3.5:logging.properties(日志处理) 5 4:准备环境 6 4.1:activiti5 软件环境 6 4.2:相关资源下载 6 ...
Flowable是Activiti原班主创人员从Activiti分离出来的一套工作流引擎,是一个业务流程管理(BPM)和工作流系统,适用于开发人员和系统管理员。其核心是超快速、稳定的BPMN2流程引擎,易于与 Spring集成使用。 Flowable...
数字证书:从文件中读取数字证书,生成文件输入流,输入文件为c:/mycert.cer,获取一个处理X.509证书的证书工厂…… Java+ajax写的登录实例 1个目标文件 内容索引:Java源码,初学实例,ajax,登录 一个Java+ajax写...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
数字证书:从文件中读取数字证书,生成文件输入流,输入文件为c:/mycert.cer,获取一个处理X.509证书的证书工厂…… Java+ajax写的登录实例 1个目标文件 内容索引:Java源码,初学实例,ajax,登录 一个Java+ajax写...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...
Flume 是一个分布式、可靠和高可用的服务,用于收集、聚合以及移动大量日志数据,使用一个简单灵活的架构,就流数据模型。这是一个可靠、容错的服务。 彩信发送开发包 apimms apimms 提供了各种语言用来发送彩信...