本文将从多个方面详细阐述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/n/374150.html