Releases: softwaremill/okapi
v0.2.0
🎉 Highlights
- New
okapi-micrometermodule — Micrometer-based observability with counters (okapi.entries.delivered/retry.scheduled/failed), batch duration timer, andMultiGaugefor outbox state per status. Spring Boot autoconfig + framework-agnosticOutboxMetricsRefresherfor Ktor / plain JVM. Configurable viaokapi.metrics.refresh-interval(default15s). See #27, #29 - New
okapi-exposedmodule — Exposed ORM integration (ExposedConnectionProvider,ExposedTransactionRunner,ExposedTransactionContextValidator) extracted as an opt-in module. Use this if you want Okapi to integrate with an Exposed-based stack (Ktor or plain JVM) OutboxStorerewritten on plain JDBC — Exposed ORM removed fromokapi-postgres,okapi-mysql, andokapi-spring-boot. NewConnectionProviderfun interface +SpringConnectionProvider(works with anyPlatformTransactionManager— JPA, JDBC, jOOQ, MyBatis). Fewer transitive dependencies, faster, simpler integration. See #26- Java interoperability —
@JvmName,@JvmOverloads,@JvmStaticannotations acrossokapi-core,okapi-http,okapi-kafka,okapi-spring-bootmake all public APIs cleanly callable from Java. Validated against a standalone Java 21 project. See #24 - Multi-datasource transaction validation —
SpringTransactionContextValidatorandExposedTransactionContextValidatorvalidate the specific outbox DataSource. Newokapi.datasource-qualifierproperty to point Okapi at a non-primary DataSource. See #17 OutboxSchedulerhardening — silent-death bug fixed (uncaught exceptions intick()no longer kill the executor).OutboxProcessorSchedulerintegrates with SpringSmartLifecycle. See #14- CI security hardening — Maven Central publish gated on
maven-centralGitHub environment with required reviewers. See #31
⚠️ Breaking changes
If you're upgrading from 0.1.0, please review:
1. Time-based properties migrated to java.time.Duration (#16)
| 0.1.0 | 0.2.0 |
|---|---|
okapi.purger.retention-days: 7 |
okapi.purger.retention: 7d |
okapi.purger.interval-minutes: 60 |
okapi.purger.interval: 1h |
okapi.processor.interval-ms: 1000 |
okapi.processor.interval: 1s |
Spring Boot's relaxed Duration parsing accepts 1s, PT1S, 1000ms etc.
Also: okapi.processor.max-retries (default 5) is now a configurable property — previously hardcoded.
2. Exposed dropped from okapi-postgres, okapi-mysql, okapi-spring-boot (#26)
If you were relying on Exposed transitively from these modules, you must now declare it yourself, or add the new okapi-exposed module if you want Okapi to integrate with Exposed.
The old OutboxTable Exposed definition no longer exists. Custom OutboxStore implementations built on it must be rewritten using the new ConnectionProvider-based API in okapi-core.
3. OutboxScheduler and OutboxPurger constructors take config objects (#14, #16)
Raw parameter constructors replaced by OutboxSchedulerConfig and OutboxPurgerConfig value objects (with sensible defaults via @JvmOverloads). Migration: wrap your existing values in the appropriate config class.
OutboxProcessor constructor is unchanged.
📦 New on Maven Central
com.softwaremill.okapi:okapi-micrometer:0.2.0— observability modulecom.softwaremill.okapi:okapi-exposed:0.2.0— Exposed ORM integration module
What's Changed
- chore: bump version to 0.2.0 (#33) @endrju19
- fix: actionable error message in ExposedConnectionProvider (#32) @endrju19
- ci: gate Maven Central publish on maven-central environment (#31) @endrju19
- build(deps): bump the production group with 11 updates (#30) @dependabot[bot]
- feat: migrate OutboxStore from Exposed to plain JDBC (KOJAK-64) (#26) @endrju19
- feat: Jvm annotations for Java interoperability (KOJAK-65) (#24) @endrju19
- fix(micrometer): publish artifact + document okapi.metrics.refresh-interval (#29) @endrju19
- feat: Observability — OutboxProcessorListener + okapi-micrometer module (KOJAK-44) (#27) @endrju19
- build(deps): bump the production group with 3 updates (#28) @dependabot[bot]
- build(deps): bump com.h2database:h2 from 2.3.232 to 2.4.240 in the production group (#25) @dependabot[bot]
- feat: multi-datasource transaction validation (KOJAK-63) (#17) @endrju19
- feat: config unification — Duration migration + OutboxPurgerConfig (KOJAK-61) (#16) @endrju19
- build(deps): bump the production group with 2 updates (#23) @dependabot[bot]
- build(deps): bump gradle/actions from 6.0.1 to 6.1.0 (#22) @dependabot[bot]
- fix: mask decoded PGP key in CI logs (#20) @endrju19
- refactor(test): adopt Kotest 6.x data-driven testing and withClue (KOJAK-57) (#21) @endrju19
v0.1.0
What's Changed
- fix: decode base64 PGP key before signing (KOJAK-35) (#19) @endrju19
- feat: Maven Central release pipeline (KOJAK-35) (#18) @endrju19
- Bump the production group with 9 updates (#15) @dependabot[bot]
- feat: OutboxProcessorScheduler — configurability, reliability, SmartLifecycle (KOJAK-62) (#14) @endrju19
- Add integration tests module with contract, concurrency, and E2E tests (KOJAK-20) (#12) @endrju19
- feat: OutboxPurger v2 — configurability, reliability, batched delete (KOJAK-56) (#11) @endrju19
- Expand README with quick start, delivery guarantees, and module diagram (KOJAK-33) (#9) @endrju19
- Bump org.springframework.boot:spring-boot-autoconfigure from 4.0.4 to 4.0.5 in the production group (#13) @dependabot[bot]
- Add KDoc to public API across all modules (KOJAK-36) (#10) @endrju19
- Bump gradle/actions from 4.4.4 to 6.0.1 (#6) @dependabot[bot]
- Add MySQL Spring Boot autoconfiguration (KOJAK-37) (#3) @endrju19
- Bump the production group with 16 updates (#8) @dependabot[bot]
- Bump actions/setup-java from 4 to 5 (#5) @dependabot[bot]
- Bump actions/checkout from 4 to 6 (#4) @dependabot[bot]
- Add CI matrix testing and fix dependency scopes (#2) @endrju19
- Bump actions/upload-artifact from 4 to 7 (#7) @dependabot[bot]
- Add GitHub Actions CI and Dependabot (#1) @endrju19