###前言
上一篇作了一个简单的环境介绍,这里开始自己定义一个工作流。我用的开发工具是idea。
1、定义自己的工作流bpmn文件
- 安装bpmn插件:
我用的开发工具是idea,如果你用的eclipse可以直接参考官网的安装方法。
首先下载activti插件- actiBPM
File - settings-plugins-Browse-Repositories 搜索 actiBPM 双击搜索结果或点击Install plugin安装。
去掉启动时去掉processes目录的自动检测
spring boot在启动时会默默去检测processes目录并加载bpmn文件,如果没有那么会报错,这里我想手动部署工作流,所以在application.properties中加上配置,并且删除了processes目录,同时删除了activiti的所有相关表
#启动报错class path resource [processes/] cannot be resolved to URL because it does not exist
spring.activiti.check-process-definitions=false
-
新建一个activiti工作流文件
这次建立到dig/process
文件夹下,我想在项目启动的时候部署这个工作流或手动部署这个工作流
-
建立test.bpmn完成打开设计
idea建立bpmn文件不会生成png图片,所以直接复制这个文件到当前目录改名为test.xml,然后右键打开Diagrams designer ,然后另存为png文件即可。
2、部署定义的工作流
因为我这次没有直接建立到resources\process
目录下,所以不会自动部署。需要写一个类手动部署:
public class ActivitiDeployTest extends AbstratApplicationBaseBootTest {
@Autowired
private RepositoryService repositoryService;
//部署流程定义
@Test
public void deployementProcessDefinition(){
Deployment deployment = repositoryService//获取流程定义和部署对象相关的Service
.createDeployment()//创建部署对象
.name("test")//声明流程的名称
.addClasspathResource("dig/processes/myprocess.bpmn")//加载资源文件,一次只能加载一个文件
.addClasspathResource("dig/processes/myprocess.png")//
.deploy();//完成部署
System.out.println("部署ID:"+deployment.getId());//1
System.out.println("部署时间:"+deployment.getDeploymentTime());
}
}
可先启动spring boot,可以看到ac_re_deployment
表下没有部署记录。
act_re_procdef
也可看到一条流程信息
###3、Activiti对任务分配的扩展
当分配不复杂时,用户和组的设置非常麻烦。 为避免复杂性,可以使用用户任务的自定义扩展。
assignee属性:这个自定义扩展可以直接把用户任务分配给指定用户。
它和使用上面定义的humanPerformer 效果完全一样。
candidateUsers属性:这个自定义扩展可以为任务设置候选人。
它和使用上面定义的potentialOwner 效果完全一样。 注意它不需要像使用potentialOwner通过user(kermit)声明, 因为这个属性只能用于人员。
candidateGroups属性:这个自定义扩展可以为任务设置候选组。
它和使用上面定义的potentialOwner 效果完全一样。 注意它不需要像使用potentialOwner通过group(management)声明, 因为这个属性只能用于群组。
candidateUsers 和 candidateGroups 可以同时设置在同一个用户任务中。
注意:虽然activiti提供了一个账号管理组件, 也提供了IdentityService, 但是账号组件不会检测设置的用户是否村爱。 它嵌入到应用中,也允许activiti与其他已存的账户管理方案集成。
如果上面的方式还不满足需求,还可以使用创建事件的任务监听器 来实现自定义的分配逻辑:
DelegateTask会传递给TaskListener的实现, 通过它可以设置执行人,候选人和候选组:public class MyAssignmentHandler implements TaskListener {
public void notify(DelegateTask delegateTask) {
// Execute custom identity lookups here
// and then for example call following methods:
delegateTask.setAssignee("kermit");
delegateTask.addCandidateUser("fozzie");
delegateTask.addCandidateGroup("management");
...
}
}
使用spring时,可以使用向上面章节中介绍的自定义分配属性, 使用表达式 把任务监听器设置为spring代理的bean, 让这个监听器监听任务的创建事件。 下面的例子中,执行者会通过调用ldapService这个spring bean的findManagerOfEmployee方法获得。 流程变量emp会作为参数传递给bean。
public class FakeLdapService {
public String findManagerForEmployee(String employee) {
return “Kermit The Frog”;
}
public List findAllSales() {
return Arrays.asList(“kermit”, “gonzo”, “fozzie”);
}
}
脚本任务
描述