如何配置内存中的Camunda数据库以接受更长的字符串流程变量?

时间:2015-10-27 11:41:35

标签: h2 camunda

[error]  org.h2.jdbc.JdbcSQLException: Value too long for column "TEXT_ VARCHAR(4000)":

需要通过一些ALTER TABLE语句配置C​​amunda,以允许在数据库中使用String类型的非常长的过程变量。

如何为内存单元测试数据库执行此操作(由于数据库是暂时的,没有管理工具来修改模式)?

或者是否可以选择将字符串存储为二进制序列化,就像Java对象(显然可以更长)而不是文本列一样?

2 个答案:

答案 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()找不到变量
  • 每当您获取变量时,您都必须使用返回反序列化值的API(例如RuntimeService.getVariable("name") or RuntimeService.getVariableTyped("name", true))来获取实际值。如果您依赖引擎可以以序列化格式提供变量的功能(对于常规String变量只是普通String值,则可能会出现问题;对于Java序列化的{{ 1}} value,它是字节表示的base64编码的字符串。)。