Activiti 6自动部署后不生成数据库act_hi_*的解决方法


本文将从多个方面详细阐述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来解决这个问题。

评论关闭