Adhoc tasks/heartbeats with PresideCMS 10.30 and Lucee 6

Preside 10.30.x: Heartbeats and adhoc tasks silently fail on Lucee 6.2.6.19

Preside 10.30.x upgraded cfconcurrent from 2.x to 3.0.0. cfconcurrent 3.x ships with two JAR variants: cfconcurrent.jar (javax namespace) and cfconcurrent-jakarta.jar (jakarta namespace). At runtime, _isJakarta() detects the available Java classes and picks the appropriate variant.

The problem: On Lucee 6.2 running on a Jakarta Servlet container, _isJakarta() returns true, causing cfconcurrent-jakarta.jar (dated 2026-01-07) to be loaded. This JAR contains a LuceeCfcProxy.class that is incompatible with Lucee 6.2. LuceeRunnable.run() throws a Java-level exception before any CFML code executes. Java’s ScheduledThreadPoolExecutor silently cancels the ScheduledFuture on the first unchecked exception — all heartbeats die after their first attempt with no log output whatsoever.

Visible symptoms: scheduled tasks don’t run, adhoc tasks remain permanently at status=pending.

The fix: Use Preside’s WireBox override mechanism (application/services/) to override three system services and inject a LuceeCompatObjectFactory that forces cfconcurrent.jar (non-jakarta):

  • application/services/concurrency/LuceeCompatObjectFactory.cfc — overrides _getLuceeLib() to return ExpandPath(“/cfconcurrent/luceelib/cfconcurrent.jar”)
  • application/services/concurrency/PresideScheduledThreadpoolExecutor.cfc — injects LuceeCompatObjectFactory
  • application/services/taskmanager/PresideTaskManagerExecutor.cfc — injects LuceeCompatObjectFactory
  • application/services/taskmanager/PresideAdhocTaskManagerExecutor.cfc — extends the app-level PresideTaskManagerExecutor

The root fix should come from cfconcurrent shipping a corrected cfconcurrent-jakarta.jar for Lucee 6.2 compatibility, or Preside pinning to a working cfconcurrent version.

1 Like