springboot2.0 + activiti6.0 uuid生成策略

£可爱£侵袭症+ 提交于 2020-10-12 15:20:31

pringboot2.0 + activiti6.0 uuid生成策略

Activiti 主键id生成逻辑

Activiti里负责生成主键的类是IdGenerator,在初始化的时候,在ProcessEngineConfigurationImpl类里会判断该值是否为空,为空,则生成默认的DbIdGenerator,不为空就用已设置的。另外还会将该主键生成器赋值给DbSqlSessionFactory。

在实际生成主键的过程中,生成历史流程实例时会使用ProcessEngineConfigurationImpl里的IdGenerator进行生成。而生成流程ID,任务ID的那部分调用的是DbSqlSessionFactory里的IdGenerator进行生成。

Activiti 主键id生成方案

  1. 重写IdGenerator的getNextId()方法。
  2. 给ProcessEngineConfigurationImpl赋值。

网上的大部分的解决方案是继承AbstractProcessEngineConfigurator方法,然后重写beforeInit()方法,但是我在实际应用中,启动时,ProcessEngineConfigurationImpl都已经初始化完成了,还没有进入到该方法中,并没有达到实际的效果。尝试多种方法依然无效后,于是换了另外一种方式,采用配置类的方式。代码如下:

@Configuration
public class MyProcessEngineConfigurator {

   @Autowired
   private UUIDGenerator uuidGenerator;

   @Bean
   public ProcessEngineConfigurationImpl processEngineConfigurationImpl(ProcessEngineConfigurationImpl processEngineConfigurationImpl){
       //设置ProcessEngineConfigurationImpl里的uuidGenerator
       processEngineConfigurationImpl.setIdGenerator(uuidGenerator);
       //设置DbSqlSessionFactory的uuidGenerator,否则流程id,任务id,实例id依然是用DbIdGenerator生成
       processEngineConfigurationImpl.getDbSqlSessionFactory().setIdGenerator(uuidGenerator);
       return processEngineConfigurationImpl;
   }
}

因为该类在ProcessEngineConfigurationImpl实例化完成之后加载的,所以还需要对DbSqlSessionFactory里的idGenerator再赋一次值。

另外UUIDGenerator代码如下:

@Component
public class UUIDGenerator implements IdGenerator{
    @Override
    public String getNextId() {
        return UUID.randomUUID().toString().replaceAll("-", "");
    }
}

 

如果是springboot集成activity,activity支持ProcessEngineConfigurationConfigurer,那么可以这么做:

@Configuration
public class ActivitiConfig implements ProcessEngineConfigurationConfigurer {
 
    @Override
    public void configure(SpringProcessEngineConfiguration springProcessEngineConfiguration) {
        springProcessEngineConfiguration.setIdGenerator(new MyUUIDgenerator());
    }
}
public class MyUUIDgenerator  implements IdGenerator {
    @Override
    public String getNextId() {
        String uuid = UUID.randomUUID().toString().replaceAll("-", "");
        return uuid;
    }
}

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!