Starter for using Jetty as the embedded servlet container in Spring Boot applications
—
Reactive web server implementation using Jetty for WebFlux applications. Provides non-blocking, reactive HTTP server capabilities optimized for high-concurrency applications with asynchronous I/O.
Creates and configures Jetty reactive web server instances for Spring WebFlux applications.
/**
* Factory for creating reactive Jetty web servers for WebFlux applications
*/
public class JettyReactiveWebServerFactory
extends AbstractReactiveWebServerFactory
implements ConfigurableJettyWebServerFactory {
/** Create factory with default configuration */
public JettyReactiveWebServerFactory();
/** Create factory with specified port */
public JettyReactiveWebServerFactory(int port);
/** Create reactive web server with HTTP handler */
public WebServer getWebServer(HttpHandler httpHandler);
/** Add server customizers for additional configuration */
public void addServerCustomizers(JettyServerCustomizer... customizers);
/** Get collection of configured server customizers */
public Collection<JettyServerCustomizer> getServerCustomizers();
/** Set number of acceptor threads */
public void setAcceptors(int acceptors);
/** Set number of selector threads */
public void setSelectors(int selectors);
/** Configure forward headers handling */
public void setUseForwardHeaders(boolean useForwardHeaders);
/** Set resource factory for HTTP client resources */
public void setResourceFactory(JettyResourceFactory resourceFactory);
/** Get the configured resource factory */
public JettyResourceFactory getResourceFactory();
/** Set maximum number of connections */
public void setMaxConnections(int maxConnections);
/** Set thread pool configuration */
public void setThreadPool(ThreadPool threadPool);
/** Get the configured thread pool */
public ThreadPool getThreadPool();
/** Set collection of server customizers */
public void setServerCustomizers(Collection<? extends JettyServerCustomizer> customizers);
}Usage Examples:
@Configuration
public class JettyReactiveConfig {
@Bean
public JettyReactiveWebServerFactory jettyReactiveWebServerFactory() {
JettyReactiveWebServerFactory factory = new JettyReactiveWebServerFactory(8080);
// Configure for high concurrency
factory.setAcceptors(1);
factory.setSelectors(8);
// Add custom server configuration
factory.addServerCustomizers(server -> {
// Configure HTTP/2 support
HTTP2ServerConnectionFactory h2 = new HTTP2ServerConnectionFactory(
new HttpConfiguration());
ServerConnector connector = new ServerConnector(server, h2);
connector.setPort(8080);
server.addConnector(connector);
});
return factory;
}
}Jetty resource factory for managing HTTP client and server resources efficiently.
/**
* Factory for managing Jetty HTTP client and server resources
*/
public class JettyResourceFactory implements DisposableBean, InitializingBean {
/** Create resource factory with default configuration */
public JettyResourceFactory();
/** Get the HTTP client instance */
public HttpClient getHttpClient();
/** Get the executor for async operations */
public Executor getExecutor();
/** Get the scheduler for timed operations */
public Scheduler getScheduler();
/** Get the byte buffer pool */
public ByteBufferPool getByteBufferPool();
/** Set custom thread pool */
public void setThreadPool(ThreadPool threadPool);
/** Set custom executor */
public void setExecutor(Executor executor);
/** Set custom scheduler */
public void setScheduler(Scheduler scheduler);
/** Set custom byte buffer pool */
public void setByteBufferPool(ByteBufferPool byteBufferPool);
/** Lifecycle method - initialize resources */
public void afterPropertiesSet() throws Exception;
/** Lifecycle method - destroy resources */
public void destroy() throws Exception;
}HTTP/2 protocol support is configured through server customizers and Jetty's connection factories.
HTTP/2 Configuration Example:
@Configuration
public class Http2Config {
@Bean
public JettyReactiveWebServerFactory jettyFactory() {
JettyReactiveWebServerFactory factory = new JettyReactiveWebServerFactory();
factory.addServerCustomizers(server -> {
HttpConfiguration httpConfig = new HttpConfiguration();
httpConfig.setSendServerVersion(false);
httpConfig.setSendXPoweredBy(false);
// HTTP/1.1 configuration
HttpConnectionFactory http1 = new HttpConnectionFactory(httpConfig);
// HTTP/2 configuration
HTTP2ServerConnectionFactory http2 = new HTTP2ServerConnectionFactory(httpConfig);
http2.setMaxConcurrentStreams(100);
http2.setInitialStreamRecvWindow(65536);
// ALPN configuration for protocol negotiation
ALPNServerConnectionFactory alpn = new ALPNServerConnectionFactory();
alpn.setDefaultProtocol("http/1.1");
ServerConnector connector = new ServerConnector(server, alpn, http2, http1);
connector.setPort(8080);
server.addConnector(connector);
});
return factory;
}
}Integration with Spring WebFlux HttpHandler for reactive request processing.
/**
* Jetty adapter for Spring WebFlux HttpHandler
*/
public class JettyHttpHandlerAdapter {
/** Create adapter for HTTP handler */
public JettyHttpHandlerAdapter(HttpHandler httpHandler);
/** Handle reactive HTTP requests */
public void handle(Request request, Response response, Callback callback);
/** Configure request and response buffer sizes */
public void setRequestBufferSize(int requestBufferSize);
public void setResponseBufferSize(int responseBufferSize);
}Lifecycle management for reactive Jetty servers.
/**
* Lifecycle management for reactive Jetty web servers
*/
public class JettyWebServer implements WebServer {
/** Start the reactive server */
public void start() throws WebServerException;
/** Stop the server gracefully */
public void stop() throws WebServerException;
/** Get the server port */
public int getPort();
/** Get the underlying Jetty server */
public Server getServer();
/** Graceful shutdown with callback */
public void shutDownGracefully(GracefulShutdownCallback callback);
}Reactive Application Example:
@SpringBootApplication
public class ReactiveJettyApplication {
public static void main(String[] args) {
SpringApplication.run(ReactiveJettyApplication.class, args);
}
@Bean
public RouterFunction<ServerResponse> routes() {
return RouterFunctions.route()
.GET("/hello", request ->
ServerResponse.ok()
.contentType(MediaType.TEXT_PLAIN)
.body(Mono.just("Hello from Jetty!"), String.class))
.build();
}
}Install with Tessl CLI
npx tessl i tessl/maven-org-springframework-boot--spring-boot-starter-jetty