Spring Boot New in 4.0
4.0.2+Auto-configured servlet, Spring DI bridge, and Actuator health indicator.
atmosphere-spring-boot-starter atmosphere:
packages: com.example.chat A battle-tested, enterprise-grade real-time framework for Java. Virtual Threads, WebSockets, SSE, and graceful fallbacks—with first-class Spring Boot 4, Quarkus 3, and Servlet starters. Built-in Rooms, Presence, AI/LLM streaming, Kotlin DSL, and Kafka/Redis clustering.
Zero-configuration starters for the frameworks you already use.
Same @ManagedService API everywhere — your handlers are portable.
Auto-configured servlet, Spring DI bridge, and Actuator health indicator.
atmosphere-spring-boot-starter atmosphere:
packages: com.example.chat Build-time annotation scanning, Arc CDI, and WebSocket support.
atmosphere-quarkus-extension quarkus.atmosphere.packages=\
com.example.chat Tomcat, Jetty, Undertow, GlassFish, Payara — any Servlet 6.0+ (Jakarta EE) container.
atmosphere-runtime A complete toolkit for building scalable, real-time applications on the JVM.
Every connection runs on a JDK 21 virtual thread. Massive scalability with no thread-pool tuning.
First-class WebSocket with automatic degradation to SSE and long-polling. Heartbeats and reconnection built in.
Built-in room management with presence tracking, message history, and authorization. No external dependencies.
Define endpoints with @ManagedService or @RoomService. Handle lifecycle with @Ready, @Message, @Disconnect. Kotlin DSL available.
Scale across nodes with built-in Kafka and Redis broadcasters. Open source, no commercial add-ons required.
Stream LLM tokens over WebSocket. MCP server for AI agents. Adapters for Spring AI, LangChain4j, and Embabel.
Write real-time applications with clean, annotation-based Java on the server and intuitive JavaScript on the client.
import org.atmosphere.config.service.*;
import jakarta.inject.Inject;
@ManagedService(path = "/chat")
public class Chat {
@Inject
private AtmosphereResource r;
@Ready
public void onReady() {
log.info("Connected: {}", r.uuid());
}
@Message(encoders = {JacksonEncoder.class},
decoders = {JacksonDecoder.class})
public Message onMessage(Message message) {
return message; // broadcast to all
}
} import { atmosphere } from 'atmosphere.js';
const sub = await atmosphere.subscribe(
{
url: '/chat',
transport: 'websocket',
fallbackTransport: 'long-polling',
},
{
open: (res) => console.log('Connected via', res.transport),
message: (res) => console.log('Received:', res.responseBody),
}
);
sub.push(JSON.stringify({ text: 'Hello!' }));
Reactive bindings for React, Vue, and Svelte. One useAtmosphere call
gives you connection state, incoming data, and a push function—no boilerplate.
import { useAtmosphere } from 'atmosphere.js/react';
export default function Chat() {
const { data, push, status } = useAtmosphere({
url: '/chat',
transport: 'websocket',
});
return (
<div>
<p>Status: {status}</p>
<ul>{data.map(m => <li>{m}</li>)}</ul>
<button onClick={() => push('Hello!')}>Send</button>
</div>
);
} <script setup>
import { useAtmosphere } from 'atmosphere.js/vue';
const { data, push, status } = useAtmosphere({
url: '/chat',
transport: 'websocket',
});
</script>
<template>
<p>Status: {{ status }}</p>
<ul><li v-for="m in data">{{ m }}</li></ul>
<button @click="push('Hello!')">Send</button>
</template> <script>
import { useAtmosphere } from 'atmosphere.js/svelte';
const { data, push, status } = useAtmosphere({
url: '/chat',
transport: 'websocket',
});
</script>
<p>Status: {$status}</p>
{#each $data as m}
<li>{m}</li>
{/each}
<button on:click={() => push('Hello!')}>Send</button> Scale your real-time applications across multiple nodes with open-source Kafka and Redis broadcasters. Messages sent on any node are automatically delivered to clients connected to all other nodes.
Get support from the core team with fast response times. Meet your production schedule and compliance requirements.