A cor­rect­ness fix for JMS con­nec­tion pool­ing: con­cur­rent­ly clos­ing ses­sions of a pooled con­nec­tion can no longer dead­lock the pool, so a con­nec­tion that fails asyn­chro­nous­ly (for ex­am­ple an IBM MQ con­nec­tion drop) is re­li­ably de­tect­ed and re­placed.

Bug230921
JMS con­nec­tion pool could dead­lock when ses­sions are closed con­cur­rent­ly

Sever­i­ty:2
Af­fect­ed ver­sion(s):6.0.x

De­scrip­tion

A pooled JMS con­nec­tion no longer dead­locks when two threads con­cur­rent­ly close dif­fer­ent ses­sions of the same con­nec­tion, so the pool can re­li­ably re­claim and re­place that con­nec­tion in­stead of leav­ing a pool thread stuck.

Tech­ni­cal de­tails

Each JMS ses­sion proxy holds its own mon­i­tor while it clos­es, and the close path drove the con­nec­tion's ter­mi­na­tion - clos­ing the re­main­ing ses­sions and an­nounc­ing the con­nec­tion as avail­able to the pool - from in­side that mon­i­tor. Two threads each clos­ing a dif­fer­ent ses­sion could there­fore hold their own ses­sion mon­i­tor while reach­ing for the oth­er's: a lock-or­der­ing dead­lock. The same path was also not atom­ic be­tween de­cid­ing the con­nec­tion was avail­able and an­nounc­ing it, so un­der the same race a con­nec­tion that had al­ready been hand­ed back out could be an­nounced avail­able a sec­ond time and bor­rowed by two threads at once.

Ter­mi­na­tion is now sin­gle-shot per bor­row: a guard tak­en un­der the con­nec­tion's own mon­i­tor en­sures at most one thread runs the ses­sion tear­down and the avail­abil­i­ty an­nounce­ment, while the an­nounce­ment it­self still runs out­side the mon­i­tor. Con­cur­rent close is there­fore both dead­lock-free and free of the dou­ble hand-out. The be­hav­iour is al­ways on; there is noth­ing to con­fig­ure.

Changes im­pact­ing client API

None.

SBOM — run­time de­pen­den­cies are min­i­mal­is­tic

Con­cern­ing se­cu­ri­ty and vul­ner­a­bil­i­ties: the fol­low­ing are the run­time de­pen­den­cies (the SBOM) of our prod­uct. As you can see, the only tran­si­tive third-par­ty de­pen­den­cies are for the Spring Boot in­te­gra­tion mod­ules — be­cause that is the only way to in­te­grate with Spring Boot. All oth­er mod­ules / jars have no third-par­ty run­time de­pen­den­cies what­so­ev­er.

This is com­pile + run­time scope; pro­vid­ed, test and non-prop­a­gat­ing op­tion­al de­pen­den­cies are ex­clud­ed, so it is what your ap­pli­ca­tion ac­tu­al­ly re­ceives. Look up the mod­ule(s) your ap­pli­ca­tion de­pends on.

To re­pro­duce it your­self, run this in a project that de­pends on the Atomikos ar­ti­facts you use (use ex­act­ly this — not a bare de­pen­den­cy:tree, which would also list op­tion­al/pro­vid­ed li­braries you are not giv­en):

mvn dependency:list -DincludeScope=runtime

Mo­d­ules with no third-par­ty run­time de­pen­den­cies

ExtremeTransactionsForMaven
ate
atomikos-util
axt
extreme-transactions
extreme-transactions-jakarta
products
spring-boot2
spring-boot3
spring-boot3.4
spring-boot4
subscription
transactions
transactions-allegrograph
transactions-api
transactions-eclipselink
transactions-essentials
transactions-essentials-jakarta
transactions-hazelcast
transactions-hibernate2
transactions-hibernate3
transactions-hibernate4
transactions-jdbc
transactions-jms
transactions-jmx
transactions-jndi-provider
transactions-jsp
transactions-jta
transactions-logcloud
transactions-logutil
transactions-micrometer
transactions-monitoring
transactions-monitoring-logs
transactions-monitoring-stderr
transactions-opentracing
transactions-osgi
transactions-osgi-axt
transactions-remoting
transactions-remoting-recovery
transactions-spring
transactions-spring-boot-logcloud
transactions-tomcat

Per-mod­ule third-par­ty run­time de­pen­den­cies (opt-in, cus­tomer-cho­sen)

The de­pen­den­cies be­low ap­pear ONLY if you choose to use the cor­re­spond­ing in­te­gra­tion mod­ule. They are the plat­form your ap­pli­ca­tion al­ready runs — you added, say, the Spring Boot starter be­cause you use Spring Boot. Th­ese are your own, cus­tomer-cho­sen de­pen­den­cies: Atomikos does not in­ject any­thing into your in­fra­struc­ture; you opt in by de­pend­ing on the mod­ule.

transactions-spring-boot
  org.springframework.boot:spring-boot:2.3.4.RELEASE
  org.springframework:spring-aop:5.2.9.RELEASE
  org.springframework:spring-beans:5.2.9.RELEASE
  org.springframework:spring-context:5.2.9.RELEASE
  org.springframework:spring-core:5.2.9.RELEASE
  org.springframework:spring-expression:5.2.9.RELEASE
  org.springframework:spring-jcl:5.2.9.RELEASE
  org.springframework:spring-tx:5.2.9.RELEASE

transactions-spring-boot-starter
  org.springframework.boot:spring-boot:2.3.4.RELEASE
  org.springframework:spring-aop:5.2.9.RELEASE
  org.springframework:spring-beans:5.2.9.RELEASE
  org.springframework:spring-context:5.2.9.RELEASE
  org.springframework:spring-core:5.2.9.RELEASE
  org.springframework:spring-expression:5.2.9.RELEASE
  org.springframework:spring-jcl:5.2.9.RELEASE
  org.springframework:spring-tx:5.2.9.RELEASE

transactions-spring-boot3
  jakarta.jms:jakarta.jms-api:3.1.0
  jakarta.transaction:jakarta.transaction-api:2.0.1
  org.springframework.boot:spring-boot:3.0.1
  org.springframework:spring-aop:6.0.3
  org.springframework:spring-beans:6.0.3
  org.springframework:spring-context:6.0.3
  org.springframework:spring-core:6.0.3
  org.springframework:spring-expression:6.0.3
  org.springframework:spring-jcl:6.0.3
  org.springframework:spring-tx:6.0.3

transactions-spring-boot3-starter
  jakarta.jms:jakarta.jms-api:3.1.0
  jakarta.transaction:jakarta.transaction-api:2.0.1
  org.springframework.boot:spring-boot:3.0.1
  org.springframework:spring-aop:6.0.3
  org.springframework:spring-beans:6.0.3
  org.springframework:spring-context:6.0.3
  org.springframework:spring-core:6.0.3
  org.springframework:spring-expression:6.0.3
  org.springframework:spring-jcl:6.0.3
  org.springframework:spring-tx:6.0.3

transactions-spring-boot3.4
  io.micrometer:micrometer-commons:1.12.0
  io.micrometer:micrometer-observation:1.12.0
  jakarta.jms:jakarta.jms-api:3.1.0
  jakarta.transaction:jakarta.transaction-api:2.0.1
  org.springframework.boot:spring-boot:3.2.0
  org.springframework:spring-aop:6.1.1
  org.springframework:spring-beans:6.1.1
  org.springframework:spring-context:6.1.1
  org.springframework:spring-core:6.1.1
  org.springframework:spring-expression:6.1.1
  org.springframework:spring-jcl:6.1.1
  org.springframework:spring-tx:6.1.1

transactions-spring-boot3.4-starter
  io.micrometer:micrometer-commons:1.12.0
  io.micrometer:micrometer-observation:1.12.0
  jakarta.jms:jakarta.jms-api:3.1.0
  jakarta.transaction:jakarta.transaction-api:2.0.1
  org.springframework.boot:spring-boot:3.2.0
  org.springframework:spring-aop:6.1.1
  org.springframework:spring-beans:6.1.1
  org.springframework:spring-context:6.1.1
  org.springframework:spring-core:6.1.1
  org.springframework:spring-expression:6.1.1
  org.springframework:spring-jcl:6.1.1
  org.springframework:spring-tx:6.1.1

transactions-spring-boot4
  ch.qos.logback:logback-classic:1.5.21
  ch.qos.logback:logback-core:1.5.21
  com.zaxxer:HikariCP:7.0.2
  commons-logging:commons-logging:1.3.5
  io.micrometer:micrometer-commons:1.16.0
  io.micrometer:micrometer-observation:1.16.0
  jakarta.annotation:jakarta.annotation-api:3.0.0
  jakarta.jms:jakarta.jms-api:3.1.0
  jakarta.transaction:jakarta.transaction-api:2.0.1
  org.apache.logging.log4j:log4j-api:2.25.2
  org.apache.logging.log4j:log4j-to-slf4j:2.25.2
  org.jspecify:jspecify:1.0.0
  org.slf4j:jul-to-slf4j:2.0.17
  org.slf4j:slf4j-api:2.0.17
  org.springframework.boot:spring-boot-autoconfigure:4.0.0
  org.springframework.boot:spring-boot-data-commons:4.0.0
  org.springframework.boot:spring-boot-data-jdbc:4.0.0
  org.springframework.boot:spring-boot-jdbc:4.0.0
  org.springframework.boot:spring-boot-jms:4.0.0
  org.springframework.boot:spring-boot-persistence:4.0.0
  org.springframework.boot:spring-boot-sql:4.0.0
  org.springframework.boot:spring-boot-starter-data-jdbc:4.0.0
  org.springframework.boot:spring-boot-starter-jdbc:4.0.0
  org.springframework.boot:spring-boot-starter-jms:4.0.0
  org.springframework.boot:spring-boot-starter-logging:4.0.0
  org.springframework.boot:spring-boot-starter:4.0.0
  org.springframework.boot:spring-boot-transaction:4.0.0
  org.springframework.boot:spring-boot:4.0.0
  org.springframework.data:spring-data-commons:4.0.0
  org.springframework.data:spring-data-jdbc:4.0.0
  org.springframework.data:spring-data-relational:4.0.0
  org.springframework:spring-aop:7.0.1
  org.springframework:spring-beans:7.0.0
  org.springframework:spring-context:7.0.1
  org.springframework:spring-core:7.0.0
  org.springframework:spring-expression:7.0.1
  org.springframework:spring-jdbc:7.0.1
  org.springframework:spring-jms:7.0.1
  org.springframework:spring-messaging:7.0.1
  org.springframework:spring-tx:7.0.0
  org.yaml:snakeyaml:2.5

transactions-spring-boot4-starter
  ch.qos.logback:logback-classic:1.5.21
  ch.qos.logback:logback-core:1.5.21
  com.zaxxer:HikariCP:7.0.2
  commons-logging:commons-logging:1.3.5
  io.micrometer:micrometer-commons:1.16.0
  io.micrometer:micrometer-observation:1.16.0
  jakarta.annotation:jakarta.annotation-api:3.0.0
  jakarta.jms:jakarta.jms-api:3.1.0
  jakarta.transaction:jakarta.transaction-api:2.0.1
  org.apache.logging.log4j:log4j-api:2.25.2
  org.apache.logging.log4j:log4j-to-slf4j:2.25.2
  org.jspecify:jspecify:1.0.0
  org.slf4j:jul-to-slf4j:2.0.17
  org.slf4j:slf4j-api:2.0.17
  org.springframework.boot:spring-boot-autoconfigure:4.0.0
  org.springframework.boot:spring-boot-data-commons:4.0.0
  org.springframework.boot:spring-boot-data-jdbc:4.0.0
  org.springframework.boot:spring-boot-jdbc:4.0.0
  org.springframework.boot:spring-boot-jms:4.0.0
  org.springframework.boot:spring-boot-persistence:4.0.0
  org.springframework.boot:spring-boot-sql:4.0.0
  org.springframework.boot:spring-boot-starter-data-jdbc:4.0.0
  org.springframework.boot:spring-boot-starter-jdbc:4.0.0
  org.springframework.boot:spring-boot-starter-jms:4.0.0
  org.springframework.boot:spring-boot-starter-logging:4.0.0
  org.springframework.boot:spring-boot-starter:4.0.0
  org.springframework.boot:spring-boot-transaction:4.0.0
  org.springframework.boot:spring-boot:4.0.0
  org.springframework.data:spring-data-commons:4.0.0
  org.springframework.data:spring-data-jdbc:4.0.0
  org.springframework.data:spring-data-relational:4.0.0
  org.springframework:spring-aop:7.0.1
  org.springframework:spring-beans:7.0.0
  org.springframework:spring-context:7.0.1
  org.springframework:spring-core:7.0.0
  org.springframework:spring-expression:7.0.1
  org.springframework:spring-jdbc:7.0.1
  org.springframework:spring-jms:7.0.1
  org.springframework:spring-messaging:7.0.1
  org.springframework:spring-tx:7.0.0
  org.yaml:snakeyaml:2.5

About Sever­i­ty

The sever­i­ty lev­els we use are de­fined in our sup­port terms and con­di­tions.

Avail­able to cus­tomers only. Want to be­come a cus­tomer?

Free Tr­i­al
RSS

Comments

Add a comment

Corporate Information

Atomikos Corporate Headquarters
Hoveniersstraat, 39/1, 2800
Mechelen, Belgium

Contact Us

Copyright 2026 Atomikos BVBA | Our Privacy Policy
By using this site you agree to our cookies. More info. That's Fine