Skip to main content

Sequence declaration reference

Sequencing is declared in a YAML descriptor, by default loaded from classpath:/messaging/jeap-sequential-inbox.yml (override with jeap.messaging.sequential-inbox.config-location). The file has two top-level keys: an optional subTypeResolvers map and a list of sequences.

Sequence

AttributeCardinalityDescriptionExample
nameRequiredName of the sequence (used in logs, the REST API and the sequence instance rows)OrderSequence
retentionPeriodRequiredHow long a sequence instance is retained, as a Duration; drives expiry and housekeeping24h
messagesRequiredThe list of SequencedMessageType entries that belong to the sequence

SequencedMessageType

AttributeCardinalityDescriptionExample
typeRequiredThe jEAP message type name (the Avro message simple class name)JmeOrderCreatedEvent
subTypeOptionalSubtype for fine-grained sequencing of a generic message type. Resolved by a SubTypeResolver; must be a value of the resolver's Java EnumSTOCK_AVAILABLE
topicOptionalTopic to consume the message from, if different from the defaultmy-topic
clusterNameOptionalKafka cluster of the topic, if different from the default clusteraws
contextIdExtractorRequiredFully-qualified class name implementing ContextIdExtractor; returns the contextId grouping messages into one instance (null = not sequenceable)ch.admin.bit.example.OrderIdExtractor
messageFilterOptionalFully-qualified class name implementing MessageFilter; shouldSequence returning false means the message bypasses the inbox and is handled immediatelych.admin.bit.example.OrderCreatedEventFilter
releaseConditionOptionalThe predecessor(s) that must be processed before this message is released. No condition means the message can be released as soon as it arrives

Release conditions

A release condition references predecessors by their qualified name (type, or type.subType when a subtype is used). Conditions can be nested with and and or.

# single predecessor
releaseCondition:
predecessor: JmeOrderCreatedEvent

# all of several predecessors
releaseCondition:
and:
- predecessor: JmeOrderValidatedEvent.STOCK_AVAILABLE
- predecessor: JmeOrderValidatedEvent.CUSTOMER_CREDIT_CHECKED
- predecessor: JmeOrderPreparedEvent

# any one of several predecessors
releaseCondition:
or:
- predecessor: JmeOrderShippedEvent
- predecessor: JmeOrderOtherEvent

subTypeResolvers

When one Avro message type represents several business events, map it to a SubTypeResolver so the inbox can distinguish the subtypes. The resolver returns an Enum; every enum value must be declared as a subType in the sequence, and every subType must be a valid enum value.

subTypeResolvers:
JmeOrderValidatedEvent: ch.admin.bit.example.OrderValidatedEventSubTypeResolver

Full example

subTypeResolvers:
JmeOrderValidatedEvent: ch.admin.bit.example.OrderValidatedEventSubTypeResolver

sequences:
- name: OrderSequence
retentionPeriod: 24h
messages:
- type: JmeOrderCreatedEvent
contextIdExtractor: ch.admin.bit.example.OrderIdExtractor
messageFilter: ch.admin.bit.example.OrderCreatedEventFilter

- type: JmeOrderValidatedEvent
subType: STOCK_AVAILABLE
contextIdExtractor: ch.admin.bit.example.OrderIdExtractor
releaseCondition:
predecessor: JmeOrderCreatedEvent

- type: JmeOrderValidatedEvent
subType: CUSTOMER_CREDIT_CHECKED
contextIdExtractor: ch.admin.bit.example.OrderIdExtractor
releaseCondition:
predecessor: JmeOrderCreatedEvent

- type: JmeOrderShippedEvent
contextIdExtractor: ch.admin.bit.example.OrderIdExtractor
releaseCondition:
and:
- predecessor: JmeOrderValidatedEvent.STOCK_AVAILABLE
- predecessor: JmeOrderValidatedEvent.CUSTOMER_CREDIT_CHECKED