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