原文地址:https://blog.csdn.net/jiaoshaoping/article/details/80930379
Activiti 主鍵id生成邏輯
Activiti里負(fù)責(zé)生成主鍵的類是IdGenerator饭庞,在初始化的時候扛门,在ProcessEngineConfigurationImpl類里會判斷該值是否為空脚仔,為空,則生成默認(rèn)的DbIdGenerator掩浙,不為空就用已設(shè)置的琉挖。另外還會將該主鍵生成器賦值給DbSqlSessionFactory。
在實(shí)際生成主鍵的過程中涣脚,生成歷史流程實(shí)例時會使用ProcessEngineConfigurationImpl里的IdGenerator進(jìn)行生成。而生成流程ID寥茫,任務(wù)ID的那部分調(diào)用的是DbSqlSessionFactory里的IdGenerator進(jìn)行生成遣蚀。
Activiti 主鍵id生成方案
1.重寫IdGenerator的getNextId()方法。
2.給ProcessEngineConfigurationImpl賦值。
網(wǎng)上的大部分的解決方案是繼承AbstractProcessEngineConfigurator方法芭梯,然后重寫beforeInit()方法险耀,但是我在實(shí)際應(yīng)用中,啟動時玖喘,ProcessEngineConfigurationImpl都已經(jīng)初始化完成了甩牺,還沒有進(jìn)入到該方法中,并沒有達(dá)到實(shí)際的效果累奈。嘗試多種方法依然無效后贬派,于是換了另外一種方式,采用配置類的方式澎媒。代碼如下:
@Configuration
public class MyProcessEngineConfigurator {
@Autowired
private UUIDGenerator uuidGenerator;
@Bean
public ProcessEngineConfigurationImpl processEngineConfigurationImpl(ProcessEngineConfigurationImpl processEngineConfigurationImpl){
//設(shè)置ProcessEngineConfigurationImpl里的uuidGenerator
processEngineConfigurationImpl.setIdGenerator(uuidGenerator);
//設(shè)置DbSqlSessionFactory的uuidGenerator搞乏,否則流程id,任務(wù)id戒努,實(shí)例id依然是用DbIdGenerator生成
processEngineConfigurationImpl.getDbSqlSessionFactory().setIdGenerator(uuidGenerator);
return processEngineConfigurationImpl;
}
}
因?yàn)樵擃愒赑rocessEngineConfigurationImpl實(shí)例化完成之后加載的请敦,所以還需要對DbSqlSessionFactory里的idGenerator再賦一次值。
另外UUIDGenerator代碼如下:
@Component
public class UUIDGenerator implements IdGenerator{
@Override
public String getNextId() {
return UUID.randomUUID().toString().replaceAll("-", "");
}
}