All notable changes to com.babelqueue:babelqueue-redis are documented here.
The format is based on Keep a Changelog, and
this project adheres to Semantic Versioning.
The envelope wire format is versioned separately by meta.schema_version
(currently 1) — see the contract at babelqueue.com.
- OpenTelemetry
traceparenttransport wiring (ADR-0028, v0.2). Redis lists have no native per-message metadata channel and the reliable-queue stores the bare body (theLREMack handle is the stored value), so to carry an out-of-band header (e.g. a W3Ctraceparent) beside the frozen envelope the transport now uses a self-contained, transport-owned JSON frame distinct from the wire envelope:{"__bq_frame":1,"headers":…,"body":<raw envelope>}(RedisFrame, mirroring the Go/PHP__bq_frame).RedisPublisher.publishWithHeaders(Envelope, Map<String,String>)is the produce-side seam the optional corecom.babelqueue.otel.HeaderSenderwires to: with usable headers itRPUSHes the frame; with none itRPUSHes the bare envelope byte-for-byte (back-compat).RedisConsumertransparently unframes a reserved value — bare-value back-compat detection via the reserved__bq_framesentinel (a frozen envelope never carries it), theLREMack handle stays the stored value — and surfaces the headers to a new header-awareRedisConsumer.HeaderHandler((envelope, body, headers)), the consume-side seam forTracing.wrapHandler(tracer, handler, Supplier). The existing(envelope, body)BabelHandlerregistration is unchanged. The wire envelope is never touched (GR-1);trace_idis preserved (GR-4);schema_versionstays 1. No new runtime dependency — the frame codec is self-contained and the header seam is a plainMap<String,String>(GR-7).
- Require
com.babelqueue:babelqueue-core 1.5.0(the out-of-band header-carrier seam).
1.0.0 - 2026-06-14
- Initial release. A Redis transport on
babelqueue-core+ the Lettuce client, implementing §1 of the broker-bindings contract (the reliable-queue list pattern):RedisPublisher(produce =RPUSHthe canonical envelope JSON byte-for-byte, no wrapping and no property projection — Redis lists carry no native metadata) andRedisConsumer(reserve =BLMOVE <queue> <queue>:processing LEFT RIGHTso an in-flight message survives a worker crash → URN-routedBabelHandlers → ack viaLREM; at-least-once, a throwing handler leaves the message on the processing list;onError/onUnknownUrnhooks;attemptstaken from the body unchanged since Redis has no native delivery counter). Java 17, JUnit 5, Mockito, JaCoCo ≥90% line coverage (currently 100%); unit tests mock theRedisCommandsseam (no Redis, no network) and capture theRPUSH/BLMOVE/LREMcalls. The envelope is unchanged (schema_version: 1); Redis is purely additive. This is a Java-owned reliable queue; full parity with Laravel's reserved-sorted-set reservation on a shared Redis queue is a separate task (broker-bindings §1.4).