Websocket Extention 3.0.0.18 on Lucee 7 does not seem to work

Not sure how to troubleshoot this issue, ie; is it Tomcat or Lucee not working.

My installation is downloading the Lucee 7 installer and running it, so there is no strange folder configurations, etc.

When I installed with extention, it did not create a websocket.json file. I put the websockets folder in

/opt/lucee/tomcat/lucee-server/context/websockets
also tried
/opt/lucee/tomcat/lucee-server/context/context/websockets

And even my webroot folder. Inside the folder I placed a file called test.cfc (well, each folder had an added letter so I knew what file I was hitting).

inside this test.cfc:

`component hint=“used to test websocket client” {

public static function onFirstOpen( wsclients ) {}

function onOpen( wsclient ) {}

function onOpenAsync( wsclient ) {}

function onMessage( wsclient, message ) {}

function onClose( wsclient, reasonPhrase ) {}

function onError( wsclient, cfcatch ) {}

public static function onLastClose() {}

}`

inside the test.cfm file I created (javascript script tags):

`
const socket = new WebSocket(“wss://dev.example.com/ws/test”);

socket.onopen = function (evt) {
console.log(“Connected”);
socket.send(“Hello, Lucee Extension!”);
};

socket.onmessage = function (event) {
console.log(“Received:”, event.data);
};

socket.onclose = function (evt) {
console.log(“Connection closed”);
};

socket.onerror = function (error) {
console.error(“WebSocket error:”, error);
};
`

And the page just returns an unable to connect error. And yes, I restarted the lucee server each time I made the websockets folder and the test.cfc file in different location. The admin panel does not have a websockets mapping (I do not know if it should). And the Catalina.log spits this out:

26-Mar-2026 22:33:35.157 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8886"] 26-Mar-2026 22:33:35.166 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["https-jsse-nio-8443"] 26-Mar-2026 22:33:35.169 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["ajp-nio-0:0:0:0:0:0:0:0-8069"] 26-Mar-2026 22:33:35.171 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in [2396] milliseconds Exception in thread "Thread-1" java.lang.NoSuchMethodError: 'javax.servlet.ServletContext lucee.runtime.config.ConfigWeb.getServletContext()' at org.lucee.extension.websocket.WebSocketEndpointFactory.register(WebSocketEndpointFactory.java:85) at org.lucee.extension.websocket.WebSocketEndpointFactory$Registrar.run(WebSocketEndpointFactory.java:265) Exception in thread "Thread-1329" java.lang.NoSuchMethodError: 'javax.servlet.ServletContext lucee.runtime.config.ConfigWeb.getServletContext()' at org.lucee.extension.websocket.WebSocketEndpointFactory.register(WebSocketEndpointFactory.java:85) at org.lucee.extension.websocket.WebSocketEndpointFactory$Registrar.run(WebSocketEndpointFactory.java:265) Exception in thread "Thread-1402" java.lang.NoSuchMethodError: 'javax.servlet.ServletContext lucee.runtime.config.ConfigWeb.getServletContext()' at org.lucee.extension.websocket.WebSocketEndpointFactory.register(WebSocketEndpointFactory.java:85) at org.lucee.extension.websocket.WebSocketEndpointFactory$Registrar.run(WebSocketEndpointFactory.java:265)

I also setup the websocket.log file set to trace as suggested by the document page. It did do something for a few seconds:

`
“Severity”,“ThreadID”,“Date”,“Time”,“Context”,“Application”,“Message”
“TRACE”,“Thread-1329”,“03/26/2026”,“23:38:17”,“”,“websocket-endpoint-factory”,“checking for new web context to register, current interval [500ms]”
“TRACE”,“Thread-1329”,“03/26/2026”,“23:38:18”,“”,“websocket-endpoint-factory”,“checking for new web context to register, current interval [500ms]”
“TRACE”,“Thread-1329”,“03/26/2026”,“23:38:18”,“”,“websocket-endpoint-factory”,“checking for new web context to register, current interval [500ms]”
“TRACE”,“Thread-1329”,“03/26/2026”,“23:38:19”,“”,“websocket-endpoint-factory”,“checking for new web context to register, current interval [500ms]”
“TRACE”,“Thread-1329”,“03/26/2026”,“23:38:19”,“”,“websocket-endpoint-factory”,“checking for new web context to register, current interval [1000ms]”
“TRACE”,“Thread-1329”,“03/26/2026”,“23:38:20”,“”,“websocket-endpoint-factory”,“checking for new web context to register, current interval [1000ms]”
“TRACE”,“Thread-1329”,“03/26/2026”,“23:38:21”,“”,“websocket-endpoint-factory”,“checking for new web context to register, current interval [1000ms]”
“TRACE”,“Thread-1329”,“03/26/2026”,“23:38:22”,“”,“websocket-endpoint-factory”,“checking for new web context to register, current interval [1000ms]”
“TRACE”,“Thread-1402”,“03/26/2026”,“23:39:55”,“”,“websocket-endpoint-factory”,“checking for new web context to register, current interval [500ms]”
“TRACE”,“Thread-1402”,“03/26/2026”,“23:39:55”,“”,“websocket-endpoint-factory”,“checking for new web context to register, current interval [500ms]”
“TRACE”,“Thread-1402”,“03/26/2026”,“23:39:56”,“”,“websocket-endpoint-factory”,“checking for new web context to register, current interval [500ms]”
“TRACE”,“Thread-1402”,“03/26/2026”,“23:39:56”,“”,“websocket-endpoint-factory”,“checking for new web context to register, current interval [500ms]”
“TRACE”,“Thread-1402”,“03/26/2026”,“23:39:57”,“”,“websocket-endpoint-factory”,“checking for new web context to register, current interval [1000ms]”
“TRACE”,“Thread-1402”,“03/26/2026”,“23:39:58”,“”,“websocket-endpoint-factory”,“checking for new web context to register, current interval [1000ms]”
“TRACE”,“Thread-1402”,“03/26/2026”,“23:39:59”,“”,“websocket-endpoint-factory”,“checking for new web context to register, current interval [1000ms]”
“TRACE”,“Thread-1402”,“03/26/2026”,“23:40:00”,“”,“websocket-endpoint-factory”,“checking for new web context to register, current interval [1000ms]”

`

I am currently on:
Lucee 7.0.2.106 Apache Tomcat/11.0.13 Java: 21.0.9 (Eclipse Adoptium) 64bit

I think I covered all the questions.

always a good bet to try the latest SNAPSHOT if newer than the stable release :slight_smile:

That is my next step. Just wanted to report my finding here since it is in the release column.

:+1:

Went to the 3.0.0.20 snapshot and have similar results. No websocket.json file is created. But there is no error in Catalina this time. I restarted Tomcat to make sure that was not the hold up.

I check in on Websocket.log and it starts with:
"INFO","Thread-1","03/27/2026","01:27:39","","websocket-endpoint-factory","register WebSocketEndpoint with servlet container" "INFO","Thread-1","03/27/2026","01:27:39","/opt/lucee/tomcat/webapps/ROOT","websocket-endpoint-factory","register WebSocketEndpoint with servlet container"

And then this just repeats after that:
`
“TRACE”,“Thread-1”,“03/27/2026”,“01:27:39”,“”,“websocket-endpoint-factory”,“checking for new web context to register, current interval [500ms]”
“TRACE”,“Thread-1”,“03/27/2026”,“01:27:40”,“”,“websocket-endpoint-factory”,“checking for new web context to register, current interval [500ms]”
“TRACE”,“Thread-1”,“03/27/2026”,“01:27:40”,“”,“websocket-endpoint-factory”,“checking for new web context to register, current interval [500ms]”
“TRACE”,“Thread-1”,“03/27/2026”,“01:27:41”,“”,“websocket-endpoint-factory”,“checking for new web context to register, current interval [1000ms]”
“TRACE”,“Thread-1”,“03/27/2026”,“01:27:42”,“”,“websocket-endpoint-factory”,“checking for new web context to register, current interval [1000ms]”
“TRACE”,“Thread-1”,“03/27/2026”,“01:27:43”,“”,“websocket-endpoint-factory”,“checking for new web context to register, current interval [1000ms]”
“TRACE”,“Thread-1”,“03/27/2026”,“01:27:44”,“”,“websocket-endpoint-factory”,“checking for new web context to register, current interval [1000ms]”
“TRACE”,“Thread-1”,“03/27/2026”,“01:27:45”,“”,“websocket-endpoint-factory”,“checking for new web context to register, current interval [1000ms]”
“TRACE”,“Thread-1”,“03/27/2026”,“01:27:46”,“”,“websocket-endpoint-factory”,“checking for new web context to register, current interval [1000ms]”
“TRACE”,“Thread-1”,“03/27/2026”,“01:27:47”,“”,“websocket-endpoint-factory”,“checking for new web context to register, current interval [1000ms]”
“TRACE”,“Thread-1”,“03/27/2026”,“01:27:48”,“”,“websocket-endpoint-factory”,“checking for new web context to register, current interval [1000ms]”
“TRACE”,“Thread-1”,“03/27/2026”,“01:27:49”,“”,“websocket-endpoint-factory”,“checking for new web context to register, current interval [1000ms]”
“TRACE”,“Thread-1”,“03/27/2026”,“01:27:50”,“”,“websocket-endpoint-factory”,“checking for new web context to register, current interval [1000ms]”
“TRACE”,“Thread-1”,“03/27/2026”,“01:27:51”,“”,“websocket-endpoint-factory”,“checking for new web context to register, current interval [1000ms]”
“TRACE”,“Thread-1”,“03/27/2026”,“01:27:52”,“”,“websocket-endpoint-factory”,“checking for new web context to register, current interval [1000ms]”
“TRACE”,“Thread-1”,“03/27/2026”,“01:27:53”,“”,“websocket-endpoint-factory”,“checking for new web context to register, current interval [1000ms]”
“TRACE”,“Thread-1”,“03/27/2026”,“01:27:54”,“”,“websocket-endpoint-factory”,“checking for new web context to register, current interval [1000ms]”
“TRACE”,“Thread-1”,“03/27/2026”,“01:27:55”,“”,“websocket-endpoint-factory”,“checking for new web context to register, current interval [1000ms]”

`

Still cannot find a websocket.json, and the test page still will not connect to a websocket.

Websockets still is not working correctly. But I have gotten further.

I went to the local machine to do some testing since I think apache was disrupting the wss connection.

I removed the extention, I restart Lucee. I reloaded the extention, still no websocket.json file. However, I did manage to finally get websockets to build a JSON file, I had to run:

<cfdump var="#websocketInfo()#" />

After I ran that, websockets “woke up”. And no matter how many times I restarted lucee, this would spill out into the log:

"INFO","https-jsse-nio-8443-exec-2","03/27/2026","17:09:08","","websocket-endpoint-factory","init WebSocketEndpoint"
"WARN","https-jsse-nio-8443-exec-2","03/27/2026","17:09:08","","websocket-endpoint-factory","calling [onOpen] via reflection, Lucee restart needed!"
"WARN","https-jsse-nio-8443-exec-2","03/27/2026","17:09:08","","websocket-endpoint-factory","calling [onError] via reflection, Lucee restart needed!"

So I restarted Tomcat. The above messages went away, but the error was still there.

The log is producing errors:

"INFO","https-jsse-nio-8443-exec-10","03/27/2026","17:14:22","https://127.0.0.1:8443","websocket-endpoint-factory","found configuration at  [/opt/lucee/tomcat/lucee-server/context/websocket.json]"
"INFO","https-jsse-nio-8443-exec-10","03/27/2026","17:14:22","https://127.0.0.1:8443","websocket-endpoint-factory","found [directory] setting in configuration, using [{lucee-config}/websockets/]"
"INFO","https-jsse-nio-8443-exec-10","03/27/2026","17:14:22","https://127.0.0.1:8443","websocket-endpoint-factory","component path is [{lucee-config}/websockets/] resolved [/opt/lucee/tomcat/lucee-server/context/websockets/]"
"INFO","https-jsse-nio-8443-exec-10","03/27/2026","17:14:22","https://127.0.0.1:8443","websocket-endpoint-factory","init WebSocketEndpoint for web context [5184b77bebf36ed4bb734a322d15e049 - /opt/lucee/tomcat/webapps/ROOT/] mapping defined in the configuration is [{lucee-config}/websockets/], this is resolved to [/opt/lucee/tomcat/lucee-server/context/websockets]"
"INFO","https-jsse-nio-8443-exec-2","03/27/2026","17:14:22","","websocket-endpoint-factory","init WebSocketEndpoint"
"INFO","https-jsse-nio-8443-exec-2","03/27/2026","17:14:22","","websocket-endpoint-factory","Cannot invoke ""lucee.runtime.config.ConfigWeb.getIdentification()"" because ""cw"" is null;onError got involved for component [test2] with session id [0]java.lang.NullPointerException: Cannot invoke ""lucee.runtime.config.ConfigWeb.getIdentification()"" because ""cw"" is null
	at org.lucee.extension.websocket.WebSocketEndpointFactory.getOrCreateData(WebSocketEndpointFactory.java:82)
	at org.lucee.extension.websocket.WebSocketEndpointFactory.setSessions(WebSocketEndpointFactory.java:294)
	at org.lucee.extension.websocket.BaseWebSocketEndpoint.onOpen(BaseWebSocketEndpoint.java:105)
	at org.lucee.extension.websocket.JakartaWebSocketEndpoint.onOpen(JakartaWebSocketEndpoint.java:31)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source)
	at java.base/java.lang.reflect.Method.invoke(Unknown Source)
	at org.apache.tomcat.websocket.pojo.PojoEndpointBase.doOnOpen(PojoEndpointBase.java:67)
	at org.apache.tomcat.websocket.pojo.PojoEndpointServer.onOpen(PojoEndpointServer.java:46)
	at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.init(WsHttpUpgradeHandler.java:131)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:945)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1778)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:946)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:480)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:57)
	at java.base/java.lang.Thread.run(Unknown Source)
"
"INFO","https-jsse-nio-8443-exec-2","03/27/2026","17:14:22","","websocket-endpoint-factory","java.lang.reflect.InvocationTargetException;onError got involved for component [test2] with session id [0]java.lang.reflect.InvocationTargetException
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source)
	at java.base/java.lang.reflect.Method.invoke(Unknown Source)
	at org.apache.tomcat.websocket.pojo.PojoEndpointBase.onClose(PojoEndpointBase.java:101)
	at org.apache.tomcat.websocket.WsSession.fireEndpointOnClose(WsSession.java:718)
	at org.apache.tomcat.websocket.WsSession.doClose(WsSession.java:575)
	at org.apache.tomcat.websocket.WsSession.doClose(WsSession.java:541)
	at org.apache.tomcat.websocket.WsSession.close(WsSession.java:529)
	at org.apache.tomcat.websocket.WsSession.close(WsSession.java:523)
	at org.apache.tomcat.websocket.pojo.PojoEndpointBase.handleOnOpenOrCloseError(PojoEndpointBase.java:90)
	at org.apache.tomcat.websocket.pojo.PojoEndpointBase.doOnOpen(PojoEndpointBase.java:75)
	at org.apache.tomcat.websocket.pojo.PojoEndpointServer.onOpen(PojoEndpointServer.java:46)
	at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.init(WsHttpUpgradeHandler.java:131)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:945)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1778)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:946)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:480)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:57)
	at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException: Cannot invoke ""lucee.runtime.config.ConfigWeb.getIdentification()"" because ""cw"" is null
	at org.lucee.extension.websocket.WebSocketEndpointFactory.getOrCreateData(WebSocketEndpointFactory.java:82)
	at org.lucee.extension.websocket.WebSocketEndpointFactory.getSessions(WebSocketEndpointFactory.java:290)
	at org.lucee.extension.websocket.BaseWebSocketEndpoint.onClose(BaseWebSocketEndpoint.java:281)
	at org.lucee.extension.websocket.JakartaWebSocketEndpoint.onClose(JakartaWebSocketEndpoint.java:46)
	... 19 more
"
"INFO","https-jsse-nio-8443-exec-2","03/27/2026","17:14:22","","websocket-endpoint-factory","onMessage got involved for component [test2] with session id [0]"
"INFO","https-jsse-nio-8443-exec-2","03/27/2026","17:14:22","","websocket-endpoint-factory","Cannot invoke ""lucee.runtime.config.ConfigWeb.getIdentification()"" because ""cw"" is null;onError got involved for component [test2] with session id [0]java.lang.NullPointerException: Cannot invoke ""lucee.runtime.config.ConfigWeb.getIdentification()"" because ""cw"" is null
	at org.lucee.extension.websocket.WebSocketEndpointFactory.getOrCreateData(WebSocketEndpointFactory.java:82)
	at org.lucee.extension.websocket.WebSocketEndpointFactory.getRequestTimeout(WebSocketEndpointFactory.java:302)
	at org.lucee.extension.websocket.util.WSUtil.createPageContext(WSUtil.java:355)
	at org.lucee.extension.websocket.BaseWebSocketEndpoint.onMessage(BaseWebSocketEndpoint.java:194)
	at org.lucee.extension.websocket.BaseWebSocketEndpoint.onMessage(BaseWebSocketEndpoint.java:190)
	at org.lucee.extension.websocket.JakartaWebSocketEndpoint.onMessage(JakartaWebSocketEndpoint.java:36)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source)
	at java.base/java.lang.reflect.Method.invoke(Unknown Source)
	at org.apache.tomcat.websocket.pojo.PojoMessageHandlerPartialBase.onMessage(PojoMessageHandlerPartialBase.java:67)
	at org.apache.tomcat.websocket.WsFrameBase.sendMessageText(WsFrameBase.java:389)
	at org.apache.tomcat.websocket.server.WsFrameServer.sendMessageText(WsFrameServer.java:130)
	at org.apache.tomcat.websocket.WsFrameBase.processDataText(WsFrameBase.java:486)
	at org.apache.tomcat.websocket.WsFrameBase.processData(WsFrameBase.java:286)
	at org.apache.tomcat.websocket.WsFrameBase.processInputBuffer(WsFrameBase.java:129)
	at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:85)
	at org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:184)
	at org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:164)
	at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:152)
	at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:60)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:57)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1778)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:946)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:480)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:57)
	at java.base/java.lang.Thread.run(Unknown Source)
"
"TRACE","Thread-1","03/27/2026","17:14:24","","websocket-endpoint-factory","checking for new web context to register, current interval [10000ms]"
"TRACE","Thread-1","03/27/2026","17:14:34","","websocket-endpoint-factory","checking for new web context to register, current interval [10000ms]"

From the browser I would get connected and immediatly disconnected.

While testing the different snapshots trying to get one to work, I found out that if I install the release websocket, restart Lucee, run the test page above, then upgrade to the snapshot, followed by a restart, I do not get an immediate disconnect. Here is the log from When I upgraded back to the 3.0.0.20-Snapshot and restarted Lucee. Ran that page, then restarted Tomcat.

"INFO","https-jsse-nio-8443-exec-6","03/27/2026","22:14:24","","websocket-endpoint-factory","init WebSocketEndpoint"
"WARN","https-jsse-nio-8443-exec-6","03/27/2026","22:14:24","","websocket-endpoint-factory","calling [onOpen] via reflection, Lucee restart needed!"
"INFO","https-jsse-nio-8443-exec-6","03/27/2026","22:14:24","https://dev.example.com:446","websocket-endpoint-factory","onOpen got involved for component [test2], current session size [1], session size 1==first open"
"INFO","https-jsse-nio-8443-exec-6","03/27/2026","22:14:24","https://dev.example.com:446","websocket-endpoint-factory","calling [onFirstOpen] function for component [test2]"
"INFO","https-jsse-nio-8443-exec-6","03/27/2026","22:14:24","https://dev.example.com:446","websocket-endpoint-factory","calling [onOpenAsync] function for component [test2]"
"INFO","https-jsse-nio-8443-exec-6","03/27/2026","22:14:24","https://dev.example.com:446","websocket-endpoint-factory","calling [onOpen] function for component [test2]"
"INFO","https-jsse-nio-8443-exec-6","03/27/2026","22:14:24","https://dev.example.com:446","websocket-endpoint-factory","called [onOpen] function for component [test2]"
"WARN","https-jsse-nio-8443-exec-7","03/27/2026","22:14:24","","websocket-endpoint-factory","calling [onMessage] via reflection, Lucee restart needed!"
"INFO","https-jsse-nio-8443-exec-7","03/27/2026","22:14:24","https://dev.example.com:446","websocket-endpoint-factory","onMessage got involved for component [test2] with session id [2]"
"INFO","https-jsse-nio-8443-exec-7","03/27/2026","22:14:24","https://dev.example.com:446","websocket-endpoint-factory","calling [onMessage] for component [test2] with session id [2], message size: [23]."
"INFO","https-jsse-nio-8443-exec-7","03/27/2026","22:14:24","https://dev.example.com:446","websocket-endpoint-factory","called [onMessage] for component [test2] with session id [2], message size: [23] with no return value provided."
"TRACE","Thread-646","03/27/2026","22:14:55","","websocket-endpoint-factory","checking for new web context to register, current interval [60000ms]"
"TRACE","Thread-1","03/27/2026","22:15:02","","websocket-endpoint-factory","checking for new web context to register, current interval [60000ms]"
"TRACE","Thread-671","03/27/2026","22:15:02","","websocket-endpoint-factory","checking for new web context to register, current interval [60000ms]"
"WARN","https-jsse-nio-8443-exec-8","03/27/2026","22:15:24","","websocket-endpoint-factory","calling [onError] via reflection, Lucee restart needed!"
"INFO","https-jsse-nio-8443-exec-8","03/27/2026","22:15:24","https://dev.example.com:446","websocket-endpoint-factory","java.io.EOFException;onError got involved for component [test2] with session id [2]java.io.EOFException
	at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1338)
	at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.fillReadBuffer(NioEndpoint.java:1286)
	at org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper.read(NioEndpoint.java:1230)
	at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:74)
	at org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:184)
	at org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:164)
	at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:152)
	at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:60)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:57)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1778)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:946)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:480)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:57)
	at java.base/java.lang.Thread.run(Unknown Source)
"
"INFO","https-jsse-nio-8443-exec-8","03/27/2026","22:15:24","https://dev.example.com:446","websocket-endpoint-factory","calling [onError] for component [test2] with session id [2]."
"INFO","https-jsse-nio-8443-exec-8","03/27/2026","22:15:24","https://dev.example.com:446","websocket-endpoint-factory","called [onError] for component [test2] with session id [2]."
"WARN","https-jsse-nio-8443-exec-8","03/27/2026","22:15:24","","websocket-endpoint-factory","calling [onClose] via reflection, Lucee restart needed!"
"INFO","https-jsse-nio-8443-exec-8","03/27/2026","22:15:24","https://dev.example.com:446","websocket-endpoint-factory","onClose got involved for component [test2], current session size [1], session size 0==last close"
"INFO","https-jsse-nio-8443-exec-8","03/27/2026","22:15:24","https://dev.example.com:446","websocket-endpoint-factory","calling [onClose] for component [test2] with session id [2]."
"INFO","https-jsse-nio-8443-exec-8","03/27/2026","22:15:24","https://dev.example.com:446","websocket-endpoint-factory","called [onClose] for component [test2] with session id [2]."
"INFO","https-jsse-nio-8443-exec-8","03/27/2026","22:15:24","https://dev.example.com:446","websocket-endpoint-factory","calling [onLastClose] function for component [test2]"
"INFO","https-jsse-nio-8443-exec-8","03/27/2026","22:15:24","https://dev.example.com:446","websocket-endpoint-factory","async triggered [onLastClose] for component [test2]."
"TRACE","Thread-1","03/27/2026","22:16:02","","websocket-endpoint-factory","checking for new web context to register, current interval [500ms]"
"INFO","Thread-1","03/27/2026","22:16:02","","websocket-endpoint-factory","register WebSocketEndpoint with servlet container"
"INFO","Thread-1","03/27/2026","22:16:02","/opt/lucee/tomcat/webapps/ROOT","websocket-endpoint-factory","register WebSocketEndpoint with servlet container"
"TRACE","Thread-1","03/27/2026","22:16:02","","websocket-endpoint-factory","checking for new web context to register, current interval [500ms]"
"TRACE","Thread-1","03/27/2026","22:16:03","","websocket-endpoint-factory","checking for new web context to register, current interval [500ms]"
"TRACE","Thread-1","03/27/2026","22:16:03","","websocket-endpoint-factory","checking for new web context to register, current interval [500ms]"
"TRACE","Thread-1","03/27/2026","22:16:04","","websocket-endpoint-factory","checking for new web context to register, current interval [1000ms]"
"TRACE","Thread-1","03/27/2026","22:16:05","","websocket-endpoint-factory","checking for new web context to register, current interval [1000ms]"
"TRACE","Thread-1","03/27/2026","22:16:06","","websocket-endpoint-factory","checking for new web context to register, current interval [1000ms]"
"TRACE","Thread-1","03/27/2026","22:16:07","","websocket-endpoint-factory","checking for new web context to register, current interval [1000ms]"
"TRACE","Thread-1","03/27/2026","22:16:08","","websocket-endpoint-factory","checking for new web context to register, current interval [1000ms]"
"INFO","ajp-nio-0:0:0:0:0:0:0:0-8069-exec-1","03/27/2026","22:16:09","https://dev.example.com:446","websocket-endpoint-factory","found configuration at  [/opt/lucee/tomcat/lucee-server/context/websocket.json]"
"INFO","ajp-nio-0:0:0:0:0:0:0:0-8069-exec-1","03/27/2026","22:16:09","https://dev.example.com:446","websocket-endpoint-factory","found [directory] setting in configuration, using [{lucee-config}/websockets/]"
"INFO","ajp-nio-0:0:0:0:0:0:0:0-8069-exec-1","03/27/2026","22:16:09","https://dev.example.com:446","websocket-endpoint-factory","component path is [{lucee-config}/websockets/] resolved [/opt/lucee/tomcat/lucee-server/context/websockets/]"
"INFO","ajp-nio-0:0:0:0:0:0:0:0-8069-exec-1","03/27/2026","22:16:09","https://dev.example.com:446","websocket-endpoint-factory","init WebSocketEndpoint for web context [5184b77bebf36ed4bb734a322d15e049 - /opt/lucee/tomcat/webapps/lucee/] mapping defined in the configuration is [{lucee-config}/websockets/], this is resolved to [/opt/lucee/tomcat/lucee-server/context/websockets]"
"TRACE","Thread-1","03/27/2026","22:16:09","","websocket-endpoint-factory","checking for new web context to register, current interval [1000ms]"
"INFO","https-jsse-nio-8443-exec-5","03/27/2026","22:16:09","","websocket-endpoint-factory","init WebSocketEndpoint"
"INFO","https-jsse-nio-8443-exec-5","03/27/2026","22:16:09","","websocket-endpoint-factory","Cannot invoke ""lucee.runtime.config.ConfigWeb.getIdentification()"" because ""cw"" is null;onError got involved for component [test2] with session id [0]java.lang.NullPointerException: Cannot invoke ""lucee.runtime.config.ConfigWeb.getIdentification()"" because ""cw"" is null
	at org.lucee.extension.websocket.WebSocketEndpointFactory.getOrCreateData(WebSocketEndpointFactory.java:82)
	at org.lucee.extension.websocket.WebSocketEndpointFactory.setSessions(WebSocketEndpointFactory.java:294)
	at org.lucee.extension.websocket.BaseWebSocketEndpoint.onOpen(BaseWebSocketEndpoint.java:105)
	at org.lucee.extension.websocket.JakartaWebSocketEndpoint.onOpen(JakartaWebSocketEndpoint.java:31)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source)
	at java.base/java.lang.reflect.Method.invoke(Unknown Source)
	at org.apache.tomcat.websocket.pojo.PojoEndpointBase.doOnOpen(PojoEndpointBase.java:67)
	at org.apache.tomcat.websocket.pojo.PojoEndpointServer.onOpen(PojoEndpointServer.java:46)
	at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.init(WsHttpUpgradeHandler.java:131)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:945)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1778)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:946)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:480)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:57)
	at java.base/java.lang.Thread.run(Unknown Source)
"
"INFO","https-jsse-nio-8443-exec-5","03/27/2026","22:16:09","","websocket-endpoint-factory","java.lang.reflect.InvocationTargetException;onError got involved for component [test2] with session id [0]java.lang.reflect.InvocationTargetException
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source)
	at java.base/java.lang.reflect.Method.invoke(Unknown Source)
	at org.apache.tomcat.websocket.pojo.PojoEndpointBase.onClose(PojoEndpointBase.java:101)
	at org.apache.tomcat.websocket.WsSession.fireEndpointOnClose(WsSession.java:718)
	at org.apache.tomcat.websocket.WsSession.doClose(WsSession.java:575)
	at org.apache.tomcat.websocket.WsSession.doClose(WsSession.java:541)
	at org.apache.tomcat.websocket.WsSession.close(WsSession.java:529)
	at org.apache.tomcat.websocket.WsSession.close(WsSession.java:523)
	at org.apache.tomcat.websocket.pojo.PojoEndpointBase.handleOnOpenOrCloseError(PojoEndpointBase.java:90)
	at org.apache.tomcat.websocket.pojo.PojoEndpointBase.doOnOpen(PojoEndpointBase.java:75)
	at org.apache.tomcat.websocket.pojo.PojoEndpointServer.onOpen(PojoEndpointServer.java:46)
	at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.init(WsHttpUpgradeHandler.java:131)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:945)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1778)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:946)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:480)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:57)
	at java.base/java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException: Cannot invoke ""lucee.runtime.config.ConfigWeb.getIdentification()"" because ""cw"" is null
	at org.lucee.extension.websocket.WebSocketEndpointFactory.getOrCreateData(WebSocketEndpointFactory.java:82)
	at org.lucee.extension.websocket.WebSocketEndpointFactory.getSessions(WebSocketEndpointFactory.java:290)
	at org.lucee.extension.websocket.BaseWebSocketEndpoint.onClose(BaseWebSocketEndpoint.java:281)
	at org.lucee.extension.websocket.JakartaWebSocketEndpoint.onClose(JakartaWebSocketEndpoint.java:46)
	... 19 more
"
"INFO","https-jsse-nio-8443-exec-5","03/27/2026","22:16:09","","websocket-endpoint-factory","onMessage got involved for component [test2] with session id [0]"
"INFO","https-jsse-nio-8443-exec-5","03/27/2026","22:16:09","","websocket-endpoint-factory","Cannot invoke ""lucee.runtime.config.ConfigWeb.getIdentification()"" because ""cw"" is null;onError got involved for component [test2] with session id [0]java.lang.NullPointerException: Cannot invoke ""lucee.runtime.config.ConfigWeb.getIdentification()"" because ""cw"" is null
	at org.lucee.extension.websocket.WebSocketEndpointFactory.getOrCreateData(WebSocketEndpointFactory.java:82)
	at org.lucee.extension.websocket.WebSocketEndpointFactory.getRequestTimeout(WebSocketEndpointFactory.java:302)
	at org.lucee.extension.websocket.util.WSUtil.createPageContext(WSUtil.java:355)
	at org.lucee.extension.websocket.BaseWebSocketEndpoint.onMessage(BaseWebSocketEndpoint.java:194)
	at org.lucee.extension.websocket.BaseWebSocketEndpoint.onMessage(BaseWebSocketEndpoint.java:190)
	at org.lucee.extension.websocket.JakartaWebSocketEndpoint.onMessage(JakartaWebSocketEndpoint.java:36)
	at java.base/jdk.internal.reflect.DirectMethodHandleAccessor.invoke(Unknown Source)
	at java.base/java.lang.reflect.Method.invoke(Unknown Source)
	at org.apache.tomcat.websocket.pojo.PojoMessageHandlerPartialBase.onMessage(PojoMessageHandlerPartialBase.java:67)
	at org.apache.tomcat.websocket.WsFrameBase.sendMessageText(WsFrameBase.java:389)
	at org.apache.tomcat.websocket.server.WsFrameServer.sendMessageText(WsFrameServer.java:130)
	at org.apache.tomcat.websocket.WsFrameBase.processDataText(WsFrameBase.java:486)
	at org.apache.tomcat.websocket.WsFrameBase.processData(WsFrameBase.java:286)
	at org.apache.tomcat.websocket.WsFrameBase.processInputBuffer(WsFrameBase.java:129)
	at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:85)
	at org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:184)
	at org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:164)
	at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:152)
	at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:60)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:57)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:903)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1778)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:946)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:480)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:57)
	at java.base/java.lang.Thread.run(Unknown Source)

Just for clarity, where it says Lucee needs to be restarted in the above log, I had already restarted Lucee. When I restart Tomcat the needing to restart Lucee goes away, but the websocket gives the error about “cw”.

And I just tried a Lucee restart, and the “cw” error goes away, but Lucee complains about needing to be restarted again.