- Feature229180In-memory / vault-resolved subscription content for SubscriptionVerifier (no file on disk)
- Feature229790Improve recovery-scan observability: log ReplayCommit/PresumedAbort at INFO, add prepared-xid count event
- Feature229806RecoveryFailedEvent should carry the underlying failure cause
- Feature230271Bound REQUIRES_NEW transaction timeout to the suspended parent's remaining time (opt-in)
- Feature216947Add new pool with collections, of which one is "connections in use" or "availableConnections"
- Feature227307Atomikos JTA Timeout Not Immediately Interrupting Ongoing Transactions
- Feature230323Add named FEATURE_NNNNN constants to ConfigProperties for known opt-in feature flags
- Bug228956Pool maintenance churns idle connections within minPoolSize (199539 regression) - restore the minPoolSize cap on idle eviction
- Bug229746SLF4J 2.x not detected: obsolete StaticLoggerBinder probe makes Atomikos logging silently fall through
- About Severity
- Available to customers only. Want to become a customer?
Two transaction-timeout correctness improvements: a fix so a doomed transaction reusing the same connection is now interrupted on every subsequent use, not just the first, plus a new opt-in option to bound a REQUIRES_NEW transaction's timeout to its suspended parent's remaining time. Also includes an SLF4J 2.x detection fix and a connection-pool idle-eviction regression fix.
Feature229180 In-memory / vault-resolved subscription content for SubscriptionVerifier (no file on disk)
Description
You can now resolve the Atomikos subscription (license) content in-memory at startup instead of only from a file on disk -- for example fetched from a secrets vault such as Azure Key Vault, HashiCorp Vault, or AWS Secrets Manager. This means the subscription properties and signature no longer have to be persisted anywhere on the server's file system to satisfy security audits or to keep license material out of lower environments.
Technical details
A newSubscriptionContentProvider SPI lets you register a fully-configured provider instance via Configuration.setSubscriptionContentProvider(...); at startup Atomikos calls it to obtain the subscription properties and signature as InputStream objects, and never instantiates or configures the provider itself -- you construct it with your own vault client and credentials, the same pattern as registering a custom XADataSource. If no provider is registered, resolution falls back to the pre-existing lookup order: - a registered
SubscriptionContentProvider - the
com.atomikos.icatch.subscription_folderfile location - the classpath
Base64SubscriptionContentProvider is also available for cases where no custom provider class is needed: it reads the subscription properties and signature as base64-encoded content from two new system properties, populated by your own secrets tooling (e.g. a Kubernetes Secret or a Vault agent) before the JVM starts -- this only keeps the license material off the filesystem if that base64 value is itself injected at runtime rather than hardcoded into a script or file that is persisted on disk or in version control.
Changes impacting client API
New SPI interfacecom.atomikos.icatch.config.SubscriptionContentProvider, registered via the new Configuration.setSubscriptionContentProvider(...) and getSubscriptionContentProvider() methods. New system properties com.atomikos.icatch.subscription_properties_base64 and com.atomikos.icatch.subscription_signature_base64 activate the built-in Base64SubscriptionContentProvider. None of this is active unless you register a provider or set these properties.
Feature229790 Improve recovery-scan observability: log ReplayCommit/PresumedAbort at INFO, add prepared-xid count event
Description
You can now see recovery-scan outcomes in the logs at INFO level without enabling full transaction-trace debug logging: replay-commit and presumed-abort decisions are logged at INFO, and a new event reports how many prepared XIDs a resource's recovery scan actually returned. This means diagnosing a slow-to-resolve in-doubt transaction no longer requires turning on debug logging that also captures every normal transaction's participant-commit/abort activity.
Technical details
ReplayCommitEvent and PresumedAbortEvent, published by XARecoveryManager, are now handled by RecoveryMonitor instead of TransactionTraceMonitor, so they log at INFO independently of transaction-trace debug logging; the duplicate handling previously in TransactionTraceMonitor was removed. A new XidsRecoveredEvent is published after each resource's recovery scan, carrying counts only: the total number of prepared XIDs returned by the resource's xa_recover() call, how many were recognized as this transaction manager's own, and how many belonged to other transaction managers sharing the same resource manager. The raw XID list itself is not exposed by this event -- in a busy shared backend that list can be routinely large, so only the bounded counts are surfaced by default.
Changes impacting client API
ReplayCommitEvent and PresumedAbortEvent logging moved from com.atomikos.monitoring.TransactionTraceMonitor to com.atomikos.monitoring.RecoveryMonitor, and now logs at INFO rather than only when DEBUG is enabled on that logger. If your logging configuration sets levels on either of those two classes specifically to see these events, review it after upgrading. A new event type, com.atomikos.icatch.event.recovery.XidsRecoveredEvent, is published to registered EventListener implementations.
Feature229806 RecoveryFailedEvent should carry the underlying failure cause
Description
You can now see the underlying cause of a resource recovery failure directly inRecoveryFailedEvent, instead of only the affected resource's name. This means a monitoring dashboard subscribed to RecoveryFailedEvent can now tell, for example, a resource-manager-unavailable failure apart from a rollback failure, without cross-referencing raw log files.
Technical details
XATransactionalResource.recover() now captures the XAException encountered during a resource's recovery scan or a heuristic-outcome rollback and passes its message and XA error code through to RecoveryFailedEvent, instead of only logging and swallowing the exception. The separate, cause-less publish of RecoveryFailedEvent previously done by RecoveryDomainService.performRecovery() was removed, since XATransactionalResource.recover() now publishes the event itself with the failure detail attached.
Changes impacting client API
RecoveryFailedEvent (com.atomikos.icatch.event.recovery.RecoveryFailedEvent) now carries a cause message and an XA error code in addition to the resource name. Existing consumers of the event are unaffected but can now read this extra detail.
Feature230271 Bound REQUIRES_NEW transaction timeout to the suspended parent's remaining time (opt-in)
Description
You can now cap a REQUIRES_NEW transaction's timeout to the remaining time of the transaction it suspends, so a compound business operation's overall deadline is respected even across an independent REQUIRES_NEW sub-step. This is opt-in and off by default: with nothing configured, a REQUIRES_NEW transaction keeps getting its own full default timeout, exactly as before.
Technical details
When enabled, the transaction manager tracks the most recently suspended, not-yet-resumed transaction on the calling thread (viasuspend() and resume()). If a new transaction begins while one is suspended -- the REQUIRES_NEW case -- its timeout is capped to that suspended transaction's live remaining time, re-read at the moment the new transaction starts (not a stale snapshot taken when it was suspended). The cap only ever reduces the requested timeout, never extends it: if the suspended transaction has more time left than the new transaction's own default, the default is used unchanged. If more than one transaction is suspended on the same thread (nested REQUIRES_NEW), the most recently suspended one is used. No artificial minimum is applied: if the suspended transaction is nearly out of time, the new transaction gets a correspondingly short timeout rather than a padded one.
Changes impacting client API
New feature flagcom.atomikos.icatch.feature.230271, default false (disabled) -- must be explicitly enabled (in jta.properties or as a system property) to activate this behaviour.
Feature216947 Add new pool with collections, of which one is "connections in use" or "availableConnections"
Description
You can now enable a partitioned connection-pool tracking strategy that keeps in-use and available connections in separate collections, reducing contention when borrowing and enlisting connections under concurrent load.
Technical details
A newPartitionedConnectionPool implementation (selected through a new ConnectionPoolFactory behind the XConnectionPool interface, alongside the existing ConnectionPool) tracks available and in-use connections in separate collections, so borrow requests only scan available connections and idle-connection maintenance only removes from the available set. This is opt-in via the com.atomikos.icatch.feature.216947 flag, which defaults to false (disabled); with the flag left at its default, connection pooling is unchanged and continues to use the existing ConnectionPool implementation.
Changes impacting client API
None by default. Setting thecom.atomikos.icatch.feature.216947 system property / jta.properties entry to true switches JDBC/JMS connection pooling to the new PartitionedConnectionPool implementation.
Feature227307 Atomikos JTA Timeout Not Immediately Interrupting Ongoing Transactions
Description
You can now rely on the doomed-enlistment guard (com.atomikos.icatch.feature.227307=true) to catch a transaction that times out partway through a sequence of statements on the same, already-enlisted connection, not only on its first statement. This means a long-running transaction that reuses one connection across multiple statements is now correctly interrupted at the first use after it times out, not only when it commits.
Technical details
The guard introduced in 6.0.117 checked whether a transaction was doomed (timed out or marked rollback-only) only at the point a resource was first enlisted. If the same connection was then reused for several sequential statements within that transaction, later statements were not re-checked, so a transaction that timed out partway through would not be interrupted until it reached commit. The guard now re-checks doomed status on every subsequent use of an already-enlisted connection, not only the first.
Changes impacting client API
None beyond the existingcom.atomikos.icatch.feature.227307 flag introduced in 6.0.117 (still false by default) -- this is a refinement to that flag's existing behaviour, not a new activation mechanism.
Feature230323 Add named FEATURE_NNNNN constants to ConfigProperties for known opt-in feature flags
Description
You can now reference every known opt-in feature flag by name via constants onConfigProperties (e.g. ConfigProperties.FEATURE_227307) instead of a raw string literal.
Technical details
ConfigProperties gained FEATURE_207056, FEATURE_226870, FEATURE_227307, and FEATURE_230271 constants for use with getFeatureFlag(...). This is a purely additive convenience -- existing code passing the raw string id continues to work unchanged. A flag that graduates (its default becomes permanent) or is retired (its property is removed) keeps its constant, marked @Deprecated with javadoc explaining what happened, rather than having it deleted.
Changes impacting client API
None required -- existinggetFeatureFlag("NNNNN") calls with a raw string literal continue to work unchanged. New, optional: ConfigProperties.FEATURE_207056, FEATURE_226870, FEATURE_227307, FEATURE_230271 constants.
Bug228956 Pool maintenance churns idle connections within minPoolSize (199539 regression) - restore the minPoolSize cap on idle eviction
| Severity: | 3 |
|---|---|
| Affected version(s): | 6.0.x |
Description
The connection pool no longer closes and reopens its coreminPoolSize connections on every maintenance cycle when the pool is otherwise idle. This means an idle pool stays at rest instead of continuously destroying and recreating its minimum connections, avoiding unnecessary reconnect churn and blocking I/O held under the pool's internal lock.
Technical details
ConnectionPool.removeIdleConnectionsIfMinPoolSizeExceeded() had lost its minPoolSize cap in an earlier change, so every maintenance pass destroyed all idle connections past maxIdleTime -- including the core minPoolSize ones -- which were then immediately recreated in the same cycle. The cap is restored: idle connections are now evicted only above minPoolSize, matching the behaviour of the newer PartitionedConnectionPool. Existing connection-validation (connectionValidationInterval) and maxLifetime settings already cover stale-connection detection, so no opt-in flag was needed for this fix.
Changes impacting client API
None.
Bug229746 SLF4J 2.x not detected: obsolete StaticLoggerBinder probe makes Atomikos logging silently fall through
| Severity: | 4 |
|---|---|
| Affected version(s): | 6.0.x |
Description
Atomikos logging no longer silently falls through to log4j2, log4j, or java.util.logging when SLF4J 2.x is on the classpath. This means SLF4J 2.x users now get their Atomikos log output routed through SLF4J as expected, without any configuration change.
Technical details
Atomikos detected an available SLF4J binding by probing fororg.slf4j.impl.StaticLoggerBinder, a class SLF4J 2.x removed in favor of a ServiceLoader-based mechanism; on SLF4J 2.x that probe failed silently and Atomikos fell back to whatever other logging framework was present on the classpath. com.atomikos.logging.LoggerFactory now also probes for org.slf4j.spi.SLF4JServiceProvider, so both SLF4J 1.7.x (via StaticLoggerBinder) and 2.x (via SLF4JServiceProvider) are detected; if neither is present, Atomikos falls back to its existing behaviour unchanged.
Changes impacting client API
None.

Comments
Add a comment