Activiti中工作流的生命周期详细解析!一个BPMN流程示例带你认识项目中流程的生命周期 (2)

通过下面的API发布流程,所有与Activiti引擎的交互都是通过services

Deployment deployment = repositoryService.createDeployment() .addClasspathResource("FinancialReportProcess.bpmn20.xml") .deploy();

启动一个新流程实例,使用我们定义在流程定义里的id(对应XML文件中的process元素).注意这里的id对于Activiti来说,应该叫做key,一般在流程模型中使用的ID,在Activiti中都是Key:比如任务ID

ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("financialReport");

这样创建一个流程实例:

首先进入开始事件

开始事件之后,它会沿着所有的外出连线执行,到达第一个任务(“制作月度财报”)

Activiti会把一个任务保存到数据库里.这时,分配到这个任务的用户或群组会被解析,也会保存到数据库里

需要注意,Activiti引擎会继续执行流程的环节,除非遇到一个 等待状态:比如用户任务

在等待状态下,当前的流程实例的状态会保存到数据库中.直到用户决定完成任务才能改变这个状态

这时,引擎会继续执行,直到遇到下一个等待状态,或流程结束

如果中间引擎重启或崩溃,流程状态也会安全的保存在数据库里

任务创建之后,startProcessInstanceByKey会在到达用户任务这个等待状态之后才会返回.这时,任务分配给了一个组,这意味着这个组是执行这个任务的候选组

现在将所有东西都放在一起,来创建一个简单的java程序:

创建一个Java项目,把Activiti的jar和依赖放到classpath下:这些都可以在Activiti发布包的libs目录下找到

在调用Activiti服务之前,我们必须构造一个ProcessEngine,可以让我们访问服务

这里我们使用[单独运行]的配置,这会使用demo安装时的数据库来构建ProcessEngine

public static void main(String[] args) { // Create Activiti process engine ProcessEngine processEngine = ProcessEngineConfiguration .createStandaloneProcessEngineConfiguration() .buildProcessEngine(); // Get Activiti services RepositoryService repositoryService = processEngine.getRepositoryService(); RuntimeService runtimeService = processEngine.getRuntimeService(); // Deploy the process definition repositoryService.createDeployment() .addClasspathResource("FinancialReportProcess.bpmn20.xml") .deploy(); // Start a process instance runtimeService.startProcessInstanceByKey("financialReport"); } 任务列表

可以通过TaskService来获得任务,添加以下逻辑:

List<Task> tasks = taskService.createTaskQuery().taskCandidateUser("kermit").list();

注意传入的用户必须是accountancy组的一个成员,要和流程定义中相对应:

<potentialOwner> <resourceAssignmentExpression> <formalExpression>accountancy</formalExpression> </resourceAssignmentExpression> </potentialOwner>

也可以使用群组名称,通过任务查询API来获得相关的结果.在代码中添加如下逻辑:

TaskService taskService = processEngine.getTaskService(); List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("accountancy").list();

因为配置的ProcessEngine使用了与demo相同的数据,可以登录到Activiti Explorer.默认,accountancy(会计)组里没有任何人:

登录

点击组

创建一个新组

点击用户

把组分配给fozzie

使用fozzie/fozzie登录

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyxgfw.html