Spring MVC+MyBatis+Activiti集成开发全解析

一、技术选型与集成架构设计

在构建企业级工作流系统时,技术选型需兼顾开发效率与系统性能。Spring MVC作为轻量级Web框架,提供清晰的MVC分层架构;MyBatis通过XML/注解方式实现灵活的SQL管理;Activiti作为开源工作流引擎,支持BPMN 2.0标准规范。三者集成可形成”前端控制层-数据持久层-流程引擎层”的立体架构。

典型集成方案包含三个核心模块:

  1. 流程定义模块:通过Activiti Modeler设计流程模型,生成.bpmn20.xml文件
  2. 业务集成模块:使用Spring的@Autowired实现流程引擎与业务服务的解耦
  3. 动态表单模块:结合MyBatis实现流程变量与业务数据的双向绑定
  1. // 流程引擎配置示例
  2. @Configuration
  3. public class ProcessEngineConfig {
  4. @Bean
  5. public ProcessEngine processEngine() {
  6. ProcessEngineConfiguration cfg = new StandaloneProcessEngineConfiguration()
  7. .setJdbcUrl("jdbc:mysql://localhost:3306/workflow_db")
  8. .setJdbcUsername("root")
  9. .setJdbcPassword("password")
  10. .setDatabaseSchemaUpdate("true");
  11. return cfg.buildProcessEngine();
  12. }
  13. }

二、核心开发实践详解

1. 流程部署与启动

流程部署包含两种方式:静态部署(通过.bpmn文件)和动态部署(通过API创建)。推荐采用混合模式,核心流程使用静态部署确保稳定性,临时流程采用动态部署提升灵活性。

  1. // 流程部署示例
  2. @Autowired
  3. private RepositoryService repositoryService;
  4. public void deployProcess(MultipartFile file) {
  5. try (InputStream inputStream = file.getInputStream()) {
  6. Deployment deployment = repositoryService.createDeployment()
  7. .addInputStream(file.getOriginalFilename(), inputStream)
  8. .name("采购审批流程")
  9. .deploy();
  10. System.out.println("部署ID:" + deployment.getId());
  11. } catch (IOException e) {
  12. throw new RuntimeException("流程部署失败", e);
  13. }
  14. }

2. 任务处理与委托

任务处理包含任务查询、任务认领、任务完成等核心操作。需特别注意任务委托场景,通过TaskService.setAssignee()实现任务转办,结合IdentityService管理用户组关系。

  1. // 任务处理示例
  2. @Autowired
  3. private TaskService taskService;
  4. public List<Task> getUserTasks(String userId) {
  5. return taskService.createTaskQuery()
  6. .taskAssignee(userId)
  7. .active()
  8. .list();
  9. }
  10. public void completeTask(String taskId, Map<String, Object> variables) {
  11. taskService.complete(taskId, variables);
  12. }

3. 多实例处理机制

对于需要多人审批的场景,Activiti提供多实例支持。通过multiInstanceLoopCharacteristics配置并行或串行处理,结合completionCondition设置完成条件。

  1. <!-- 多实例配置示例 -->
  2. <userTask id="approvalTask" name="部门审批">
  3. <multiInstanceLoopCharacteristics isSequential="false">
  4. <loopDataInputRef>assigneeList</loopDataInputRef>
  5. <completionCondition>${nrOfCompletedInstances/nrOfInstances >= 0.6}</completionCondition>
  6. </multiInstanceLoopCharacteristics>
  7. </userTask>

三、高级应用场景实现

1. 动态表单集成

通过扩展TaskFormHandler接口,实现流程变量与表单字段的动态映射。推荐采用JSON Schema定义表单结构,结合MyBatis的@SelectProvider动态生成SQL。

  1. // 动态表单处理示例
  2. public Map<String, Object> getFormData(String taskId) {
  3. Task task = taskService.createTaskQuery().taskId(taskId).singleResult();
  4. ProcessInstance instance = runtimeService.createProcessInstanceQuery()
  5. .processInstanceId(task.getProcessInstanceId())
  6. .singleResult();
  7. // 获取流程变量作为表单初始值
  8. Map<String, Object> variables = runtimeService.getVariables(instance.getId());
  9. return variables;
  10. }

2. 历史数据追溯

Activiti提供完整的历史数据接口,通过HistoryService可查询流程实例、任务、变量等历史记录。建议结合定时任务定期归档历史数据,避免影响主库性能。

  1. // 历史数据查询示例
  2. public List<HistoricTaskInstance> getHistoricTasks(String processInstanceId) {
  3. return historyService.createHistoricTaskInstanceQuery()
  4. .processInstanceId(processInstanceId)
  5. .finished()
  6. .orderByHistoricTaskInstanceEndTime()
  7. .desc()
  8. .list();
  9. }

3. 异步任务处理

对于耗时操作(如文件处理、外部调用),建议使用AsyncExecutor实现异步执行。通过配置jobExecutorActivate参数控制异步任务执行策略,结合@Async注解简化开发。

  1. // 异步任务配置
  2. @Bean
  3. public AsyncTaskExecutor asyncTaskExecutor() {
  4. ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
  5. executor.setCorePoolSize(5);
  6. executor.setMaxPoolSize(10);
  7. executor.setQueueCapacity(200);
  8. return executor;
  9. }
  10. // 异步服务示例
  11. @Service
  12. public class AsyncService {
  13. @Async
  14. public void processFile(MultipartFile file) {
  15. // 文件处理逻辑
  16. }
  17. }

四、性能优化与监控方案

1. 数据库优化

  • 采用分库分表策略处理历史数据
  • 为常用查询字段建立索引(如PROCINST_ID、TASKDEF_KEY
  • 定期执行DELETE FROM ACT_GE_BYTEARRAY WHERE DEPLOYMENT_ID_ NOT IN (...)清理无用资源

2. 缓存策略

  • 使用Redis缓存流程定义和权限数据
  • RepositoryService.createDeploymentQuery()等查询操作添加二级缓存
  • 配置@Cacheable注解缓存常用方法结果

3. 监控告警

集成日志服务实现全链路追踪:

  1. 通过MDC实现日志上下文传递
  2. 使用ELK收集分析流程日志
  3. 配置Prometheus监控关键指标(任务积压数、平均处理时长)
  1. # 监控配置示例
  2. metrics:
  3. enabled: true
  4. endpoint: /actuator/metrics
  5. metrics:
  6. - name: process.instance.count
  7. description: 当前活动流程实例数
  8. - name: task.average.duration
  9. description: 任务平均处理时长(ms)

五、最佳实践总结

  1. 版本兼容性:推荐使用Spring Boot 2.x + Activiti 6.x + MyBatis 3.5.x的稳定组合
  2. 异常处理:实现ProcessEngineExceptionHandler统一处理流程异常
  3. 安全控制:结合Spring Security实现流程权限的RBAC模型
  4. 测试策略:采用JUnit 5 + Testcontainers构建集成测试环境
  5. 部署方案:使用Kubernetes实现流程引擎的弹性伸缩

通过系统掌握上述技术要点,开发者能够构建出支持高并发、可扩展的企业级工作流系统。实际项目中建议结合具体业务场景,在标准实现基础上进行定制化开发,平衡开发效率与系统性能。