Skip to content

Migrating from 2.x to 4.0

Atmosphere 4.0 is a major release with significant changes from 2.x. This chapter covers what changed, what was removed, and how to migrate step by step.

Area2.x4.0
Java versionJDK 8+JDK 21+
Servlet APIjavax.servletjakarta.servlet (Jakarta EE 10+)
Dependency injectionjavax.injectjakarta.inject
Client libraryatmosphere.js (JavaScript)atmosphere.js 5.0 (TypeScript)
Chat/groupsManual Broadcaster managementFirst-class Rooms API
Spring BootSpring Boot 2.x (community)Spring Boot 4.0 (official starter)
QuarkusNot supportedOfficial extension

All javax.* packages are now jakarta.*:

2.x
import javax.inject.Inject;
import javax.servlet.http.HttpServletRequest;
// 4.0
import jakarta.inject.Inject;
import jakarta.servlet.http.HttpServletRequest;

The core annotation model is the same. Your @ManagedService classes work with minimal changes:

// Same in both 2.x and 4.0
@ManagedService(path = "/chat")
public class Chat {
@Ready
public void onReady() { }
@Disconnect
public void onDisconnect() { }
@Message(encoders = {JacksonEncoder.class}, decoders = {JacksonDecoder.class})
public Message onMessage(Message message) { return message; }
}

The following have been removed or replaced in 4.0:

RemovedReplacement
Jersey integrationUse @ManagedService or Spring Boot
GWT supportUse atmosphere.js 5.0
Socket.IO protocolUse atmosphere.js 5.0
Cometd protocolUse atmosphere.js 5.0
SwaggerSocketRemoved
Meteor APIUse @ManagedService
@MeteorServiceUse @ManagedService
web.xml-only configStill supported, but annotation-based is preferred
atmosphere-javascriptReplaced by atmosphere.js 5.0 (TypeScript, zero dependencies)
FeatureDescription
RoomsNamed groups with presence, history, direct messaging
RoomManagerCreate/manage rooms backed by Broadcasters
PresenceEventJoin/leave tracking with member identity
RoomMemberApplication-level member ID (stable across reconnects)
RoomAuthorizerAuthorization for room operations
Framework hooksReact useRoom, Vue useRoom, Svelte createRoomStore
Spring Boot 4.0 starterAuto-configuration, health, metrics
Quarkus extensionBuild-time processing, native image support
var socket = atmosphere;
var request = {
url: '/chat',
transport: 'websocket',
fallbackTransport: 'long-polling'
};
request.onMessage = function(response) {
var message = response.responseBody;
};
var subSocket = socket.subscribe(request);
subSocket.push(JSON.stringify(data));
import { Atmosphere } from 'atmosphere.js';
const atm = new Atmosphere();
const sub = await atm.subscribe(
{
url: '/chat',
transport: 'websocket',
fallbackTransport: 'long-polling',
},
{
message: (response) => {
const data = JSON.parse(response.responseBody);
},
}
);
sub.push(JSON.stringify(data));

The global atmosphere object is still available for <script> tag usage (no build step):

const sub = await atmosphere.atmosphere.subscribe(request, handlers);
  1. Update JDK to 21+
  2. Replace javax.* imports with jakarta.*
  3. Update atmosphere-runtime dependency to 4.0.0
  4. Replace Jersey/Meteor code with @ManagedService (if not already using it)
  5. Replace atmosphere-javascript with atmosphere.js 5.0
  6. Optionally adopt Rooms for group messaging patterns
  7. Optionally adopt Spring Boot starter or Quarkus extension

Update the web-app namespace for Jakarta EE:

<!-- 2.x -->
<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="3.0">
<!-- 4.0 -->
<web-app xmlns="https://jakarta.ee/xml/ns/jakartaee" version="6.0">

The AtmosphereServlet class name is unchanged: org.atmosphere.cpr.AtmosphereServlet.