Skip to content

Message Persistence

The messages received and accepted by the message acceptor are stored in a relation database. For doing so, we implemented a MyBatis mapper of the underlying entity in order to keep the dependency track as small as possible (MyBatis is a library used and supplied by Camunda Platform 7). For the persistence of the messages the library uses a database table COR_MESSAGE with the following structure:

Column Java Datatype JDBC Datatype Description
ID String VARCHAR Message id (unique)
PAYLOAD_ENCODING String VARCHAR Encoding of the payload
PAYLOAD_TYPE_NAMESPACE String VARCHAR Namespace of the payload type, for example package
PAYLOAD_TYPE_NAME String VARCHAR Simple type name of the payload type, for example class name
PAYLOAD_TYPE_REVISION String VARCHAR Revision of the payload type.
PAYLOAD ByteArray BINARY Byte array containing the encoded payload
INSERTED Instant TIMESTAMP WITH TIMEZONE Timestamp of message ingestion
TTL_DURATION String VARCHAR Time to live of the message as Duration string
EXPIRATION Instant TIMESTAMP WITH TIMEZONE Expiration of the message as timestamp
RETRIES Integer INTEGER Number of retries of message correlation
NEXT_RETRY Instant TIMESTAMP WITH TIMEZONE Timestamp of the next retry
ERROR String VARCHAR Last error stacktrace produced during correlation

Depending on your database you will need different SQL DDLs to create the underlying DB table. Here are some dialects, we already tried out:

MS SQL / Azure SQL#

We use NVARCHAR as a basic type for strings because of improved index performance for UTF-8 encoded strings.

CREATE TABLE COR_MESSAGE (
    ID                     NVARCHAR(64) UNIQUE NOT NULL,
    PAYLOAD_ENCODING       NVARCHAR(64)        NOT NULL,
    PAYLOAD_TYPE_NAMESPACE NVARCHAR(128)       NOT NULL,
    PAYLOAD_TYPE_NAME      NVARCHAR(128)       NOT NULL,
    PAYLOAD_TYPE_REVISION  NVARCHAR(64),
    PAYLOAD                BINARY(4096),
    INSERTED               DATETIME2           NOT NULL,
    TTL_DURATION           NVARCHAR(32),
    EXPIRATION             DATETIME2,
    RETRIES                INT                 NOT NULL,
    NEXT_RETRY             DATETIME2,
    ERROR                  NVARCHAR(MAX)
);

H2 / HSQL#

CREATE TABLE COR_MESSAGE (
    ID                     VARCHAR2(64) UNIQUE NOT NULL,
    PAYLOAD_ENCODING       VARCHAR2(64)        NOT NULL,
    PAYLOAD_TYPE_NAMESPACE VARCHAR2(128)       NOT NULL,
    PAYLOAD_TYPE_NAME      VARCHAR2(128)       NOT NULL,
    PAYLOAD_TYPE_REVISION  VARCHAR2(64),
    PAYLOAD                BINARY(4096),
    INSERTED               TIMESTAMP           NOT NULL,
    TTL_DURATION           VARCHAR2(32),
    EXPIRATION             TIMESTAMP,
    RETRIES                INTEGER             NOT NULL,
    NEXT_RETRY             TIMESTAMP,
    ERROR                  CLOB(10000)
);

Last update: November 10, 2023