德玛西亚之WorkFlow(七)流程的发布与定义
德玛西亚之WorkFlow(七)流程的发布与定义
流程的存储和部署主要涉及的服务组件是RepositoryService。RepositoryService 主要用于对 Activiti 中的流程存储的相关数据进行操作,这些操作包括对流程存储数据的管理、流程部署以及对流程的基本操作等。
1 流程的部署
流程的部署就是将设计好的流程文件*.bpmn这类的文件按照activiti的统一的格式存储到数据库中,方便统一管理和操作。
1.1 流程的几种部署方法
常用的就是如下方式,发布和知识部署信息
public void deployTest() {
DeploymentBuilder createDeployment = repositoryService.createDeployment();
Deployment deploy = createDeployment.addClasspathResource("articles07/ProcessArticles07.bpmn")
.name("ProcessArticles7")
.tenantId ("tenanid)
.key("ProcessArticles07")
.category("myCategory")
.deploy();
logger.info(deploy.getName());
logger.info(deploy.getKey());
logger.info(deploy.getId());
}
DeploymentBuilder 中包含了多个 ddXXX 方法,可以用于为部署添加资源,这些方法有:
addClasspathResource(String resource): 添加 classpath 下的资源文件。
addlnputStream(String resourceName, InputStream):添加输入流资源。
addSting(String resourceName, String text): 添加字符串资源。
addZipinputStream(ZipinputStream inputStream) : 添加 zip 压缩包资源。
addBpmnModel(String resourceName, BpmnModel bpmnMode) : 解析 BPMN 模型对象,并作为资源保存。
addBytes(String resourceName, byte[] bytes): 添加字节资源。
1.2 过滤重复部署
进行了第一次部署后,资源没有发生变化而再次进行部署,同样会将部署数据写入数据库中,想避免这种情况,可以调用 DeploymentBuilder 的 enableDuplicateFiltering 方法,该方法仅将 DeploymentBuilder 的 isDuplicateFilterEnabled 属性设置为 true 在执行 deploy 方法时,如果发现该值为 true ,则根据部署对象的名称去查找最后一条部署记录,如果发现最后一条部署记录与当前需要部署的记录一致,则不会重复部署。
1.3 取消部署时的验证
默认情况下 在部署时会对流程的 XML 文件进行验证,包括验证是否符合 BPMN2.0 的规范、定义的流程是否可执行。如果 XML 文件不符合规范或者定义的流程不可执行,那么将会在部署时抛出异常。如果想跳过这两个验证,可以调用 DeploymentBuilder 的 disableSchemaValidation 与 disableBpmnValidation 方法。
2 流程定义管理
流程部署是会将流程定义写在流程定义表中 ACT_RE_PROCDEF
2.1 流程的中止与**
@Test
public void definitionTest() {
Deployment deployment = repositoryService.createDeploymentQuery().deploymentId("30001").singleResult();
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult();
//中止流程定义
repositoryService.suspendProcessDefinitionById(processDefinition.getId());
//**流程定义
repositoryService.activateProcessDefinitionById(processDefinition.getId());
}
activateProcessDefinitionByld(String processDefinitionld):根据流程定义的 id **流程。
activateProcessDefinitionByld(String processDefinitionld, boolean activateProcesslnstances, Date activationDate):在某个时间**流程定义, 需要注意的是 activateProcesslnstances 参数,如果为 true ,则该流程定义下的流程实例,也会被**
suspendProcessDefinitionByld((String processDefinitionld :根据流程 **流程定义。
suspendProcessDefinitionByKey((String processDefinitionKey):根据流程的 key **流程定义,与中止流程定义的 uspendProcessDefinitionByKey 方法一致。
2.2 流程定义缓存配置
@Test
public void cacheTest() {
DeploymentBuilder createDeployment = repositoryService.createDeployment();
Deployment deploy = createDeployment.addClasspathResource("articles07/ProcessArticles07.bpmn")
.name("ProcessArticles7")
.key("ProcessArticles07")
.deploy();
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId(deploy.getId()).singleResult();
ProcessEngineConfigurationImpl configuration = (ProcessEngineConfigurationImpl) processEngine.getProcessEngineConfiguration();
DefaultDeploymentCache<ProcessDefinitionCacheEntry> cache = (DefaultDeploymentCache<ProcessDefinitionCacheEntry>) configuration.getProcessDefinitionCache();
logger.info(cache.get(processDefinition.getId()).toString());
}
,由于缓存没有限制 因此部署了 10 次,缓存( Map )中就有 10个元素,如果想限制缓存数量,可以在流程引擎的配置文件中使用以下配置。
<property name=” processDefinitionCacheLimit” value=” 2 ” />
2.3 流程定义的权限
对于 个用户或者用户组是否能操作(查看)某个流程定义的数据,需要进行相应的流程定义权限设置。在 Activiti 中,并没有对流程定义的权限进行检查,而是提供一种反向的方法,让调用者去管理这些权限数据,然后提供相应的 API 让使用人决定哪种数据可以被查询。
设置流程定义的用户权限
RepositoryService 中提供了 addCandidateStarterUser 方法,给流程定义与用户绑定权限,该方法实际上是向一个中间表中加入数据,表示流程与用户之间的关系 addCandidateStarterUser 方法的第一个参数为流程定义 Id, 第二个参数为用户的 ID。 一下 使用 addCandidateStarterUser 方法的示例。
//设置用户组与流程定义的关系(设置权限〉
repositoryService.addCandidateStarterUser(def.getId (),"userl");
repositoryService.addCandidateStarterUser(def.getId (),"user2");
调用 po itoryService addCandidateStarterUser 方法绑用户与流程定义的权限关系,运行代码清可以看到 ACT_RU_IDENTITYL 的数据。
设置流程定义的用户组权限
repositoryService.addCandidateStarterGroup (def.getId (),"groupl") ;
查询权限数据
//根据用户查询有权限的流程定义
List<ProcessDefinition> defs = repositoryService.
createProcessDefinitionQuery() .startableByUser (”userl”) . list();
//根据流程定义查询用户组数据
List<Gr。up> groups = identityService.createGroupQuery()
.p tentialStarter(def.getid()) .list();
//根据流程定义查询用户数据
List<User> users = identityService.createUserQuery()
. potentialstarter(def.getid ()).list () ;
//根据流程定义查询全部的 IdentityLink (ACT_RU_IDENTITYLINK 表〉 数据
List<IdentityLink> links = repositoryService.get IdentityLinksForProcessDefinition(def.getid());
3 数据查询与删除
查询和删除流程部署是的资源文件。
@Test
public void modelTest() throws Exception {
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId("37501").singleResult();
InputStream inputStream = repositoryService.getProcessModel(processDefinition.getId());
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream, "utf-8"));
String line = null;
while ((line = br.readLine())!=null) {
System.out.println(line);
}
}
@Test
public void diagrarmTest() throws Exception {
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().deploymentId("37501").singleResult();
InputStream inputStream = repositoryService.getProcessDiagram(processDefinition.getId());
//将输入流转换为图片对象
BufferedImage image= ImageIO.read(inputStream);
//保存为图片文
File file = File.createTempFile("diagrarm", ".png");
FileOutputStream fos = new FileOutputStream(file);
ImageIO.write(image, "png", fos);
fos.close ();
inputStream.close();
logger.info(file.getAbsolutePath());
}
@Test
public void resourceTest() {
Deployment deployment = repositoryService.createDeploymentQuery().deploymentId("37501").singleResult();
List<String> resourceNames = repositoryService.getDeploymentResourceNames(deployment.getId());
for (String string : resourceNames) {
logger.info(string);
}
}
删除部署资源
使用了 RepositoryService 的各个方法来查询部署所产生的相关资源数据如果需要删除这些数据,则可以使用 RepositoryService 提供的两个删除方法,这两个方法的描述如下。
deleteDeployment(String deploymentld):删除部署数据,不进行级联删除,这里所说的级联删除,是指与该部署相关的流程实例数据的删除。
deleteDeployment(String deploymentld, boolean cascade):是否进行级联删除,由调用者决定 如果 cascade 参数为 false ,效果等同于 deleteDeployment(String deploymentld) 方法:如果 cascade 为 true ,则会删除部署相关的流程实例数据。
注意:
如果设直为级联删除,则会删除流程实例数据( Processlnstance ),其中流程实例数据也包括流程任务( Task )与流程实例的历史数据;如果设直为 false,不进行级联删除的话,如果 Activiti 数据库中已经存在流程实例数据,那么将会删除失败,因为在删除劳程定义时,流程定义数据的 ID 已经被流程实例的相关数据所引用。
4 两个查询对象
DeploymentQuery 对象与 ProcessDefinitionQuery 对象查询流程的部署和流程定义数据。