引擎插件:解决 Camunda Comment FullMessages 乱码与 Messages 长度限制问题
2023-10-02 14:27:55
前言
在 Camunda 7.16.0 及更高版本中,使用嵌入式 Spring Boot 应用程序时,对于在历史表 act_hi_comment
中存储的 FULL_MSG_
字段可能会出现乱码问题。此外,Messages
字段长度有限制,可能导致消息内容丢失。本文将介绍如何使用引擎插件解决这些问题。
问题分析
乱码问题:
FULL_MSG_
字段使用 longBlob
类型存储,在某些情况下,数据库可能会错误地将数据解释为文本,从而导致乱码。
消息长度限制:
Messages
字段的长度限制为 255 个字符。对于超过此限制的消息,多余的内容将被截断。
解决方法
解决这些问题的关键是使用 Camunda 引擎插件。插件是一种 Java 类,可以扩展 Camunda 引擎的功能,而无需修改 Camunda 内核代码。
插件开发
为了解决乱码问题,我们需要创建一个插件来覆盖引擎中处理 FULL_MSG_
字段的逻辑。同样,为了解决消息长度限制,我们需要创建一个插件来扩展 Messages
字段的长度。
覆盖 FullMessages 逻辑
@Plugin(id = "full-messages-plugin")
public class FullMessagesPlugin implements ProcessEnginePlugin {
@Override
public void postInit(ProcessEngineConfiguration processEngineConfiguration) {
processEngineConfiguration.getCustomPostPersistenceModifications().add(new FullMessagesModification());
}
private static class FullMessagesModification implements PostPersistenceModification {
@Override
public void execute(HistoricProcessInstanceEntity historicProcessInstanceEntity, ProcessEngineConfiguration processEngineConfiguration) {
for (HistoricCommentEntity comment : historicProcessInstanceEntity.getHistoricComments()) {
String fullMessage = comment.getFullMessage();
if (fullMessage != null && fullMessage.length() > 0) {
comment.setFullMessage(new String(fullMessage.getBytes(), StandardCharsets.UTF_8));
}
}
}
}
}
扩展 Messages 长度
@Plugin(id = "messages-extension-plugin")
public class MessagesExtensionPlugin implements ProcessEnginePlugin {
@Override
public void postInit(ProcessEngineConfiguration processEngineConfiguration) {
processEngineConfiguration.setCustomSqlStatementMappings(new MessagesExtensionMappings());
}
private static class MessagesExtensionMappings implements CustomSqlStatementMappings {
@Override
public String map(String sqlStatement) {
if (sqlStatement.contains("ACT_HI_PROCINST") && sqlStatement.contains("FULL_MSG_")) {
return sqlStatement.replaceAll("varchar(255)", "text");
}
return sqlStatement;
}
}
}
部署插件
将插件类文件打包成 JAR 文件并将其添加到 Camunda 引擎的 lib
目录中。重新启动引擎,插件将自动生效。
验证
乱码验证
在解决乱码问题后,重新运行流程并检查 act_hi_comment
表中的 FULL_MSG_
字段。乱码应已消失,消息内容应正确显示。
消息长度验证
发送一条超过 255 个字符的消息,并检查 act_hi_procinst
表中的 Messages
字段。多余的内容应不再被截断。
结论
通过使用引擎插件,我们解决了 Camunda Comment FULL_MSG_
字段乱码问题和 Messages
字段长度限制问题。这些插件扩展了引擎的功能,提供了对数据存储和处理行为的更多控制,从而增强了应用程序的可靠性和灵活性。