Websocket Extention 3.0.0.18 on Lucee 7 does not seem to work

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.