温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

如何在Spring Boot中使用Activiti

发布时间:2021-05-17 17:17:25 来源:亿速云 阅读:236 作者:Leah 栏目:编程语言

本篇文章给大家分享的是有关如何在Spring Boot中使用Activiti,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

VacationRequest.bpmn20.xml将start事件定义为:

<startEvent id="startEvent" name="请假" activiti:initiator="employeeName">
 <extensionElements>
  <activiti:formProperty id="numberOfDays" name="Number of days" type="long"
        required="true"/>
  <activiti:formProperty id="startDate" name="Vacation start date (MM-dd-yyyy)"
        type="date" datePattern="MM-dd-yyyy hh:mm" required="true"/>
  <activiti:formProperty id="reason" name="Reason for leave" type="string"/>
  <modeler:editor-resource-id><![CDATA[startEvent1]]></modeler:editor-resource-id>
 </extensionElements>
</startEvent>

分配给用户组“management”的第一个用户任务userTask将如下所示:

<userTask id="handle_vacation_request" name="申请请假">
 <documentation>${employeeName} 请假 ${numberOfDays} 天
  (Motivation: ${reason}).
 </documentation>
 <extensionElements>
  <activiti:formProperty id="vacationApproval"
        name="你要批准这个请假要求吗?"
        type="enum"
        required="true"/>
  <activiti:formProperty id="comments" name="经理的批示" type="string"/>
  <modeler:allow-send-email><![CDATA[true]]></modeler:allow-send-email>
  <modeler:activiti-idm-initiator><![CDATA[true]]></modeler:activiti-idm-initiator>
  <modeler:editor-resource-id>
   <![CDATA[sid-B9AA8E66-2F11-45D0-A270-B052E1A9248E]]></modeler:editor-resource-id>
 </extensionElements>
 <potentialOwner>
  <resourceAssignmentExpression>
   <formalExpression>management</formalExpression>
  </resourceAssignmentExpression>
 </potentialOwner>
</userTask>

使用ServiceTask,我们需要定义要执行的代码段。我们将SendEmailServiceTask.java类作为这段代码执行者。

<serviceTask id="send-email-confirmation" name="发送邮件确认"
    activiti:class="com.example.activitiwithspring.servicetasks.SendEmailServiceTask.java">
 <extensionElements>
  <modeler:editor-resource-id>
   <![CDATA[sid-2C5E1831-9101-4F70-9AEF-4BA72B704205]]></modeler:editor-resource-id>
 </extensionElements>
</serviceTask>

SendEmailServiceTask的代码如下:实现JavaDelegate接口,实现其execute方法:

public class SendEmailServiceTask implements JavaDelegate {

 public void execute(DelegateExecution execution) {
  //logic to sent email confirmation
 }

}

通过在“sequenceFlow”中添加“conditionExpression”标记来决定发送邮件在什么条件下触发,也就是定义一个条件流:

<sequenceFlow id="flow3" name="批准"
    sourceRef="sid-12A577AE-5227-4918-8DE1-DC077D70967C"
    targetRef="send-email-confirmation">
 <extensionElements>
  <modeler:editor-resource-id>
   <![CDATA[sid-609BEB69-E833-4D2F-BD14-FC8F7FD3E9C7]]></modeler:editor-resource-id>
 </extensionElements>
 <conditionExpression xsi:type="tFormalExpression">
  <![CDATA[${vacationApproved == 'true'}]]></conditionExpression>
</sequenceFlow>

这里,vacationApproved是上面的UserTask的formProperty。

部署流程

为了使我们的流程被Activiti Engine所知,我们需要部署该流程。我们可以使用RepositoryService以编程方式执行此操作。让我们编写一个JUnit测试来看看:

@Test
public void givenBPMN_whenDeployProcess_thenDeployed() {
 ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
 RepositoryService repositoryService = processEngine.getRepositoryService();
 repositoryService.createDeployment()
  .addClasspathResource("org/activiti/test/vacationRequest.bpmn20.xml")
  .deploy();
 Long count = repositoryService.createProcessDefinitionQuery().count();
 assertTrue(count >= 1);
}

部署意味着引擎将解析BPMN流程定义文件并将其转换为可执行文件。此外,还会将记录添加到每个部署的Repository表中。之后,我们可以查询Repository服务从而获取已部署的进程:也就是ProcessDefinitions。

启动流程实例ProcessInstance

在将ProcessDefinition部署到Activiti Engine之后,我们可以通过创建ProcessInstances来执行该流程定义。如果说ProcessDefinition绘制的是一幅蓝图,那么processInstance就是它的执行实现。

对于一个ProcessDefinition,可以有多个ProcessInstances。

可以通过RuntimeService访问与ProcessInstances相关的所有详细信息。

在我们的示例中,在开始事件中,我们需要传递休假天数、开始日期和原因。我们将使用流程变量,并在创建ProcessInstance时传递它们。

编写一个JUnit测试用例实现上面想法:

@Test
public void givenDeployedProcess_whenStartProcessInstance_thenRunning() {
 //deploy the process definition 
 Map<String, Object> variables = new HashMap >();
 variables.put("employeeName", "John");
 variables.put("numberOfDays", 4);
 variables.put("vacationMotivation", "I need a break!");

 RuntimeService runtimeService = processEngine.getRuntimeService();
 ProcessInstance processInstance = runtimeService
   .startProcessInstanceByKey("vacationRequest", variables);
 Long count=runtimeService.createProcessInstanceQuery().count();

 assertEquals("1", count.toString());
}

某个流程定义的多个实例将因流程变量而异,也就是说,同一份流程定义,因为变量不同,导致流程实例也会不同。

有多种方法启动流程实例,在这里,我们正在使用该流程的key:vacationRequest启动流程,启动流程实例后,我们可以通过查询RuntimeService来获取有关它的信息。

完成任务

当我们的流程实例开始运行时,第一步执行的是用户任务userTask,分配任务给用户组“management”的用户。该用户可能有一个收件箱,其中包含要由他们完成的任务列表。现在,如果我们想继续执行流程,则需要用户完成此任务。对于Activiti Engine,它被称为“完成任务”。

我们可以查询TaskService,获取任务对象,然后完成它。

@Test
public void givenProcessInstance_whenCompleteTask_thenGotNextTask() {
 // 部署流程并开始一个流程实例 
 TaskService taskService = processEngine.getTaskService();
 List<Task> tasks = taskService.createTaskQuery()
   .taskCandidateGroup("management").list();
 Task task = tasks.get(0);

 Map<String, Object> taskVariables = new HashMap<>();
 taskVariables.put("vacationApproved", "false");
 taskVariables.put("comments", "We have a tight deadline!");
 taskService.complete(task.getId(), taskVariables);

 Task currentTask = taskService.createTaskQuery()
   .taskName("修改休假请求").singleResult();
 assertNotNull(currentTask);
}

请注意,TaskService的complete()方法也接受所需的流程变量。我们传递了经理的回复。

在此之后,流程引擎将继续下一步。在这里,下一步询问员工是否要重新发送休假请求。

因此,我们的ProcessInstance正在等待此UserTask,其名称为“修改休假请求”。 

暂停和激活流程

我们可以暂停ProcessDefinition和ProcessInstance。如果我们暂停一个流程定义ProcessDefinition,则在它暂停挂起时我们就无法创建它的实例。我们可以使用RepositoryService来做到这一点:

@Test(expected = ActivitiException.class)
public void givenDeployedProcess_whenSuspend_thenNoProcessInstance() {
 // deploy the process definition
 repositoryService.suspendProcessDefinitionByKey("vacationRequest");
 runtimeService.startProcessInstanceByKey("vacationRequest");
}

springboot是什么

springboot一种全新的编程规范,其设计目的是用来简化新Spring应用的初始搭建以及开发过程,SpringBoot也是一个服务于框架的框架,服务范围是简化配置文件。

以上就是如何在Spring Boot中使用Activiti,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI