package com.iailab.module.bpm.framework.flowable.config; import cn.hutool.core.collection.ListUtil; import com.iailab.module.bpm.framework.flowable.core.behavior.BpmActivityBehaviorFactory; import com.iailab.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateInvoker; import com.iailab.module.bpm.framework.flowable.core.candidate.BpmTaskCandidateStrategy; import com.iailab.module.bpm.framework.flowable.core.event.BpmProcessInstanceEventPublisher; import com.iailab.module.system.api.user.AdminUserApi; import org.flowable.common.engine.api.delegate.FlowableFunctionDelegate; import org.flowable.common.engine.api.delegate.event.FlowableEventListener; import org.flowable.spring.SpringProcessEngineConfiguration; import org.flowable.spring.boot.EngineConfigurationConfigurer; import org.springframework.beans.factory.ObjectProvider; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.task.AsyncListenableTaskExecutor; import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; import java.util.List; /** * BPM 模块的 Flowable 配置类 * * @author jason */ @Configuration(proxyBeanMethods = false) public class BpmFlowableConfiguration { /** * 参考 {@link org.flowable.spring.boot.FlowableJobConfiguration} 类,创建对应的 AsyncListenableTaskExecutor Bean * * 如果不创建,会导致项目启动时,Flowable 报错的问题 */ @Bean(name = "applicationTaskExecutor") @ConditionalOnMissingBean(name = "applicationTaskExecutor") public AsyncListenableTaskExecutor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(8); executor.setMaxPoolSize(8); executor.setQueueCapacity(100); executor.setThreadNamePrefix("flowable-task-Executor-"); executor.setAwaitTerminationSeconds(30); executor.setWaitForTasksToCompleteOnShutdown(true); executor.setAllowCoreThreadTimeOut(true); executor.initialize(); return executor; } /** * BPM 模块的 ProcessEngineConfigurationConfigurer 实现类: * * 1. 设置各种监听器 * 2. 设置自定义的 ActivityBehaviorFactory 实现 */ @Bean public EngineConfigurationConfigurer bpmProcessEngineConfigurationConfigurer( ObjectProvider listeners, ObjectProvider customFlowableFunctionDelegates, BpmActivityBehaviorFactory bpmActivityBehaviorFactory) { return configuration -> { // 注册监听器,例如说 BpmActivityEventListener configuration.setEventListeners(ListUtil.toList(listeners.iterator())); // 设置 ActivityBehaviorFactory 实现类,用于流程任务的审核人的自定义 configuration.setActivityBehaviorFactory(bpmActivityBehaviorFactory); // 设置自定义的函数 configuration.setCustomFlowableFunctionDelegates(ListUtil.toList(customFlowableFunctionDelegates.stream().iterator())); }; } // =========== 审批人相关的 Bean ========== @Bean public BpmActivityBehaviorFactory bpmActivityBehaviorFactory(BpmTaskCandidateInvoker bpmTaskCandidateInvoker) { BpmActivityBehaviorFactory bpmActivityBehaviorFactory = new BpmActivityBehaviorFactory(); bpmActivityBehaviorFactory.setTaskCandidateInvoker(bpmTaskCandidateInvoker); return bpmActivityBehaviorFactory; } @Bean @SuppressWarnings("SpringJavaInjectionPointsAutowiringInspection") // adminUserApi 可以注入成功 public BpmTaskCandidateInvoker bpmTaskCandidateInvoker(List strategyList, AdminUserApi adminUserApi) { return new BpmTaskCandidateInvoker(strategyList, adminUserApi); } // =========== 自己拓展的 Bean ========== @Bean public BpmProcessInstanceEventPublisher processInstanceEventPublisher(ApplicationEventPublisher publisher) { return new BpmProcessInstanceEventPublisher(publisher); } }