Spring Boot是一种Java框架,用于构建基于Spring的Web应用程序。它提供了一种快速和简便的方式来创建和配置Spring应用程序。而Activities工作流是一种流程管理框架,可用于实现复杂的业务流程。
要将Spring Boot和Activities工作流结合起来,可以使用Activiti Spring Boot Starter,这是一个Activiti工作流与Spring Boot集成的官方支持库。该库提供了一组Spring Boot Starter依赖项,使Activiti与Spring Boot应用程序无缝集成。使用该库,可以轻松地将Activiti工作流集成到Spring Boot应用程序中。
要使用Activiti Spring Boot Starter,需要在Spring Boot应用程序的依赖项中添加Activiti Spring Boot Starter依赖项。然后,可以使用Activiti工作流的API创建和执行工作流实例,也可以使用Spring的依赖注入机制注入Activiti服务,以便更轻松地使用Activiti工作流。
下面是一个简单的示例,演示如何在Spring Boot应用程序中使用Activiti工作流:
@SpringBootApplication public class MyApplication { @Autowired private ProcessEngine processEngine; public static void main(String[] args) { SpringApplication.run(MyApplication.class, args); } @Bean CommandLineRunner init() { return args -> { // 创建并启动工作流实例 ProcessInstance processInstance = processEngine.getRuntimeService() .startProcessInstanceByKey("myProcess"); }; } }
在上面的示例中,创建了一个Spring Boot应用程序,并使用@Autowired注解将Activiti的ProcessEngine服务注入到MyApplication类中。然后,使用CommandLineRunner bean来创建并启动Activiti工作流实例。
需要注意的是,此示例假定已经定义了一个名为“myProcess”的Activiti工作流。如果没有定义,则需要在应用程序中定义该工作流,以便在运行时使用。
通过Activiti Spring Boot Starter,可以轻松地将Activiti工作流集成到Spring Boot应用程序中,从而实现复杂的业务流程。
如何定义了一个名为“myProcess”的Activiti工作流
要定义一个名为“myProcess”的Activiti工作流,可以使用Activiti提供的BPMN 2.0建模器,该建模器可用于创建和编辑BPMN 2.0流程定义。以下是一个简单的示例,演示如何定义一个名为“myProcess”的Activiti工作流:
-
在Eclipse或其他BPMN 2.0建模器中创建一个新的BPMN 2.0文件。
-
在建模器中,拖动一个“开始事件”(start event)和一个“结束事件”(end event)到画布上。
-
连接这两个事件,形成一个流程流。
-
在流程中添加一个“用户任务”(user task)。
-
给“用户任务”命名为“Approve Document”。
-
将“Approve Document”任务分配给一个用户或用户组。
-
在任务上设置任务表单,以便用户可以在任务中输入所需的信息。
-
将流程保存为“myProcess.bpmn20.xml”。
-
将文件放置在Spring Boot应用程序的类路径中的“classpath:/processes”目录下。
-
在Spring Boot应用程序中,定义一个Activiti配置类,以便从类路径中加载工作流定义。
@Configuration public class ActivitiConfig { @Autowired private DataSource dataSource; @Autowired private ResourceLoader resourceLoader; @Bean public SpringProcessEngineConfiguration processEngineConfiguration() { SpringProcessEngineConfiguration config = new SpringProcessEngineConfiguration(); config.setDataSource(dataSource);//添加数据库 config.setDatabaseSchemaUpdate("true");//自动建表 config.setTransactionManager(transactionManager());//事件?出错rollback config.setAsyncExecutorActivate(false);//异步处理关闭? config.setDeploymentResources(new Resource[] { resourceLoader.getResource("classpath:/processes/myProcess.bpmn20.xml") });//添加bpmn文件 return config; } @Bean public ProcessEngineFactoryBean processEngine() { ProcessEngineFactoryBean factoryBean = new ProcessEngineFactoryBean(); factoryBean.setProcessEngineConfiguration(processEngineConfiguration());//将配置加载到流程引擎工厂 return factoryBean; } @Bean //返回值:平台事务管理器 public PlatformTransactionManager transactionManager() { return new DataSourceTransactionManager(dataSource);//数据源事务管理器 } @Bean public RepositoryService repositoryService() throws Exception {//仓库服务 return processEngine().getObject().getRepositoryService(); } @Bean public RuntimeService runtimeService() throws Exception {//运行时服务 return processEngine().getObject().getRuntimeService(); } @Bean public TaskService taskService() throws Exception {//任务服务 return processEngine().getObject().getTaskService(); } @Bean public HistoryService historyService() throws Exception {//历史服务 return processEngine().getObject().getHistoryService(); } @Bean public ManagementService managementService() throws Exception {//管理服务 return processEngine().getObject().getManagementService(); } }
在上述配置类中,配置了一个SpringProcessEngineConfiguration bean,以便从类路径中加载工作流定义。在此示例中,工作流定义被加载为一个资源对象,并在配置中使用了“deploymentResources”属性。然后,定义了其他Activiti服务的bean,如RepositoryService、RuntimeService、TaskService等。
使用这种方式,可以将定义好的“myProcess”工作流与Spring Boot应用程序集成。
需要注意的是什么
在集成Activiti工作流与Spring Boot应用程序时,需要注意以下几点:
-
Activiti版本:确保使用的Activiti版本与Spring Boot版本兼容。建议使用最新版本的Activiti和Spring Boot。
-
文件位置和命名:将BPMN 2.0文件放置在Spring Boot应用程序的类路径中的“classpath:/processes”目录下,并为文件命名。在Activiti配置中,需要指定文件的资源路径和名称。
-
数据源和事务管理器:需要在配置中设置数据源和事务管理器,以便Activiti可以管理与工作流相关的数据。
-
Activiti服务:需要定义所需的Activiti服务bean,例如RepositoryService、RuntimeService、TaskService等。这些服务可以用于管理流程定义、执行流程实例和处理用户任务等。
-
集成测试:建议编写集成测试,以确保Activiti工作流在Spring Boot应用程序中正常运行。可以使用Activiti提供的集成测试库或其他测试框架进行测试。
总之,集成Activiti工作流与Spring Boot应用程序需要仔细设置和配置,并进行充分的测试,以确保工作流能够正常运行并满足业务需求。
具体的例子
当然,以下是一个使用Spring Boot和Activiti集成的具体例子:
-
创建Spring Boot项目
使用Spring Initializr创建一个新的Spring Boot项目。在创建项目时,添加以下依赖项:
-
Spring Web:用于创建RESTful API。
-
Spring Data JPA:用于访问数据库。
-
H2 Database:用于在内存中存储数据。
-
添加Activiti依赖项
在项目的pom.xml文件中,添加以下Activiti依赖项:
xmlCopy code<dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter-basic</artifactId> <version>7.2.0</version> </dependency>
这将为项目添加Activiti基本启动器和依赖项。
-
创建工作流定义
在项目的src/main/resources目录下创建一个名为“processes”的目录,并在其中创建一个BPMN 2.0文件,例如“myProcess.bpmn20.xml”。使用Activiti Modeler或其他BPMN 2.0编辑器创建工作流定义,例如:
xmlCopy code<?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:activiti="http://activiti.org/bpmn" targetNamespace="http://www.activiti.org/test"> <process id="myProcess" name="My process" isExecutable="true"> <startEvent id="start" name="Start"></startEvent> <sequenceFlow id="flow1" sourceRef="start" targetRef="task1"></sequenceFlow> <userTask id="task1" name="Task 1"></userTask> <sequenceFlow id="flow2" sourceRef="task1" targetRef="task2"></sequenceFlow> <userTask id="task2" name="Task 2"></userTask> <sequenceFlow id="flow3" sourceRef="task2" targetRef="end"></sequenceFlow> <endEvent id="end" name="End"></endEvent> </process> </definitions>
在这个示例中,定义了一个名为“myProcess”的工作流程,包括两个用户任务“Task 1”和“Task 2”。
-
创建实体类
为了演示如何在工作流中使用JPA实体类,创建一个名为“Document”的JPA实体类,例如:
@Entity public class Document { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private String description; // getters and setters }
-
创建服务类
创建一个名为“DocumentService”的服务类,用于处理文档的业务逻辑,例如:
@Service public class DocumentService { @Autowired private DocumentRepository documentRepository; @Transactional public void createDocument(Document document) { documentRepository.save(document); } public List<Document> getDocuments() { return documentRepository.findAll(); } }
在这个示例中,DocumentService类使用JPA repository来访问数据库,并提供了创建和获取文档的方法。
2.创建工作流服务类
创建一个名为“WorkflowService”的服务类,用于处理Activiti工作流的业务逻辑,例如:
@Service public class WorkflowService { @Autowired private RuntimeService runtimeService; @Autowired private TaskService taskService; @Autowired private DocumentService documentService; //开启流程 public void startProcess(String processDefinitionKey, Map<String, Object> variables) { //通过传入流程定义的key,放入流程变量(可以控制流程某些地方的走向)来开启流程 runtimeService.startProcessInstanceByKey(processDefinitionKey, variables); } //查询当前个人待执行的任务 public List<Task> getTasks(String assignee) { //通过传入assignee查询数据库的act_ru_task表找到任务 return taskService.createTaskQuery().taskAssignee(assignee).list(); } //执行任务 @Transactional public void completeTask(String taskId, Map<String, Object> variables) { //获取当前执行的任务,通过任务id查询 Task task = taskService.createTaskQuery().taskId(taskId).singleResult(); //获取文档名称和描述,并将其保存到数据库中 String processInstanceId = task.getProcessInstanceId(); String documentName = (String) variables.get("documentName");//从流程变量获取文档名称 String documentDescription = (String) variables.get("documentDescription");//从流程变量获取文档描述 Document document = new Document(); document.setName(documentName); document.setDescription(documentDescription); documentService.createDocument(document); taskService.complete(taskId, variables);//执行任务 } }
在这个示例中,WorkflowService类使用Activiti RuntimeService和TaskService来启动流程实例、获取用户任务和完成任务。在completeTask()方法中,WorkflowService类还将从variables中获取文档名称和描述,并将其保存到数据库中。
-
创建控制器
创建一个名为“WorkflowController”的控制器类,用于处理HTTP请求,例如:
@RestController public class WorkflowController { @Autowired private WorkflowService workflowService; @PostMapping("/start") public void startProcess(@RequestBody Map<String, Object> request) { //从请求头中获取流程定义的key和流程变量 String processDefinitionKey = (String) request.get("processDefinitionKey"); Map<String, Object> variables = (Map<String, Object>) request.get("variables"); workflowService.startProcess(processDefinitionKey, variables);//调用启动方法 } @GetMapping("/tasks") public List<Task> getTasks(@RequestParam String assignee) { //通过传入任务的执行者,来获取任务list return workflowService.getTasks(assignee); } @PostMapping("/complete") public void completeTask(@RequestBody Map<String, Object> request) { //获取请求中的taskid和流程变量 String taskId = (String) request.get("taskId"); Map<String, Object> variables = (Map<String, Object>) request.get("variables"); workflowService.completeTask(taskId, variables);//调用任务执行方法 } }
在这个示例中,WorkflowController类使用WorkflowService类来处理HTTP请求,例如启动流程实例、获取用户任务和完成任务。
-
运行应用程序
使用Maven打包并运行应用程序:
mvn clean package java -jar target/my-application.jar
-
测试应用程序
使用curl或其他HTTP客户端测试应用程序,例如:
# 启动流程实例 curl -X POST -H "Content-Type: application/json" -d '{"processDefinitionKey":"myProcess","variables":{"documentName":"My document","documentDescription":"This is my document."}}' http://localhost:8080/start # 获取用户任务 curl -X GET http://localhost:8080/tasks?assignee=john # 完成任务 curl -X POST -H "Content-Type: application/json" -d '{"taskId":"123","variables":{"approved":true}}' http://localhost:8080/complete
示例中,使用curl测试了三个HTTP请求:
-
启动流程实例:该请求将启动名为“myProcess”的流程实例,并将文档名称和描述作为流程变量传递。在WorkflowService类中,startProcess()方法使用RuntimeService启动流程实例,并传递流程定义的Key和变量。
-
获取用户任务:该请求将返回分配给“john”用户的所有用户任务。在WorkflowService类中,getTasks()方法使用TaskService创建一个任务查询,并使用查询条件“taskAssignee”过滤任务列表。
-
完成任务:该请求将完成ID为“123”的用户任务,并将“approved”变量设置为true。在WorkflowService类中,completeTask()方法使用TaskService创建一个任务查询,并使用查询条件“taskId”获取要完成的任务。然后,该方法使用TaskService完成任务,并将变量保存到数据库中。
通过这个示例,你可以看到如何在Spring Boot应用程序中使用Activiti工作流。你可以根据自己的需要修改工作流定义、服务类和控制器类,以满足特定的业务需求。