[error] org.h2.jdbc.JdbcSQLException: Value too long for column "TEXT_ VARCHAR(4000)":
需要通过一些ALTER TABLE语句配置Camunda,以允许在数据库中使用String类型的非常长的过程变量。
如何为内存单元测试数据库执行此操作(由于数据库是暂时的,没有管理工具来修改模式)?
或者是否可以选择将字符串存储为二进制序列化,就像Java对象(显然可以更长)而不是文本列一样?
答案 0 :(得分:4)
我找到了一个thread about the subject,并将那里提出的内容扩展为“hacky workaround”,我可以通过将此代码置于设置阶段来使我的测试用例通过:
// allow longer texts:
// https://forums.activiti.org/content/increase-lenght-string-process-variables
val processEngineConfiguration = engine.getProcessEngineConfiguration()
val session = processEngineConfiguration
.asInstanceOf[ProcessEngineConfigurationImpl]
.getDbSqlSessionFactory().getSqlSessionFactory().openSession();
val connection = session.getConnection()
val jdbcStatement = connection.createStatement()
jdbcStatement.execute("ALTER TABLE ACT_RU_VARIABLE ALTER TEXT_ CLOB");
jdbcStatement.execute("ALTER TABLE ACT_HI_VARINST ALTER TEXT_ CLOB");
jdbcStatement.execute("ALTER TABLE ACT_HI_DETAIL ALTER TEXT_ CLOB");
jdbcStatement.close();
答案 1 :(得分:3)
要回答您的上一个问题,请尝试以下方法:
RuntimeService runtimeService = processEngine.getRuntimeService();
VariableMap variables = Variables.createVariables();
variables.putValueTyped("var", Variables
.objectValue(aLongStringValue)
// tells the engine to use java serialization for persisting the value
.serializationDataFormat(SerializationDataFormats.JAVA)
.create());
// Start a process instance
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("testProcess", variables);
这种方法的局限性是:
runtimeService.createVariableInstanceQuery().variableValueEquals("var", aLongStringValue).list()
找不到变量RuntimeService.getVariable("name") or RuntimeService.getVariableTyped("name", true)
)来获取实际值。如果您依赖引擎可以以序列化格式提供变量的功能(对于常规String
变量只是普通String
值,则可能会出现问题;对于Java序列化的{{ 1}} value,它是字节表示的base64编码的字符串。)。