atmosphere icon indicating copy to clipboard operation
atmosphere copied to clipboard

JSR356AsyncSupport not working with Jetty 12

Open giulio-biondo opened this issue 1 month ago • 6 comments

Describe the bug I'm moving my application from running on Java 8 with Atmosphere 2.7.9 and Jetty 9.4 to running on Java 17 with Atmosphere 3.0.8 and Jetty 12.0.9 but I'm getting the exception Unable to configure jsr356 at that stage. ServerContainer is null on startup

Atmosphere Info

  • version 3.0.8
  • atmosphere.js version NONE
  • extensions used NONE

Expected behavior The websocket connection should work as when using the old versions

Systems (please complete the following information):

  • OS: Rocky Linux 9 and Windows 11
  • Browser name and version; Postman v11.1.14
  • Java version and distribution JDK 17 (Oracle)
  • Serveur name and version Jetty 12.0.9

Additional context I'm running the following code:

  • App.java
package com.test;

import org.atmosphere.container.JSR356AsyncSupport;
import org.atmosphere.cpr.ApplicationConfig;
import org.atmosphere.cpr.AtmosphereServlet;
import org.eclipse.jetty.ee10.servlet.ServletContextHandler;
import org.eclipse.jetty.ee10.servlet.ServletHolder;
import org.eclipse.jetty.server.Server;

public class App
{
	public static void main( final String[] args )
	{
		final Server myServer = new Server(8080);
		final ServletContextHandler myCtx = new ServletContextHandler("/");
		myServer.setHandler(myCtx);
		//		JakartaWebSocketServletContainerInitializer.configure(myCtx, null);

		try {
			myServer.setStopAtShutdown(true);
			myServer.start();

			final AtmosphereServlet myServlet = new AtmosphereServlet();
			final ServletHolder myHolder = new ServletHolder(myServlet);
			myHolder.setInitParameter(ApplicationConfig.ANNOTATION_PACKAGE, "com.test");
			myHolder.setInitParameter(ApplicationConfig.WEBSOCKET_CONTENT_TYPE, "application/json");
			myHolder.setInitParameter(ApplicationConfig.PROPERTY_COMET_SUPPORT, JSR356AsyncSupport.class.getName());
			myHolder.setInitParameter(ApplicationConfig.PROPERTY_NATIVE_COMETSUPPORT, "false");
			//			myHolder.setInitParameter(ApplicationConfig.JSR356_MAPPING_PATH, "/ws/");
			myHolder.setAsyncSupported(true);
			myCtx.addServlet(myHolder, "/ws/*");
			//			myServlet.framework().addAtmosphereHandler("/ws/test", new WSHandler());

			myServer.join();
		}
		catch (final Exception e) {
			e.printStackTrace();
		}
	}
}
  • WSHandler.java:
package com.test;

import java.io.IOException;

import org.atmosphere.config.service.AtmosphereHandlerService;
import org.atmosphere.cpr.AtmosphereHandler;
import org.atmosphere.cpr.AtmosphereResource;
import org.atmosphere.cpr.AtmosphereResourceEvent;
import org.atmosphere.cpr.Broadcaster;

import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;

@AtmosphereHandlerService(path = "/ws/test")
public class WSHandler implements AtmosphereHandler {

	@Override
	public void onRequest(final AtmosphereResource r) throws IOException {
		final HttpServletRequest req = r.getRequest();
		final HttpServletResponse res = r.getResponse();
		if(req.getMethod().equalsIgnoreCase("GET")) {
			res.setCharacterEncoding("utf-8");
			r.suspend();
		}
		else if(req.getMethod().equalsIgnoreCase("POST")) {
			final String msg = req.getReader().readLine();
			r.getBroadcaster().broadcast(msg);
		}
		res.getWriter().flush();
	}

	@Override
	public void onStateChange(final AtmosphereResourceEvent event) throws IOException {
		final AtmosphereResource r = event.getResource();
		final HttpServletRequest req = r.getRequest();
		final HttpServletResponse res = r.getResponse();

		if(event.isCancelled() || r.isCancelled()) {

		}
		else if(r.isSuspended()) {
			final String body = event.getMessage() != null ? event.getMessage().toString() : null;
			if (body != null)
				res.getWriter().write(body);

			switch(r.transport()) {
			case JSONP:
			case LONG_POLLING:
				event.getResource().resume();
				break;
			case WEBSOCKET:
			case STREAMING:
				res.getWriter().flush();
				break;
			default:
				System.out.println("Unknown transport: " + r.transport());
				break;
			}
		}
		else if(!event.isResuming()) {
			final Broadcaster b = r.getBroadcaster();
			b.broadcast("");
		}
	}

	@Override
	public void destroy() {
	}
}
  • pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.test</groupId>
   <artifactId>zzz-ws-tester</artifactId>
   <version>0.0.1</version>
   <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <maven.compiler.release>17</maven.compiler.release>
      <atmosphere-runtime.version>3.0.8</atmosphere-runtime.version>
      <jetty.version>12.0.9</jetty.version>
      <logback.version>1.5.6</logback.version>
      <slf4j.version>2.0.13</slf4j.version>
      <websocket-api.version>2.0.0</websocket-api.version>
      <maven-compiler-plugin.version>3.13.0</maven-compiler-plugin.version>
      <maven-jar-plugin.version>3.4.1</maven-jar-plugin.version>
      <maven-surefire-plugin.version>3.2.5</maven-surefire-plugin.version>
   </properties>
   <dependencies>
      <dependency>
         <groupId>org.atmosphere</groupId>
         <artifactId>atmosphere-runtime</artifactId>
         <version>${atmosphere-runtime.version}</version>
      </dependency>
      <dependency>
         <groupId>org.eclipse.jetty</groupId>
         <artifactId>jetty-server</artifactId>
         <version>${jetty.version}</version>
      </dependency>
      <dependency>
         <groupId>org.eclipse.jetty.ee10</groupId>
         <artifactId>jetty-ee10-servlet</artifactId>
         <version>${jetty.version}</version>
      </dependency>
<!--
      <dependency>
         <groupId>org.eclipse.jetty.websocket</groupId>
         <artifactId>jetty-websocket-jetty-server</artifactId>
         <version>${jetty.version}</version>
         <scope>runtime</scope>
      </dependency>
-->
      <dependency>
         <groupId>org.eclipse.jetty.ee10.websocket</groupId>
         <artifactId>jetty-ee10-websocket-jakarta-server</artifactId>
         <version>${jetty.version}</version>
         <scope>runtime</scope>
      </dependency>
      <dependency>
         <groupId>ch.qos.logback</groupId>
         <artifactId>logback-classic</artifactId>
         <version>${logback.version}</version>
         <scope>runtime</scope>
      </dependency>
      <dependency>
         <groupId>ch.qos.logback</groupId>
         <artifactId>logback-core</artifactId>
         <version>${logback.version}</version>
         <scope>runtime</scope>
      </dependency>
      <dependency>
         <groupId>org.slf4j</groupId>
         <artifactId>slf4j-api</artifactId>
         <version>${slf4j.version}</version>
      </dependency>
      <dependency>
         <groupId>jakarta.websocket</groupId>
         <artifactId>jakarta.websocket-api</artifactId>
         <version>${websocket-api.version}</version>
      </dependency>
   </dependencies>
   <build>
      <pluginManagement>
         <plugins>
            <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-compiler-plugin</artifactId>
               <version>${maven-compiler-plugin.version}</version>
            </plugin>
            <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-jar-plugin</artifactId>
               <version>${maven-jar-plugin.version}</version>
            </plugin>
            <plugin>
               <groupId>org.apache.maven.plugins</groupId>
               <artifactId>maven-surefire-plugin</artifactId>
               <version>${maven-surefire-plugin.version}</version>
            </plugin>
         </plugins>
      </pluginManagement>
   </build>
</project>

When I start the application i get the following:

2024-06-04 12:16:11.447 [main] ERROR org.atmosphere.cpr.DefaultAsyncSupportResolver.newCometSupport - Failed to create AsyncSupport class: org.atmosphere.container.JSR356AsyncSupport, error: {}
java.lang.reflect.InvocationTargetException: null
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
	at org.atmosphere.cpr.DefaultAsyncSupportResolver.newCometSupport(DefaultAsyncSupportResolver.java:142)
	at org.atmosphere.cpr.AtmosphereFramework.doInitParams(AtmosphereFramework.java:1440)
	at org.atmosphere.cpr.AtmosphereFramework.doInitParams(AtmosphereFramework.java:1415)
	at org.atmosphere.cpr.AtmosphereFramework.init(AtmosphereFramework.java:872)
	at org.atmosphere.cpr.AtmosphereFramework.init(AtmosphereFramework.java:832)
	at org.atmosphere.cpr.AtmosphereFrameworkInitializer.configureFramework(AtmosphereFrameworkInitializer.java:76)
	at org.atmosphere.cpr.AtmosphereServlet.configureFramework(AtmosphereServlet.java:83)
	at org.atmosphere.cpr.AtmosphereServlet.configureFramework(AtmosphereServlet.java:79)
	at org.atmosphere.cpr.AtmosphereServlet.init(AtmosphereServlet.java:74)
	at org.eclipse.jetty.ee10.servlet.ServletHolder.initServlet(ServletHolder.java:637)
	at org.eclipse.jetty.ee10.servlet.ServletHolder.initialize(ServletHolder.java:424)
	at org.eclipse.jetty.ee10.servlet.ServletHandler.initializeHolders(ServletHandler.java:705)
	at org.eclipse.jetty.ee10.servlet.ServletHandler.setServlets(ServletHandler.java:1430)
	at org.eclipse.jetty.ee10.servlet.ServletHandler.addServletWithMapping(ServletHandler.java:811)
	at org.eclipse.jetty.ee10.servlet.ServletContextHandler.addServlet(ServletContextHandler.java:1402)
	at com.test.App.main(App.java:35)
Caused by: java.lang.IllegalStateException: Unable to configure jsr356 at that stage. ServerContainer is null
	at org.atmosphere.container.JSR356AsyncSupport.<init>(JSR356AsyncSupport.java:58)
	at org.atmosphere.container.JSR356AsyncSupport.<init>(JSR356AsyncSupport.java:47)
	... 21 common frames omitted
2024-06-04 12:16:11.454 [main] ERROR org.atmosphere.cpr.DefaultAsyncSupportResolver.newCometSupport - Real error: Unable to configure jsr356 at that stage. ServerContainer is null
java.lang.IllegalStateException: Unable to configure jsr356 at that stage. ServerContainer is null
	at org.atmosphere.container.JSR356AsyncSupport.<init>(JSR356AsyncSupport.java:58)
	at org.atmosphere.container.JSR356AsyncSupport.<init>(JSR356AsyncSupport.java:47)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
	at org.atmosphere.cpr.DefaultAsyncSupportResolver.newCometSupport(DefaultAsyncSupportResolver.java:142)
	at org.atmosphere.cpr.AtmosphereFramework.doInitParams(AtmosphereFramework.java:1440)
	at org.atmosphere.cpr.AtmosphereFramework.doInitParams(AtmosphereFramework.java:1415)
	at org.atmosphere.cpr.AtmosphereFramework.init(AtmosphereFramework.java:872)
	at org.atmosphere.cpr.AtmosphereFramework.init(AtmosphereFramework.java:832)
	at org.atmosphere.cpr.AtmosphereFrameworkInitializer.configureFramework(AtmosphereFrameworkInitializer.java:76)
	at org.atmosphere.cpr.AtmosphereServlet.configureFramework(AtmosphereServlet.java:83)
	at org.atmosphere.cpr.AtmosphereServlet.configureFramework(AtmosphereServlet.java:79)
	at org.atmosphere.cpr.AtmosphereServlet.init(AtmosphereServlet.java:74)
	at org.eclipse.jetty.ee10.servlet.ServletHolder.initServlet(ServletHolder.java:637)
	at org.eclipse.jetty.ee10.servlet.ServletHolder.initialize(ServletHolder.java:424)
	at org.eclipse.jetty.ee10.servlet.ServletHandler.initializeHolders(ServletHandler.java:705)
	at org.eclipse.jetty.ee10.servlet.ServletHandler.setServlets(ServletHandler.java:1430)
	at org.eclipse.jetty.ee10.servlet.ServletHandler.addServletWithMapping(ServletHandler.java:811)
	at org.eclipse.jetty.ee10.servlet.ServletContextHandler.addServlet(ServletContextHandler.java:1402)
	at com.test.App.main(App.java:35)
2024-06-04 12:16:11.454 [main] ERROR org.atmosphere.cpr.AtmosphereFramework.init - Failed to initialize Atmosphere Framework
java.lang.IllegalArgumentException: Unable to create org.atmosphere.container.JSR356AsyncSupport
	at org.atmosphere.cpr.DefaultAsyncSupportResolver.newCometSupport(DefaultAsyncSupportResolver.java:149)
	at org.atmosphere.cpr.AtmosphereFramework.doInitParams(AtmosphereFramework.java:1440)
	at org.atmosphere.cpr.AtmosphereFramework.doInitParams(AtmosphereFramework.java:1415)
	at org.atmosphere.cpr.AtmosphereFramework.init(AtmosphereFramework.java:872)
	at org.atmosphere.cpr.AtmosphereFramework.init(AtmosphereFramework.java:832)
	at org.atmosphere.cpr.AtmosphereFrameworkInitializer.configureFramework(AtmosphereFrameworkInitializer.java:76)
	at org.atmosphere.cpr.AtmosphereServlet.configureFramework(AtmosphereServlet.java:83)
	at org.atmosphere.cpr.AtmosphereServlet.configureFramework(AtmosphereServlet.java:79)
	at org.atmosphere.cpr.AtmosphereServlet.init(AtmosphereServlet.java:74)
	at org.eclipse.jetty.ee10.servlet.ServletHolder.initServlet(ServletHolder.java:637)
	at org.eclipse.jetty.ee10.servlet.ServletHolder.initialize(ServletHolder.java:424)
	at org.eclipse.jetty.ee10.servlet.ServletHandler.initializeHolders(ServletHandler.java:705)
	at org.eclipse.jetty.ee10.servlet.ServletHandler.setServlets(ServletHandler.java:1430)
	at org.eclipse.jetty.ee10.servlet.ServletHandler.addServletWithMapping(ServletHandler.java:811)
	at org.eclipse.jetty.ee10.servlet.ServletContextHandler.addServlet(ServletContextHandler.java:1402)
	at com.test.App.main(App.java:35)
Caused by: java.lang.reflect.InvocationTargetException: null
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
	at org.atmosphere.cpr.DefaultAsyncSupportResolver.newCometSupport(DefaultAsyncSupportResolver.java:142)
	... 15 common frames omitted
Caused by: java.lang.IllegalStateException: Unable to configure jsr356 at that stage. ServerContainer is null
	at org.atmosphere.container.JSR356AsyncSupport.<init>(JSR356AsyncSupport.java:58)
	at org.atmosphere.container.JSR356AsyncSupport.<init>(JSR356AsyncSupport.java:47)
	... 21 common frames omitted
2024-06-04 12:16:11.455 [main] WARN  org.eclipse.jetty.server.handler.ContextHandler.ROOT.log - unavailable
java.lang.IllegalArgumentException: Unable to create org.atmosphere.container.JSR356AsyncSupport
	at org.atmosphere.cpr.DefaultAsyncSupportResolver.newCometSupport(DefaultAsyncSupportResolver.java:149)
	at org.atmosphere.cpr.AtmosphereFramework.doInitParams(AtmosphereFramework.java:1440)
	at org.atmosphere.cpr.AtmosphereFramework.doInitParams(AtmosphereFramework.java:1415)
	at org.atmosphere.cpr.AtmosphereFramework.init(AtmosphereFramework.java:872)
	at org.atmosphere.cpr.AtmosphereFramework.init(AtmosphereFramework.java:832)
	at org.atmosphere.cpr.AtmosphereFrameworkInitializer.configureFramework(AtmosphereFrameworkInitializer.java:76)
	at org.atmosphere.cpr.AtmosphereServlet.configureFramework(AtmosphereServlet.java:83)
	at org.atmosphere.cpr.AtmosphereServlet.configureFramework(AtmosphereServlet.java:79)
	at org.atmosphere.cpr.AtmosphereServlet.init(AtmosphereServlet.java:74)
	at org.eclipse.jetty.ee10.servlet.ServletHolder.initServlet(ServletHolder.java:637)
	at org.eclipse.jetty.ee10.servlet.ServletHolder.initialize(ServletHolder.java:424)
	at org.eclipse.jetty.ee10.servlet.ServletHandler.initializeHolders(ServletHandler.java:705)
	at org.eclipse.jetty.ee10.servlet.ServletHandler.setServlets(ServletHandler.java:1430)
	at org.eclipse.jetty.ee10.servlet.ServletHandler.addServletWithMapping(ServletHandler.java:811)
	at org.eclipse.jetty.ee10.servlet.ServletContextHandler.addServlet(ServletContextHandler.java:1402)
	at com.test.App.main(App.java:35)
Caused by: java.lang.reflect.InvocationTargetException: null
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
	at org.atmosphere.cpr.DefaultAsyncSupportResolver.newCometSupport(DefaultAsyncSupportResolver.java:142)
	... 15 common frames omitted
Caused by: java.lang.IllegalStateException: Unable to configure jsr356 at that stage. ServerContainer is null
	at org.atmosphere.container.JSR356AsyncSupport.<init>(JSR356AsyncSupport.java:58)
	at org.atmosphere.container.JSR356AsyncSupport.<init>(JSR356AsyncSupport.java:47)
	... 21 common frames omitted
java.lang.RuntimeException: jakarta.servlet.ServletException: java.lang.IllegalArgumentException: Unable to create org.atmosphere.container.JSR356AsyncSupport
	at org.eclipse.jetty.ee10.servlet.ServletHandler.initializeHolders(ServletHandler.java:710)
	at org.eclipse.jetty.ee10.servlet.ServletHandler.setServlets(ServletHandler.java:1430)
	at org.eclipse.jetty.ee10.servlet.ServletHandler.addServletWithMapping(ServletHandler.java:811)
	at org.eclipse.jetty.ee10.servlet.ServletContextHandler.addServlet(ServletContextHandler.java:1402)
	at com.test.App.main(App.java:35)
Caused by: jakarta.servlet.ServletException: java.lang.IllegalArgumentException: Unable to create org.atmosphere.container.JSR356AsyncSupport
	at org.atmosphere.cpr.AtmosphereFramework.init(AtmosphereFramework.java:945)
	at org.atmosphere.cpr.AtmosphereFramework.init(AtmosphereFramework.java:832)
	at org.atmosphere.cpr.AtmosphereFrameworkInitializer.configureFramework(AtmosphereFrameworkInitializer.java:76)
	at org.atmosphere.cpr.AtmosphereServlet.configureFramework(AtmosphereServlet.java:83)
	at org.atmosphere.cpr.AtmosphereServlet.configureFramework(AtmosphereServlet.java:79)
	at org.atmosphere.cpr.AtmosphereServlet.init(AtmosphereServlet.java:74)
	at org.eclipse.jetty.ee10.servlet.ServletHolder.initServlet(ServletHolder.java:637)
	at org.eclipse.jetty.ee10.servlet.ServletHolder.initialize(ServletHolder.java:424)
	at org.eclipse.jetty.ee10.servlet.ServletHandler.initializeHolders(ServletHandler.java:705)
	... 4 more
Caused by: java.lang.IllegalArgumentException: Unable to create org.atmosphere.container.JSR356AsyncSupport
	at org.atmosphere.cpr.DefaultAsyncSupportResolver.newCometSupport(DefaultAsyncSupportResolver.java:149)
	at org.atmosphere.cpr.AtmosphereFramework.doInitParams(AtmosphereFramework.java:1440)
	at org.atmosphere.cpr.AtmosphereFramework.doInitParams(AtmosphereFramework.java:1415)
	at org.atmosphere.cpr.AtmosphereFramework.init(AtmosphereFramework.java:872)
	... 12 more
Caused by: java.lang.reflect.InvocationTargetException
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.base/java.lang.reflect.Constructor.newInstanceWithCaller(Constructor.java:499)
	at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:480)
	at org.atmosphere.cpr.DefaultAsyncSupportResolver.newCometSupport(DefaultAsyncSupportResolver.java:142)
	... 15 more
Caused by: java.lang.IllegalStateException: Unable to configure jsr356 at that stage. ServerContainer is null
	at org.atmosphere.container.JSR356AsyncSupport.<init>(JSR356AsyncSupport.java:58)
	at org.atmosphere.container.JSR356AsyncSupport.<init>(JSR356AsyncSupport.java:47)
	... 21 more
`

I also tried setting the `JSR356_MAPPING_PATH` init parameter explicitly but nothing changed.
I tried with both jetty-websocket-jetty-server and jetty-ee10-websocket-jakarta-server, but nothing changes

giulio-biondo avatar Jun 04 '24 10:06 giulio-biondo