springboot和activities工作流怎样合并

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工作流:

  1. 在Eclipse或其他BPMN 2.0建模器中创建一个新的BPMN 2.0文件。

  2. 在建模器中,拖动一个“开始事件”(start event)和一个“结束事件”(end event)到画布上。

  3. 连接这两个事件,形成一个流程流。

  4. 在流程中添加一个“用户任务”(user task)。

  5. 给“用户任务”命名为“Approve Document”。

  6. 将“Approve Document”任务分配给一个用户或用户组。

  7. 在任务上设置任务表单,以便用户可以在任务中输入所需的信息。

  8. 将流程保存为“myProcess.bpmn20.xml”。

  9. 将文件放置在Spring Boot应用程序的类路径中的“classpath:/processes”目录下。

  10. 在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应用程序时,需要注意以下几点:

  1. Activiti版本:确保使用的Activiti版本与Spring Boot版本兼容。建议使用最新版本的Activiti和Spring Boot。

  2. 文件位置和命名:将BPMN 2.0文件放置在Spring Boot应用程序的类路径中的“classpath:/processes”目录下,并为文件命名。在Activiti配置中,需要指定文件的资源路径和名称。

  3. 数据源和事务管理器:需要在配置中设置数据源和事务管理器,以便Activiti可以管理与工作流相关的数据。

  4. Activiti服务:需要定义所需的Activiti服务bean,例如RepositoryService、RuntimeService、TaskService等。这些服务可以用于管理流程定义、执行流程实例和处理用户任务等。

  5. 集成测试:建议编写集成测试,以确保Activiti工作流在Spring Boot应用程序中正常运行。可以使用Activiti提供的集成测试库或其他测试框架进行测试。

总之,集成Activiti工作流与Spring Boot应用程序需要仔细设置和配置,并进行充分的测试,以确保工作流能够正常运行并满足业务需求。

具体的例子

当然,以下是一个使用Spring Boot和Activiti集成的具体例子:

  1. 创建Spring Boot项目

使用Spring Initializr创建一个新的Spring Boot项目。在创建项目时,添加以下依赖项:

  • Spring Web:用于创建RESTful API。

  • Spring Data JPA:用于访问数据库。

  • H2 Database:用于在内存中存储数据。

  1. 添加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基本启动器和依赖项。

  1. 创建工作流定义

在项目的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”。

  1. 创建实体类

为了演示如何在工作流中使用JPA实体类,创建一个名为“Document”的JPA实体类,例如:

@Entity
public class Document {
​
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
​
    private String name;
​
    private String description;
​
    // getters and setters
​
}
  1. 创建服务类

创建一个名为“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中获取文档名称和描述,并将其保存到数据库中。

  1. 创建控制器

创建一个名为“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请求,例如启动流程实例、获取用户任务和完成任务。

  1. 运行应用程序

使用Maven打包并运行应用程序:

mvn clean package
java -jar target/my-application.jar
  1. 测试应用程序

使用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请求:

  1. 启动流程实例:该请求将启动名为“myProcess”的流程实例,并将文档名称和描述作为流程变量传递。在WorkflowService类中,startProcess()方法使用RuntimeService启动流程实例,并传递流程定义的Key和变量。

  2. 获取用户任务:该请求将返回分配给“john”用户的所有用户任务。在WorkflowService类中,getTasks()方法使用TaskService创建一个任务查询,并使用查询条件“taskAssignee”过滤任务列表。

  3. 完成任务:该请求将完成ID为“123”的用户任务,并将“approved”变量设置为true。在WorkflowService类中,completeTask()方法使用TaskService创建一个任务查询,并使用查询条件“taskId”获取要完成的任务。然后,该方法使用TaskService完成任务,并将变量保存到数据库中。

通过这个示例,你可以看到如何在Spring Boot应用程序中使用Activiti工作流。你可以根据自己的需要修改工作流定义、服务类和控制器类,以满足特定的业务需求。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值