本文將從多個方面詳細闡述Activiti 6自動部署後不生成數據庫act_hi_*的問題,並提供對應的代碼示例。
一、問題分析
在使用Activiti 6部署流程後,我們發現act_hi_*相關的表並沒有生成,這樣就導致了歷史數據無法記錄,給後續的跟進和分析帶來了麻煩。
我們來分析一下這個問題。在Activiti 5中,歷史數據是通過定時器將當前運行的流程實例信息插入到歷史表中的,而在Activiti 6中,採用了stream的方式將信息插入到歷史表中,這樣就不需要定時器了,因此在Activiti 6中不會再生成與定時器相關的act_hi_*表。
因此,部署流程時不生成數據庫act_hi_*的問題,是Activiti 6採用stream方式處理歷史數據的特性導致的。
二、解決方法
針對這個問題,我們有以下幾種解決方法:
1、使用HistoricDataAutoConfiguration
Activiti 6提供了HistoricDataAutoConfiguration類,可以用來配置歷史數據表的相關信息,從而自動生成act_hi_*表:
@Configuration
public class HistoricDataAutoConfiguration {
@Bean(name = "dbSchemaHistoryInitializer")
@ConditionalOnProperty(prefix = "spring.activiti", name = {"database-schema-update"}, havingValue = "true")
public SchemaHistoryInitializer activitiSchemaHistoryInitializer(DataSource dataSource, ProcessEngineConfiguration processEngineConfiguration) {
SchemaHistoryInitializer schemaHistoryInitializer = new SchemaHistoryInitializer();
schemaHistoryInitializer.setDataSource(dataSource);
schemaHistoryInitializer.setProcessEngineConfiguration(processEngineConfiguration);
return schemaHistoryInitializer;
}
}
2、手動創建act_hi_*表
在Activiti 6中,雖然沒有自動生成act_hi_*表的機制了,但是我們仍然可以手動創建這些表。使用JDBC或者其他工具,手動創建這些歷史表即可:
create table ACT_HI_ACTINST (
ID_ VARCHAR2(64),
PROC_DEF_ID_ VARCHAR2(64),
PROC_INST_ID_ VARCHAR2(64),
EXECUTION_ID_ VARCHAR2(64),
ACT_ID_ VARCHAR2(255),
TASK_ID_ VARCHAR2(64),
CALL_PROC_INST_ID_ VARCHAR2(64),
ACT_NAME_ VARCHAR2(255),
ACT_TYPE_ VARCHAR2(255),
ASSIGNEE_ VARCHAR2(255),
START_TIME_ TIMESTAMP(6),
END_TIME_ TIMESTAMP(6),
DURATION_ NUMBER(19,0),
DELETE_REASON_ VARCHAR2(4000),
TENANT_ID_ VARCHAR2(255),
REMARK_ VARCHAR2(255)
);
create table ACT_HI_ATTACHMENT (
ID_ VARCHAR2(64),
PROC_INST_ID_ VARCHAR2(64),
TASK_ID_ VARCHAR2(64),
NAME_ VARCHAR2(255),
DESCRIPTION_ VARCHAR2(4000),
TYPE_ VARCHAR2(255),
CONTENT_ID_ VARCHAR2(64),
TIME_ TIMESTAMP(6),
USER_ID_ VARCHAR2(255),
TENANT_ID_ VARCHAR2(255),
REMARK_ VARCHAR2(255)
);
-- other act_hi_* tables
3、使用自行開發的HistoricDataStreamingAdapter
如果以上兩種方法都無法解決問題,我們可以自行開發關於HistoricDataStreamingAdapter的適配器,自行處理歷史數據的表:
@Component
public class HistoricDataStreamingAdapter extends AbstractMapBasedDataSerializableFactories {
@Override
public List getStreamFactories() {
List factories = super.getStreamFactories();
if (factories == null) {
factories = new ArrayList<>();
}
factories.add(HistoricActivityInstanceEventRecord.class);
factories.add(HistoricIdentityLinkEventRecord.class);
factories.add(HistoricProcessInstanceEventRecord.class);
factories.add(HistoricTaskInstanceEventRecord.class);
factories.add(HistoricVariableInstanceEventRecord.class);
factories.add(IdentityLinkEventRecord.class);
factories.add(JobEntityEventRecord.class);
factories.add(ModelEntityEventRecord.class);
factories.add(ProcessDefinitionEntityEventRecord.class);
factories.add(ProcessDefinitionInfoEntityEventRecord.class);
factories.add(ProcessDefinitionInfoEntityEventRecord.ProcessDefinitionInfoEntityEventRecordChild.class);
factories.add(TaskEntityEventRecord.class);
factories.add(VariableInstanceEntityEventRecord.class);
factories.add(BatchEventRecord.class);
return factories;
}
}
三、總結
本文從問題分析和解決方法兩方面對Activiti 6自動部署後不生成數據庫act_hi_*的問題進行了詳細的闡述。我們可以使用HistoricDataAutoConfiguration類來自動生成act_hi_*表,也可以手動創建這些表,還可以開發自己的HistoricDataStreamingAdapter來解決這個問題。
原創文章,作者:XKIAX,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/374150.html