ProcessEngineConfiguration的构建以及springboot自动配置

Activiti 工作流引擎学习笔记

关于如何构建ProcessEngineConfiguration 的理解

  1. ProcessEngineConfiguration 的类层次关系

通过类图。大致可以了解到ProcessEngineConfiguration的实现类大致有4中,即 jta spring standalone 和in mem 的。

  1. ProcessEngineConfiguration 类中创建ProcessEngineConfiguration 的静态方法

    // 默认使用activiti.cfg.xml 配置文件获取processEngineConfiguration名称的ProcessEngineConfiguration对象
    public static ProcessEngineConfiguration createProcessEngineConfigurationFromResourceDefault() {
        return createProcessEngineConfigurationFromResource("activiti.cfg.xml", "processEngineConfiguration");
      }
    //通过指定配置获取文件获取processEngineConfiguration名称的ProcessEngineConfiguration对象
      public static ProcessEngineConfiguration createProcessEngineConfigurationFromResource(String resource) {
        return createProcessEngineConfigurationFromResource(resource, "processEngineConfiguration");
      }
    //通过指定配置文件和bean 获取ProcessEngineConfiguration对象
      public static ProcessEngineConfiguration createProcessEngineConfigurationFromResource(String resource, String beanName) {
        return BeansConfigurationHelper.parseProcessEngineConfigurationFromResource(resource, beanName);
      }
    
      public static ProcessEngineConfiguration createProcessEngineConfigurationFromInputStream(InputStream inputStream) {
        return createProcessEngineConfigurationFromInputStream(inputStream, "processEngineConfiguration");
      }
    
      public static ProcessEngineConfiguration createProcessEngineConfigurationFromInputStream(InputStream inputStream, String beanName) {
        return BeansConfigurationHelper.parseProcessEngineConfigurationFromInputStream(inputStream, beanName);
      }
    /*
    上面的方法,基本上是使用spring 的方式获取配置文件中创建的ProcessEngineConfiguration对象
    */
    
    
    
    //创建StandaloneProcessEngineConfiguration的ProcessEngineConfiguration 
      public static ProcessEngineConfiguration createStandaloneProcessEngineConfiguration() {
        return new StandaloneProcessEngineConfiguration();
      }
    //创建一个StandaloneInMemProcessEngineConfiguration de ProcessEngineConfiguration 对象
      public static ProcessEngineConfiguration createStandaloneInMemProcessEngineConfiguration() {
        return new StandaloneInMemProcessEngineConfiguration();
      }
    

重点

创建ProcessEngineConfiguration 的方式基本上是三种,一种是使用内存的,一种是使用StandaloneProcessEngineConfiguration 的,然后自己调用set方法进行配置,另外一种就是通过配置文件进行配置

关于 springboot 如何构建 SpringProcessEngineConfiguration

  1. 不用说,我们先找到 spring.factories 查看自动配置类

## Activiti auto-configurations

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
    org.activiti.spring.boot.EndpointAutoConfiguration,\
    org.activiti.spring.boot.ProcessEngineAutoConfiguration

即ProcessEngineAutoConfiguration

@Configuration
@AutoConfigureAfter(name = {"org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration",
        "org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration"})
///ActivitiProperties是我们的属性配置文件
@EnableConfigurationProperties({ActivitiProperties.class, AsyncExecutorProperties.class})
public class ProcessEngineAutoConfiguration extends AbstractProcessEngineAutoConfiguration {

    public static final String BEHAVIOR_FACTORY_MAPPING_CONFIGURER = "behaviorFactoryMappingConfigurer";
    private final UserGroupManager userGroupManager;

    public ProcessEngineAutoConfiguration(UserGroupManager userGroupManager) {
        this.userGroupManager = userGroupManager;
    }
//创建SpringProcessEngineConfiguration  bean
    @Bean
    @ConditionalOnMissingBean
    public SpringProcessEngineConfiguration springProcessEngineConfiguration(
            DataSource dataSource,
            PlatformTransactionManager transactionManager,
            SpringAsyncExecutor springAsyncExecutor,
            ActivitiProperties activitiProperties,
            ProcessDefinitionResourceFinder processDefinitionResourceFinder,
            ProjectModelService projectModelService,
            @Autowired(required = false) List<ProcessEngineConfigurationConfigurer> processEngineConfigurationConfigurers,
            @Autowired(required = false) List<ProcessEngineConfigurator> processEngineConfigurators) throws IOException {

        SpringProcessEngineConfiguration conf = new SpringProcessEngineConfiguration(projectModelService);
        return conf;
    }

我们去看看父类中实现了哪些功能

public abstract class AbstractProcessEngineAutoConfiguration
        extends AbstractProcessEngineConfiguration {

  @Bean
  public SpringAsyncExecutor springAsyncExecutor(TaskExecutor applicationTaskExecutor) {
    return new SpringAsyncExecutor(applicationTaskExecutor, springRejectedJobsHandler());
  }
  
  @Bean 
  public SpringRejectedJobsHandler springRejectedJobsHandler() {
    return new SpringCallerRunsRejectedJobsHandler();
  }

  protected Set<Class<?>> getCustomMybatisMapperClasses(List<String> customMyBatisMappers) {
    Set<Class<?>> mybatisMappers = new HashSet<>();
    for (String customMybatisMapperClassName : customMyBatisMappers) {
      try {
        Class customMybatisClass = Class.forName(customMybatisMapperClassName);
        mybatisMappers.add(customMybatisClass);
      } catch (ClassNotFoundException e) {
        throw new IllegalArgumentException("Class " + customMybatisMapperClassName + " has not been found.", e);
      }
    }
    return mybatisMappers;
  }

  @Bean
  public ProcessEngineFactoryBean processEngine(SpringProcessEngineConfiguration configuration) {
    return super.springProcessEngineBean(configuration);
  }

  @Bean
  @ConditionalOnMissingBean
  @Override
  public RuntimeService runtimeServiceBean(ProcessEngine processEngine) {
    return super.runtimeServiceBean(processEngine);
  }

  @Bean
  @ConditionalOnMissingBean
  @Override
  public RepositoryService repositoryServiceBean(ProcessEngine processEngine) {
    return super.repositoryServiceBean(processEngine);
  }

  @Bean
  @ConditionalOnMissingBean
  @Override
  public TaskService taskServiceBean(ProcessEngine processEngine) {
    return super.taskServiceBean(processEngine);
  }

  @Bean
  @ConditionalOnMissingBean
  @Override
  public HistoryService historyServiceBean(ProcessEngine processEngine) {
    return super.historyServiceBean(processEngine);
  }

  @Bean
  @ConditionalOnMissingBean
  @Override
  public ManagementService managementServiceBeanBean(ProcessEngine processEngine) {
    return super.managementServiceBeanBean(processEngine);
  }

  @Bean
  @ConditionalOnMissingBean
  public TaskExecutor taskExecutor() {
    return new SimpleAsyncTaskExecutor();
  }

  @Bean
  @ConditionalOnMissingBean
  @Override
  public IntegrationContextManager integrationContextManagerBean(ProcessEngine processEngine) {
    return super.integrationContextManagerBean(processEngine);
  }

  @Bean
  @ConditionalOnMissingBean
  @Override
  public IntegrationContextService integrationContextServiceBean(ProcessEngine processEngine) {
    return super.integrationContextServiceBean(processEngine);
  }
}

通过代码我们基本上了解到,其为我们自动创建了 RepositoryService,ProcessEngineFactoryBean ,RuntimeService,TaskService,ManagementService等bean

我们在到其父类中看看是如何通过spring java 的方式去创建 ProcessEngineFactoryBean 的

 public ProcessEngineFactoryBean springProcessEngineBean(SpringProcessEngineConfiguration configuration) {
    ProcessEngineFactoryBean processEngineFactoryBean = new ProcessEngineFactoryBean();
    processEngineFactoryBean.setProcessEngineConfiguration(configuration);
    return processEngineFactoryBean;
  }

public class ProcessEngineFactoryBean implements FactoryBean<ProcessEngine>, DisposableBean, ApplicationContextAware {

  protected ProcessEngineConfigurationImpl processEngineConfiguration;

  protected ApplicationContext applicationContext;
  protected ProcessEngine processEngine;

  public void destroy() throws Exception {
    if (processEngine != null) {
      processEngine.close();
    }
  }

  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    this.applicationContext = applicationContext;
  }

  public ProcessEngine getObject() throws Exception {
    configureExpressionManager();
    configureExternallyManagedTransactions();

    if (processEngineConfiguration.getBeans() == null) {
      processEngineConfiguration.setBeans(new SpringBeanFactoryProxyMap(applicationContext));
    }

    this.processEngine = processEngineConfiguration.buildProcessEngine();
    return this.processEngine;
  }

  protected void configureExpressionManager() {
    if (processEngineConfiguration.getExpressionManager() == null && applicationContext != null) {
      processEngineConfiguration.setExpressionManager(new SpringExpressionManager(applicationContext, processEngineConfiguration.getBeans()));
    }
  }

  protected void configureExternallyManagedTransactions() {
    if (processEngineConfiguration instanceof SpringProcessEngineConfiguration) { // remark: any config can be injected, so we cannot have SpringConfiguration as member
      SpringProcessEngineConfiguration engineConfiguration = (SpringProcessEngineConfiguration) processEngineConfiguration;
      if (engineConfiguration.getTransactionManager() != null) {
        processEngineConfiguration.setTransactionsExternallyManaged(true);
      }
    }
  }

  public Class<ProcessEngine> getObjectType() {
    return ProcessEngine.class;
  }

  public boolean isSingleton() {
    return true;
  }

  public ProcessEngineConfigurationImpl getProcessEngineConfiguration() {
    return processEngineConfiguration;
  }

  public void setProcessEngineConfiguration(ProcessEngineConfigurationImpl processEngineConfiguration) {
    this.processEngineConfiguration = processEngineConfiguration;
  }
}


我们学习到 其实只要其继承自FactoryBean 就已经是bean的工厂了。

重点

我们参见ActivitiProperties.class, AsyncExecutorProperties.class 类中的属性在 application.properties 文件中进行配置,而且自动为我们创建了 基本的服务 如 ProcessEngine ManagementServiceTaskService 等,

### 回答1: 首先,需要在项目中引入 activiti-spring-boot-starter-basic依赖。 然后,需要创建一个配置类,在其中配置Activiti。 例如: ``` @Configuration @AutoConfigureAfter(DataSourceAutoConfiguration.class) public class ActivitiConfig { @Autowired private DataSource dataSource; @Bean public SpringProcessEngineConfiguration processEngineConfiguration() { SpringProcessEngineConfiguration configuration = new SpringProcessEngineConfiguration(); configuration.setDataSource(dataSource); configuration.setDatabaseSchemaUpdate("true"); configuration.setAsyncExecutorActivate(false); return configuration; } @Bean public ProcessEngine processEngine() { return processEngineConfiguration().buildProcessEngine(); } } ``` 这样就可以在项目中使用Activiti了。 ### 回答2: 在将Activiti 7.1.0.M6整合到Spring Boot 2.7.4中,我们需要进行一些配置。 首先,我们需要在pom.xml文件中添加ActivitiSpring Boot的依赖项。可以使用以下代码片段: ```xml <dependencies> <!-- Activiti --> <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter-basic</artifactId> <version>7.1.0.M6</version> </dependency> <!-- Spring Boot --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.7.4</version> </dependency> </dependencies> ``` 接下来,我们需要创建一个配置类,用于配置Activiti引擎和与Spring Boot的集成。可以使用以下代码片段: ```java import org.activiti.engine.ProcessEngine; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.annotation.EnableTransactionManagement; @Configuration @EnableTransactionManagement public class ActivitiConfig { @Bean public ProcessEngine processEngine() { // 根据需要进行配置,并返回Activiti引擎实例 ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration(); // 配置数据源等信息 // configuration.setDataSource(dataSource); // configuration.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE); // 其他配置... // 返回Activiti引擎实例 return configuration.buildProcessEngine(); } @Bean public SpringProcessEngineConfiguration springProcessEngineConfiguration() { // 根据需要进行配置,并返回SpringProcessEngineConfiguration实例 SpringProcessEngineConfiguration configuration = new SpringProcessEngineConfiguration(); // 其他配置... // 返回SpringProcessEngineConfiguration实例 return configuration; } @Bean public ProcessEngineFactoryBean processEngineFactoryBean() { // 使用SpringProcessEngineConfiguration创建ProcessEngineFactoryBean,并返回实例 ProcessEngineFactoryBean factoryBean = new ProcessEngineFactoryBean(); // 设置SpringProcessEngineConfiguration实例 factoryBean.setProcessEngineConfiguration(springProcessEngineConfiguration()); // 返回ProcessEngineFactoryBean实例 return factoryBean; } @Bean public PlatformTransactionManager transactionManager() { // 返回用于事务管理的PlatformTransactionManager实例 return new SpringTransactionManager(processEngine().getObject()); } } ``` 最后,我们需要在Spring Boot应用程序主类上添加`@EnableActiviti`注解,以启用Activiti引擎的自动配置。可以使用以下代码片段: ```java import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.activiti.spring.boot.SecurityAutoConfiguration; import org.activiti.spring.boot.autoconfigure.ActivitiAutoConfiguration; import org.activiti.spring.boot.autoconfigure.ResourceCachingAutoConfiguration; import org.activiti.spring.boot.autoconfigure.security.ActivitiOAuth2AutoConfiguration; @SpringBootApplication(exclude = {ActivitiAutoConfiguration.class, ActivitiOAuth2AutoConfiguration.class, SecurityAutoConfiguration.class, ResourceCachingAutoConfiguration.class}) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 这样,我们就完成了Activiti 7.1.0.M6和Spring Boot 2.7.4的整合配置。您可以根据具体需求进一步自定义配置,并使用Activiti提供的API进行业务流程的管理和执行。 ### 回答3: 要将Activiti 7.1.0.M6与Spring Boot 2.7.4集成,可以按照以下步骤进行配置: 1. 在Spring Boot项目的pom.xml文件中添加ActivitiSpring Boot的依赖: ```xml <dependency> <groupId>org.activiti</groupId> <artifactId>activiti-spring-boot-starter-basic</artifactId> <version>7.1.0.M6</version> </dependency> ``` 2. 创建一个配置类,例如ActivitiConfig,用于在Spring Boot中配置Activiti: ```java @Configuration public class ActivitiConfig { @Autowired private DataSource dataSource; @Bean public SpringProcessEngineConfiguration springProcessEngineConfiguration() { SpringProcessEngineConfiguration config = new SpringProcessEngineConfiguration(); config.setDataSource(dataSource); config.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE); return config; } @Bean public ProcessEngineFactoryBean processEngineFactoryBean() { ProcessEngineFactoryBean factoryBean = new ProcessEngineFactoryBean(); factoryBean.setProcessEngineConfiguration(springProcessEngineConfiguration()); return factoryBean; } @Bean public ProcessEngine processEngine() throws Exception { return processEngineFactoryBean().getObject(); } @Bean public RepositoryService repositoryService() throws Exception { return processEngine().getRepositoryService(); } @Bean public RuntimeService runtimeService() throws Exception { return processEngine().getRuntimeService(); } @Bean public TaskService taskService() throws Exception { return processEngine().getTaskService(); } @Bean public HistoryService historyService() throws Exception { return processEngine().getHistoryService(); } @Bean public ManagementService managementService() throws Exception { return processEngine().getManagementService(); } } ``` 在配置类中,首先注入数据源(DataSource),然后创建SpringProcessEngineConfiguration对象并将数据源设置为配置对象的一部分。然后,创建ProcessEngineFactoryBean对象,并将SpringProcessEngineConfiguration对象设置为工厂Bean的一部分。接下来,创建ProcessEngine对象以及其他Activiti服务对象,例如RepositoryService、RuntimeService、TaskService、HistoryService和ManagementService。 3. 在Spring Boot主类中添加`@Import`注解,引入配置类: ```java @SpringBootApplication @Import(ActivitiConfig.class) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 这样,当Spring Boot应用程序启动时,配置类将被加载并配置Activiti引擎。 以上就是将Activiti 7.1.0.M6与Spring Boot 2.7.4集成的配置方法。注意,在实际项目中,可能还需要根据需求进行其他配置,例如设置流程定义的存放位置、配置调度器等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值