WebSocket Extension 3.0.0.20-SNAPSHOT & WebSocket Client Extension 2.3.0.9-SNAPSHOT

Two new snapshot releases for the WebSocket extensions, fixing stability issues on both Lucee 6.2 and 7.0.

WebSocket Server Extension 3.0.0.20-SNAPSHOT

LDEV-6179 — Fix race condition during startup that caused websocketInfo() to fail with this.mapping is null.

What was happening

On startup, two threads (the background registrar and the first HTTP request) would race to create the websocket.json config file. The loser would get a FileAlreadyExistsException, the mapping would be left permanently null, and every subsequent call to websocketInfo() would NPE. A server restart was the only fix.

This was intermittent — sometimes the timing worked out, sometimes it didn’t. Particularly flaky in CI and Docker environments.

What changed

  • Config file creation now handles concurrent writes gracefully
  • Restructured the init lifecycle — data creation, component initialisation, and endpoint registration are now separate concerns
  • If mapping init fails (e.g. Lucee hasn’t finished deploying), the next call retries instead of being permanently broken
  • Fixed inject() self-delegation that caused infinite recursion in onError on Lucee 7.x

WebSocket Client Extension 2.3.0.9-SNAPSHOT

LDEV-6189 — Fix OSGi bundle resolution failure on Lucee 7.0.

GitHub

What was happening

The MANIFEST.MF had a malformed Require-Bundle header using Maven-style group:artifact syntax instead of the OSGi Bundle-SymbolicName. This header never actually matched anything — the dependency was only wired via Import-Package, which relied on Lucee’s lazy bundle recovery path. On Lucee 7.0, this recovery path is timing-sensitive and would sometimes fail on cold start.

What changed

  • Fixed Require-Bundle to use the correct symbolic name
  • Changed start-bundles to true so bundles are eagerly loaded into Felix on deploy

Testing

Both extensions have been tested against:

  • Lucee 6.2 (javax / Tomcat 9 / Java 11)
  • Lucee 7.0 (jakarta / Tomcat 11 / Java 21)

CI runs without a warmup step to confirm cold-start stability.

Breaking changes

None. The extension APIs are unchanged.

Feedback welcome — please report any issues on GitHub or reply here.

1 Like