UTL-X transforms data. But in a real integration landscape, transformation is one step in a larger flow: receive a message, route it to the right transformation, validate the output, deliver it to the target, handle errors, retry on failure, log for compliance. That orchestration layer is what Open-M provides.
Open-M is in active development. This chapter previews the architecture and concepts. UTL-X is fully functional without Open-M — you can use it standalone with Docker, Dapr, or any orchestration tool. Open-M is an optional layer on top.
Open-M is an open-source integration controller written in Go. It manages the lifecycle of messages as they flow between systems — receiving, transforming, validating, routing, and delivering.
Think of it as:
Open-M = the orchestra conductor (decides what happens, when, and where)
UTL-X = the musicians (perform the transformation work)
Each does one thing well. UTL-X can be used WITHOUT Open-M (standalone CLI, engine, Docker). Open-M can use other transformation engines — but UTL-X is the default.
MPPM (Message Processing Pipeline Model) is Open-M's core concept: every integration is a message pipeline — an ordered sequence of processing stages that a message flows through.
Like BPMN standardizes business processes, MPPM standardizes message flows. It defines:
How messages flow through processing stages
What happens at each stage (transform, validate, route, enrich)
How errors are handled (retry, dead-letter, compensate)
Each stage is a plugin — swap implementations without changing the pipeline definition. UTL-X is the default Transform stage plugin. The Validate stage uses UTLXe's schema validators. The Receive and Deliver stages connect to message brokers, APIs, file systems, or databases.
The envelope carries metadata about the message — ID, correlation, source, content type, processing headers. The payload carries the actual data. UTL-X transforms the payload. Open-M manages the envelope.
This separation means UTL-X never needs to know about routing, retries, or correlation — it receives a payload, transforms it, returns the result. Open-M handles everything else.
A single UTL-X transformation IS an MPPM Transform stage. An UTLXe pipeline IS an MPPM pipeline restricted to transformation. Open-M adds routing, error handling, monitoring, and non-transformation stages around it.
Open-M is written in Go — lightweight, fast startup, single binary, native Kubernetes integration. It communicates with UTLXe via the Go wrapper (Chapter 34) using protobuf over stdio.
Why Go for the controller and Kotlin/JVM for the engine?
Controller (Go): needs fast startup, low memory, native Kubernetes client, lightweight HTTP server. Go excels here.
This YAML defines a complete integration flow: receive from Service Bus, transform with UTL-X, validate against UBL XSD, deliver to Peppol Access Point, dead-letter on failure with 3 retries. The .utlx file is referenced by name — change the transformation without touching the flow definition.
When you outgrow "just transformation" and need routing, retry logic, dead-letter handling, flow monitoring, and audit trails — Open-M provides it. Your .utlx files work unchanged in Open-M. Your UTLXe deployment works unchanged. You don't rewrite anything — you wrap your transformations in MPPM flow definitions.