您的位置:首页 > 其它

Activiti的流程定义文件解析

2013-09-06 00:00 549 查看
在实现流程的模拟运行时,需获取流程定义中的相关活动节点信息,故需对流程定义文件进行解析。

此处对流程定义文件的解析,主要是通过参考Activiti流程部署的源码来实现。

代码如下:

/**
* <p>
* 解析流程定义文件;对于Context设置引擎配置可以将流程定义解析操作设置为命令,这样执行时Context将会自动注入引擎配置
* <p>
* @author zhangping
* @param file 流程定义资源文件 zip压缩文件
* @param filePath 流程定义文件(.bpmn)的类路径
* @return
*/
public void bpmnParse(File file, String fileClassPath) {
try {
Context.setProcessEngineConfiguration(getProcessEngineConfiguration());
/* 加载流程定义文件 获取 DeploymentBuilderImpl 由于该步未执行 deploy方法 故不会执行流程定义与数据库的交互
* 可以采用类路径下的流程定义文件进行部署
* 也可以 通过zip文件部署 ,如下代码
*/
DeploymentBuilderImpl deploymentBuilder = (DeploymentBuilderImpl) getRepositoryService()
.createDeployment();
if(file != null){
InputStream in = new FileInputStream(file);
ZipInputStream zis = new ZipInputStream(in);
deploymentBuilder.addZipInputStream(zis);
}
if(fileClassPath != null){
deploymentBuilder.addClasspathResource(fileClassPath);
}

// 获取DeploymentEntity
DeploymentEntity deploymentEntity = deploymentBuilder.getDeployment();
// 设置部署实体的 信息 包括部署时间 是否为新版本 这两步可以省略
deploymentEntity.setDeploymentTime(ClockUtil.getCurrentTime());
deploymentEntity.setNew(true);
// 获取部署实体的流程定义资源文件 由于上文中调用了 addClasspathResource("process/Demo.bpmn") 会将资源注入给DeploymentEntity 故可以取到
Map<String, ResourceEntity> resources = deploymentEntity.getResources();
// 获取BpmnDeployer 都是由构建流程引擎时初始设置的
BpmnDeployer bpmnDeployer = (BpmnDeployer) getProcessEngineConfiguration().
getDeploymentManager().getDeployers().get(0);
// 流程bpmn解析类
BpmnParser bpmnParser = bpmnDeployer.getBpmnParser();
for (String resourceName : resources.keySet()) {
//判断资源文件是否属于BPMN资源文件
if (isBpmnResource(resourceName)) {
ResourceEntity resource = resources.get(resourceName);
byte[] bytes = resource.getBytes();
ByteArrayInputStream inputStream = new ByteArrayInputStream(bytes);
//执行解析
BpmnParse bpmnParse = bpmnParser.createParse().sourceInputStream(inputStream)
.deployment(deploymentEntity).name(resourceName);
bpmnParse.execute();
//解析后即可通过bpmnParse.getBpmnModel() 获取流程模型信息 bpmnParse.getSequenceFlows() 获取顺序流信息

//由于流程定义文件中一般只定义一个流程,故get(0)
Collection<FlowElement> fes = bpmnParse.getBpmnModel()
.getProcesses().get(0).getFlowElements();
//fes即为当前流程定义中的所有元素集合,可以按需求进行相应处理
getFlowElement(fes, true, null);
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息