返回

引擎插件:解决 Camunda Comment FullMessages 乱码与 Messages 长度限制问题

后端

前言

在 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 字段长度限制问题。这些插件扩展了引擎的功能,提供了对数据存储和处理行为的更多控制,从而增强了应用程序的可靠性和灵活性。