Skip to content

Changelog — page 19

New features, improvements, and fixes in the Fluxzero SDK.

GitHub

1.186.0 (2026-05-28)

Continuous Integration
  • repair: authenticate Codex before repair run (GitHub)
GitHub

1.185.5 (2026-05-28)

Dependency updates
  • bump org.apache.maven.plugins:maven-surefire-plugin (GitHub)

    org.apache.maven.plugins:maven-surefire-plugin: 3.5.5 -> 3.5.6 changelog

GitHub

1.185.4 (2026-05-27)

Bug Fixes
  • tracking: expand split upcast messages (GitHub)

    DefaultTracking now preserves split-upcaster output by adding all DeserializingMessages produced for a serialized message instead of only the first result. Move the regression coverage out of chunked streaming tests into a dedicated tracking deserialization test.

GitHub

1.185.3 (2026-05-27)

Bug Fixes
  • modeling: limit message entity injection (#205) (GitHub)

    Prevent EntityParameterResolver from participating in non-event/notification tracking handlers while preserving internal HasEntity resolution paths.

    Require aggregate metadata to resolve to a compatible aggregate type before replaying an aggregate from metadata, avoiding accidental aggregate loads from copied error metadata or moved unknown types.

  • modeling: limit message entity injection (GitHub)

    Prevent EntityParameterResolver from participating in non-event/notification tracking handlers while preserving internal HasEntity resolution paths.

    Require aggregate metadata to resolve to a compatible aggregate type before replaying an aggregate from metadata, avoiding accidental aggregate loads from copied error metadata or moved unknown types.

GitHub

1.185.2 (2026-05-25)

Dependency updates
  • bump distroless/java25-debian13 in /proxy (GitHub)

    distroless/java25-debian13: 8fd23b8 -> dade01b

GitHub

1.185.1 (2026-05-25)

Dependency updates
  • bump distroless/java25-debian13 in /test-server (GitHub)

    distroless/java25-debian13: 8fd23b8 -> dade01b

GitHub

1.185.0 (2026-05-25)

Features
  • benchmark: add tracker preload mode (GitHub)

    Replace the old publishMode/concurrentPublish switch with an explicit benchmark mode: PRELOAD, BULK, or CONCURRENT. PRELOAD publishes the event set before registering consumers so profiling can focus on post-publish drain behavior.

  • benchmark: allow local tracker client mode (GitHub)

    Add a clientMode property to TrackerIntegrationBenchmark so it can run either against the default websocket/TestServer path or a shared LocalClient in-memory store.

    The local path intentionally reuses one root LocalClient across benchmark Fluxzero instances so default consumers and publishers observe the same message log.

Bug Fixes
  • handling: guard reusable handler fast path (GitHub)

    Do not let generic delegating handlers expose reusable handler methods. Decorators that only override invoker resolution can otherwise be bypassed by the optimized DefaultTracking path.

    Add regression coverage for expired request filtering, websocket lifecycle decorators, protected data restoration, lazy payload selection, and error-reporting policy on reusable handler methods.

  • handling: keep payload preparation lazy (GitHub)

    Avoid reading serialized payloads while preparing payload parameter resolvers. Handler selection can use the serialized payload class, while actual payload deserialization remains deferred until the selected invoker resolves its argument.

    If a payload is already in memory or already deserialized, the resolver still reuses it for nullability checks. Chunked typed payloads remain lazy so selection does not wait for the final chunk.

  • benchmark: isolate tracker clients per run (GitHub)

    Give TrackerIntegrationBenchmark clients a run-specific id suffix derived from the namespace so TestServer command-idempotency results from a prior JVM cannot satisfy new append commands.

    Also log the namespace to make rerun diagnostics easier.

Performance Improvements
  • tracking: trim batch handler overhead (GitHub)

    Reduce per-message tracking overhead by using an indexed list path for DeserializingMessage.forEachInBatch and by preparing payload parameters without repeating the payload cache lookup for regular non-chunked messages.

    Chunked typed payloads deliberately keep the old lazy resolver path so handler selection does not wait for the final chunk.

  • handling: specialize single dynamic parameters (GitHub)

    Avoid allocating a Function[] and using the general IntFunction path for unvalidated handler methods with one dynamic parameter. This keeps the existing resolver matching semantics, but lets the hot payload-handler case call the single-argument member invoker directly.

  • serialization: avoid payload memoizer maps (GitHub)

    Use a single-value cache for the default Object.class payload lookup in DeserializingObject and keep the typed map only for explicit getPayloadAs lookups. This avoids per-message ConcurrentHashMap allocation in the common payload handler path.

  • tracking: reduce batch filtering allocations (GitHub)

    Replace hot stream and Optional-heavy tracking paths with direct loops for position checks, tracker filtering, and batch message handling while preserving the existing stream-based deserialize API.

  • reflection: specialize direct member invocation (GitHub)

    Avoid creating per-call parameter-provider lambdas for the common no-arg and single-arg DefaultMemberInvoker paths while keeping the existing general IntFunction route for multi-arg and fallback invocation.

  • handling: reuse bound handler methods (GitHub)

    Split handler metadata into HandlerDescriptor and add a reusable HandlerMethod fast path for fixed-target single-method handlers. This keeps HandlerInvoker as the existing per-message compatibility adapter while allowing DefaultTracking and SDK-owned decorators to avoid per-message invoker and reporting wrapper allocation on eligible handlers.

    Also avoid an unused AtomicReference allocation in Invocation lazy id handling and cover the reusable method path in handler inspector and error reporting tests.

  • handling: reuse invokers as parameter providers (GitHub)

    Have unvalidated prepared and dynamic handler invokers implement IntFunction directly so invocation no longer creates an extra parameter-provider lambda. This preserves the same per-message invoker lifecycle while trimming one allocation layer from reflective handler dispatch.

  • handling: avoid handler policy cache hit allocations (GitHub)

    Avoid capturable loader lambdas on hot cache-hit paths in trigger filtering and error-reporting policy lookup. Trigger filters now also prepare to allowAll for methods without @​Trigger, removing that resolver from ordinary handler dispatch.

  • handling: reduce invocation threadlocal churn (GitHub)

    Preserve the existing Invocation.getCurrent() semantics while avoiding ThreadLocal map remove churn for each top-level handler invocation. The new test pins that callbacks still run after the current invocation is cleared.

  • handling: collapse no-op message filters (GitHub)

    Allow prepared message filters to identify always-true filters and collapse composed filter chains around them. Payload filters without allowed classes and segment filters without routing keys now disappear from the per-message hot path.

    JFR: /private/tmp/fluxzero-consumption-prepared-filter-noop.jfr no longer showed PayloadFilter/MessageFilter in the noop hot-method list; the run completed in 1320 ms.

  • handling: reduce per-message invocation allocations (GitHub)

    Skip building handler argument arrays when the method invocation validator is the default no-op validator. The validating path is preserved for web request parameter validation and custom validators.

    Reuse a completed report stage for handlers that do not need to send a response, avoiding a completed CompletableFuture allocation per event.

    JFR: /private/tmp/fluxzero-consumption-completed-report-noop.jfr no longer showed CompletableFuture.completedFuture in the allocation top; the noop handler run completed in 1594 ms.

  • serialization: avoid optional allocation for first messages (GitHub)

    Add a nullable first-message deserialization path and use it from DefaultTracking and the benchmark raw deserialize pipeline. The existing Optional-returning API remains available and delegates to the nullable method.

    JFR: /private/tmp/fluxzero-consumption-nullable-serializer-deserialize.jfr showed Optional allocation pressure dropping in the deserialize-only profile, with wall-clock remaining in the same ~1.3s band.

  • handling: avoid optional allocation in invoker resolution (GitHub)

    Add nullable invoker resolution methods alongside the existing Optional-based handler APIs and use them in the tracking hot path and core handler decorators. This keeps source compatibility while reducing per-message Optional churn through nested handlers and interceptors.

    JFR: /private/tmp/fluxzero-consumption-nullable-invoker-noop.jfr showed Optional.of allocation pressure dropping from roughly 6.6% to 3.8% in the noop handler profile; wall-clock remained noisy.

  • serialization: memoize deserialized payloads lazily (GitHub)

    Delay creation of the memoizing payload wrapper until a deserializing object actually materializes or checks its payload. This removes memoizer allocation from tracking paths that only need serialized message metadata.

    Keep metadata copies sharing the same memoized payload function and cover that behavior with a focused regression test.

  • common: allocate memoization storage lazily (GitHub)

    Avoid creating a ConcurrentHashMap for memoized functions that are never evaluated. This reduces allocation pressure in deserializing message paths where payload functions are often carried through without materializing the payload.

    The Lombok-generated all-args constructor shape is retained explicitly for compatibility.

  • handling: cache static handler resolution (GitHub)

    Prepare static parameter resolvers once per handler method so invocation no longer re-runs resolver matching for message, metadata, user, and timestamp parameters.

    Dynamic payload, trigger, and entity resolution remains message-dependent. Also cache error-reporting local-handler policy and skip request-expiry decoration for non-request handlers without changing public handler contracts.

  • handling: reduce tracking invocation overhead (GitHub)

    Prepare message filters once per handler method, add first-message serializer and caster fast paths, and remove several per-message wrapper/allocation paths in tracking handlers.

    The serializer fast path preserves findAny semantics for split/drop upcasters and the message apply path keeps batch completion behavior covered by focused tests.

  • tracking: reduce local in-memory tracking contention (GitHub)

    Reduce contention seen in local tracker profiling by replacing copy-on-write/synchronized hot-path structures, avoiding full-tail copies in the in-memory message store, and caching the local runtime client id.

    Keep DefaultTracking's non-chunked batch path eager and one-result-per-input so split upcasters cannot change tracking semantics while still avoiding chunk-specific bookkeeping for ordinary batches.

Tests
  • benchmark: add consumption jfr option (GitHub)

    Allow TrackerIntegrationBenchmark to start a programmatic JFR recording around the consumption phase only. This keeps publish/setup noise out of profiling runs while preserving the normal benchmark path when no jfrFile is configured.

  • benchmark: add tracker pipeline modes (GitHub)

    Add pipelineMode variants to TrackerIntegrationBenchmark so LocalClient preload runs can isolate raw tracking, deserialization, direct handler invocation, annotated no-op handling, payload handling, and the existing benchmark handler.

    This keeps the existing benchmark defaults unchanged while making JFR comparisons between store/client, serializer, and handler pipeline costs repeatable.

GitHub

1.184.1 (2026-05-23)

Bug Fixes
  • scheduling: reschedule changed periodic cron (GitHub)

    Mark cron-created periodic schedules with a compact cron schema metadata entry, and only replace an existing auto-started schedule when that schema changes. Explicit handler-driven delays clear the marker so intentionally delayed schedules remain untouched.

  • modeling: resolve aggregate metadata without relationships (GitHub)

    Load aggregate-root parameters directly from aggregate metadata instead of going through entity relationship lookup. This lets handlers receive historical aggregate state for legacy streams where newer events have aggregate metadata but older events predate relationship records.

    Adds a playback regression test for an event stream whose initial event has no aggregate metadata or relationships.

GitHub

1.184.0 (2026-05-23)

Features
  • web: add chunked request support (GitHub)

    Add Jetty-native proxy request chunking for large or unknown-length request bodies, gated behind FLUXZERO_PROXY_REQUEST_CHUNKING_ENABLED so existing deployments can keep the old non-chunked proxy path if desired.

    Restore SDK handling for chunked web requests across InputStream, typed payloads, byte[], String, WebRequest, @​BodyParam, @​FormParam, form-object binding, multipart WebFormPart payloads, and chunked InputStream response metadata.

    Keep continuation chunks on the normal tracker stream. If a tracker restarts and observes a continuation without an active first chunk, recovery pages readRange from the shared timestamp index up to the current continuation index, filters matching chunks while reading, and reconstructs only from the existing message log without reading ahead.

    Also reduce slow regression-test waits, make the proxy benchmark use async HttpClient calls for HTTP scenarios, and keep same-routing-key command ordering deterministic in the test server.

GitHub

1.183.0 (2026-05-22)

Features
  • entity: add predicate entity lookup (GitHub)
Build System
  • prevent missing secrets by only running auto-merge workflow for dependabot[bot] [skip ci] (GitHub)
Tests
  • config: update JUnit parallel execution configuration (GitHub)

    Add `executor-service=WORKER_THREAD_POOL` to JUnit parallel execution VM parameters to specify thread pool usage.

GitHub

1.182.1 (2026-05-22)

Dependency updates
  • bump distroless/java25-debian13 in /test-server (GitHub)

    distroless/java25-debian13: c0d379f -> 8fd23b8

GitHub

1.182.0 (2026-05-21)

Tests
  • test-fixture: support scheduled command expectations (GitHub)

    Add TestFixture expectations for commands scheduled via scheduleCommand, including only/negative variants and documentation for supported matcher forms.

    Also allow expectResultContaining to inspect Map results by value, entry, or expected entry subset.

GitHub

1.181.0 (2026-05-21)

Features
  • validation: inject context into payload constraints (GitHub)

    Allow constrained payload methods such as @​AssertTrue to resolve parameters from the active Fluxzero message context using configured ParameterResolvers. Delegate ValidationUtils to the active Fluxzero validator when available, keep test defaults in test resources, and keep SDK test artifacts free of local defaults and benchmark classes.

GitHub

1.180.0 (2026-05-21)

Features
  • scheduling: support local schedule handlers (GitHub)

    Use the task scheduler for local @​HandleSchedule and @​Periodic handlers so local schedules behave as an alternative to Spring @​Scheduled. Local scheduling now shares the Fluxzero clock, reacts to fixture clock changes through the task scheduler, and preserves Periodic return handling for durations, instants, payloads, and Schedule values.

    Also quiet downstream SLF4J test noise with logback-test configuration and pin Kotlin constructor-property annotations to the parameter target to avoid Kotlin migration warnings.

Bug Fixes
  • scheduling: honor versioned initial delay defaults (GitHub)

    Change @​Periodic initialDelay to use -1 as the implicit value, preserve legacy immediate autostart for older defaults versions, and enable the new delay/cron first-deadline behavior via fluxzero.defaults.version or the explicit scheduling flag.

    Also documents the versioned defaults and runs SDK tests against the new default profile without putting that property into test resources or the published test jar.

GitHub

1.179.4 (2026-05-21)

Bug Fixes
  • encryption: add logging for DefaultEncryption initialization in DecryptingPropertySource (GitHub)
GitHub

1.179.3 (2026-05-21)

Bug Fixes
  • modeling: tolerate duplicate member ids during load (GitHub)

    Do not reject duplicate non-null @​EntityId values while traversing existing member lists. Historical event-sourced state may contain duplicates and should still be loadable, especially for loadEntity and replay paths.

    When the SDK applies a list or collection member update for an entity id that already exists, replace the existing item instead of appending another duplicate. This preserves idempotent upsert behavior without breaking old state.

GitHub

1.179.2 (2026-05-21)

Bug Fixes
  • cap fixture trace collection (GitHub)

    Limit fixture trace bookkeeping per phase so large successful fixture runs do not pay unbounded diagnostic overhead. Keep later phases visible when an earlier phase is truncated.

    Verified with ./mvnw -pl sdk test and the Flowmaps AlertingTest resolveAlertsWhenEntityIsDeleted case against the local 0-SNAPSHOT SDK.

Documentation
  • encryption: clarify encryption key resolution (GitHub)
GitHub

1.179.1 (2026-05-21)

Bug Fixes
  • encryption: broaden encryption key resolution in DecryptingPropertySource (GitHub)

    Improve encryption key lookup by using DefaultPropertySource and removing redundant environment/system variable resolution logic.

GitHub

1.174.2 (2026-05-21)

Bug Fixes
  • encryption: add logging for DefaultEncryption initialization in DecryptingPropertySource (GitHub)
  • encryption: broaden encryption key resolution in DecryptingPropertySource (GitHub)

    Improve encryption key lookup by using DefaultPropertySource and removing redundant environment/system variable resolution logic.

    (cherry picked from commit 6825597cc162ab62ccd84b5a94cd2e4b20684816)

Documentation
  • encryption: clarify encryption key resolution (GitHub)

    (cherry picked from commit f18ce4b5d0ce0c405980791a99694fdc63b7c59c)

GitHub

1.179.0 (2026-05-20)

Features
  • tracking: add per-handler consumers for unconfigured handlers (GitHub)

    Change the handler-to-consumer assignment for unconfigured tracking handlers so current defaults can give each handler class its own generated consumer, using the message type's default consumer configuration as a template.

    Add fluxzero.tracking.unconfiguredHandlerConsumerMode to choose between perHandler and defaultAppConsumer. Use fluxzero.defaults.version=2026.05.20 as the defaults-profile marker so existing apps without the marker keep the shared default application consumer, while new starters can opt into per-handler isolation.

  • common: support property-style environment variables (GitHub)

    Resolve property keys through conventional uppercase environment variable names, while preserving exact environment variable lookup precedence.

Documentation
  • tracking: document unconfigured consumer defaults (GitHub)

    Update the README and generated agent guidance for the new unconfigured handler consumer modes.

    Clarify that fluxzero.defaults.version >= 2026.05.20 defaults to per-handler generated consumers, while older or missing defaults versions keep the shared application default consumer for compatibility.


© 2026 Fluxzero