因为业务需要,我这里可能需要非常多的人进行会签任务操作
大约是几百人
然后Activiti在存流程变量的时候,系统报错如下图所示
看来Oracle不支持,1000列以上的sql。应该可以通过数据库的设置,来进行修改。
有一个数据库,执行同样的业务,并不会报错,估计是数据库可以设置,但是没调好。。。。
只能研究了一下,去修改下源码吧
总结了之后,需要修改的地方多,但是不难,很简单,因为Activiti需要操作很多张表,都是相同的问题。总结如下
1.HistoricVariableInstance
源码包里找到这个映射文件 HistoricVariableInstance.xml
<insert id="bulkInsertHistoricVariableInstance_oracle" parameterType="java.util.List"> BEGIN <foreach collection="list" item="historicVariable" index="index" separator=";" > INSERT INTO ${prefix}ACT_HI_VARINST (ID_,PROC_INST_ID_,EXECUTION_ID_,TASK_ID_,NAME_,REV_,VAR_TYPE_,BYTEARRAY_ID_,DOUBLE_,LONG_,TEXT_,TEXT2_,CREATE_TIME_,LAST_UPDATED_TIME_) VALUES (#{historicVariable.id,jdbcType=VARCHAR},#{historicVariable.processInstanceId,#{historicVariable.executionId,#{historicVariable.taskId,#{historicVariable.variableName,#{historicVariable.revision,#{historicVariable.variableType,#{historicVariable.byteArrayRef,typeHandler=ByteArrayRefTypeHandler},#{historicVariable.doubleValue,jdbcType=DOUBLE},#{historicVariable.longValue,jdbcType=BIGINT},#{historicVariable.textValue,#{historicVariable.textValue2,#{historicVariable.createTime,jdbcType=TIMESTAMP},#{historicVariable.lastUpdatedTime,jdbcType=TIMESTAMP}) </foreach> ;END ; </insert>
2.HistoricTaskInstanceEntity
发现是HistoricTaskInstanceEntity这个对象的这个方法bulkInsertHistoricTaskInstance_oracle
<insert id="bulkInsertHistoricTaskInstance_oracle" parameterType="java.util.List"> BEGIN <foreach collection="list" item="historicTask" index="index" separator=";"> INSERT INTO ${prefix}ACT_HI_TASKINST ( ID_,PROC_DEF_ID_,PARENT_TASK_ID_,DESCRIPTION_,OWNER_,ASSIGNEE_,START_TIME_,CLAIM_TIME_,END_TIME_,DURATION_,DELETE_REASON_,TASK_DEF_KEY_,FORM_KEY_,PRIORITY_,DUE_DATE_,CATEGORY_,TENANT_ID_ ) VALUES (#{historicTask.id,#{historicTask.processDefinitionId,#{historicTask.processInstanceId,#{historicTask.executionId,#{historicTask.name,#{historicTask.parentTaskId,#{historicTask.description,#{historicTask.owner,#{historicTask.assignee,#{historicTask.startTime,#{historicTask.claimTime,#{historicTask.endTime,#{historicTask.durationInMillis,#{historicTask.deleteReason,#{historicTask.taskDefinitionKey,#{historicTask.formKey,#{historicTask.priority,jdbcType=INTEGER},#{historicTask.dueDate,#{historicTask.category,#{historicTask.tenantId,jdbcType=VARCHAR}) </foreach> ;END ; </insert>
3.HistoricActivityInstanceEntity
执行后报错如下
发现是
org.activiti.engine.impl.persistence.entity.HistoricActivityInstanceEntity.bulkInsertHistoricActivityInstance_oracle-Inline
HistoricActivityInstanceEntity这个对象,bulkInsertHistoricActivityInstance_oracle这个方法
修改HistoricActivityInstance.xml文件中的bulkInsertHistoricActivityInstance_oracle这个方法,修改代码如下
<insert id="bulkInsertHistoricActivityInstance_oracle" parameterType="java.util.List"> BEGIN <foreach collection="list" item="historicActivityInstance" index="index" separator=";"> INSERT INTO ${prefix}ACT_HI_ACTINST ( ID_,ACT_ID_,CALL_PROC_INST_ID_,ACT_NAME_,ACT_TYPE_,TENANT_ID_ ) VALUES (#{historicActivityInstance.id,#{historicActivityInstance.processDefinitionId,#{historicActivityInstance.processInstanceId,#{historicActivityInstance.executionId,#{historicActivityInstance.activityId,#{historicActivityInstance.taskId,#{historicActivityInstance.calledProcessInstanceId,#{historicActivityInstance.activityName,#{historicActivityInstance.activityType,#{historicActivityInstance.assignee,#{historicActivityInstance.startTime,#{historicActivityInstance.endTime,#{historicActivityInstance.durationInMillis,#{historicActivityInstance.tenantId,jdbcType=VARCHAR}) </foreach> ;END ; </insert>
4.ExecutionEntity
不出意外,又报错了,这次是这个
org.activiti.engine.impl.persistence.entity.ExecutionEntity.bulkInsertExecution_oracle
修改Execution.xml这个文件中的bulkInsertExecution_oracle这个方法
代码如下
<insert id="bulkInsertExecution_oracle" parameterType="java.util.List"> BEGIN <foreach collection="list" item="execution" index="index" separator=";"> INSERT INTO ${prefix}ACT_RU_EXECUTION (ID_,BUSINESS_KEY_,IS_ACTIVE_,IS_CONCURRENT_,IS_SCOPE_,IS_EVENT_SCOPE_,PARENT_ID_,SUPER_EXEC_,SUSPENSION_STATE_,CACHED_ENT_STATE_,TENANT_ID_,NAME_) VALUES (#{execution.id,1,#{execution.processInstanceId,#{execution.businessKey,#{execution.processDefinitionId,#{execution.activityId,#{execution.isActive,jdbcType=BOOLEAN},#{execution.isConcurrent,#{execution.isScope,#{execution.isEventScope,#{execution.parentId,#{execution.superExecutionId,#{execution.suspensionState,#{execution.cachedEntityState,#{execution.tenantId,#{execution.name,jdbcType=VARCHAR}) </foreach> ;END ; </insert>
5.TaskEntity
org.activiti.engine.impl.persistence.entity.TaskEntity.bulkInsertTask_oracle
修改Task.xml中bulkInsertTask_oracle这个方法
代码如下
<insert id="bulkInsertTask_oracle" parameterType="java.util.List"> BEGIN <foreach collection="list" item="task" index="index" separator=";"> INSERT INTO ${prefix}ACT_RU_TASK (ID_,DELEGATION_,FORM_KEY_) VALUES (#{task.id,#{task.name,#{task.parentTaskId,#{task.description,#{task.priority,#{task.createTime,#{task.owner,#{task.assignee,#{task.delegationStateString,#{task.executionId,#{task.processInstanceId,#{task.processDefinitionId,#{task.taskDefinitionKey,#{task.dueDate,#{task.category,#{task.suspensionState,#{task.tenantId,#{task.formKey,jdbcType=VARCHAR}) </foreach> ;END ; </insert>
6.VariableInstanceEntity
org.activiti.engine.impl.persistence.entity.VariableInstanceEntity.bulkInsertVariableInstance_oracle
修改VariableInstance.xml中的bulkInsertVariableInstance_oracle方法
代码如下
<insert id="bulkInsertVariableInstance_oracle" parameterType="java.util.List"> BEGIN <foreach collection="list" item="variable" index="index" separator=";"> INSERT INTO ${prefix}ACT_RU_VARIABLE (ID_,TYPE_,TEXT2_) VALUES (#{variable.id,#{variable.typeName,jdbcType=VARCHAR },#{variable.name,#{variable.processInstanceId,#{variable.executionId,#{variable.taskId,#{variable.byteArrayRef,#{variable.doubleValue,#{variable.longValue,#{variable.textValue,#{variable.textValue2,jdbcType=VARCHAR}) </foreach> ;END ; </insert>
执行成功,以上六个对象,对应六张表,也可以看出Activiti启动的时候,会操作这六张表