Define multi-step workflows with annotations and run them over Kafka or RabbitMQ — with at-least-once delivery, retries, DLQ, signed security context and idempotency built in.
Each capability is opt-in where it matters and safe by default where it counts.
Declare a workflow and its steps with @Topic and @Step. The engine routes each step to the next over your broker.
First-class Apache Kafka and RabbitMQ adapters behind one MessageBroker SPI. Swap brokers without touching workflow code.
Automatic retries with exponential backoff; terminal failures are routed to a dead-letter queue instead of being lost or looping forever.
The caller's identity flows across steps and is HMAC-signed and verified in transit — a forged or replayed context is rejected, never restored.
Enforce a per-step deadline with @Timeout: a step past its budget is aborted on a bounded worker pool and retried.
Opt-in de-duplication behind a pluggable store — bounded in-memory by default, or distributed via Redis for cross-instance safety.
Resilience4j circuit breaker guards broker calls, shedding load and recovering automatically when the broker misbehaves.
Micrometer tracing and workflow meters out of the box, with a Prometheus endpoint on the monitor for scraping.
A monitoring module with MongoDB persistence, a REST API and a dashboard — with dual-mode (Basic or OIDC) authentication.
Published on Maven Central under io.github.stepprflow. The monitor ships as a container image.
<!-- set once; see the latest on Maven Central -->
<properties>
<stepprflow.version>1.1.1</stepprflow.version>
</properties>
<!-- workflow engine -->
<dependency>
<groupId>io.github.stepprflow</groupId>
<artifactId>stepprflow-core</artifactId>
<version>${stepprflow.version}</version>
</dependency>
<!-- Kafka adapter (or -spring-rabbitmq) -->
<dependency>
<groupId>io.github.stepprflow</groupId>
<artifactId>stepprflow-spring-kafka</artifactId>
<version>${stepprflow.version}</version>
</dependency>
# pull the monitoring dashboard + API
docker pull alimhin/stepprflow-monitor:latest
# or from GitHub Container Registry
docker pull ghcr.io/stepprflow/stepprflow-monitor:latest
# then define a workflow:
@Topic("order-workflow")
class OrderWorkflow implements StepprFlow {
@Step(id = 1) void reserve(Order o) { ... }
@Step(id = 2) void charge(Order o) { ... }
}
New to it? Read the getting-started guide and the architecture decision records.
Steppr Flow commits to at-least-once delivery: a step may run again on redelivery, so the framework gives you the tools to stay correct — and documents exactly where the edges are, in its ADRs.
Confirmed sends. A consumed message is acknowledged only after the next step is durably produced — a broker hiccup redelivers, it never silently drops.
Context is cleared. The security context is restored, used and cleared per step on pooled threads — it never leaks to the next execution.
Signed in transit. The propagated context is HMAC-bound to its execution and verified before use; tampered or replayed contexts go straight to the DLQ.
Opt-in idempotency. A processed step is recorded after success; a redelivery is skipped — best-effort, with the residual windows spelled out.
The core engine is broker-agnostic and has no persistence dependency. Everything else is an adapter or an add-on.
stepprflow-coreAnnotations, models, SPIs and the workflow engine — the only required module.stepprflow-spring-kafkaApache Kafka broker implementation (the default adapter).stepprflow-spring-rabbitmqRabbitMQ broker implementation.stepprflow-idempotency-redisDistributed, Redis-backed idempotency store for cross-instance de-duplication.stepprflow-monitoringMongoDB persistence, REST API and dashboard with dual-mode auth (opt-in).Open source under Apache 2.0. Built for Spring Boot teams who need async workflows that survive broker failures, restarts and redeliveries.