Как настроить базу данных Camunda в памяти для приема более длинных строковых переменных процесса?
[error] org.h2.jdbc.JdbcSQLException: Value too long for column "TEXT_ VARCHAR(4000)":
Камунду необходимо настроить с помощью некоторых операторов ALTER TABLE, чтобы в базе данных можно было хранить очень длинные переменные процесса типа String.
Как это сделать для базы данных модульных тестов в памяти (где нет инструмента администратора для изменения схемы, поскольку база данных является временной)?
Или есть возможность хранить строки как двоичные сериализации, как объекты Java (которые, очевидно, могут быть длиннее) вместо текстового столбца?
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-сериализацииObject
значение, это Base64-закодированная строка байтового представления).
Я нашел тему о предмете и, расширив то, что было предложено здесь как "хакерский обходной путь", я мог бы пройти тесты, поместив этот код на этапе установки:
// 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();
Если вы используете Camunda в банке Spring Boot, вы можете добавить data.sql в /src/main/resources с операторами обновления.
ALTER TABLE ACT_RU_VARIABLE ALTER TEXT_ CLOB;
ALTER TABLE ACT_HI_VARINST ALTER TEXT_ CLOB;
ALTER TABLE ACT_HI_DETAIL ALTER TEXT_ CLOB;