Starter for building RSocket clients and servers with Spring Boot auto-configuration.
—
Comprehensive auto-configuration for RSocket infrastructure, providing automatic setup of codecs, servers, clients, and messaging handlers based on classpath detection and configuration properties.
Automatically configures RSocketStrategies bean providing encoding/decoding infrastructure for RSocket payloads.
/**
* Auto-configures RSocketStrategies with CBOR and JSON codecs
*/
@AutoConfiguration(after = JacksonAutoConfiguration.class)
@ConditionalOnClass({ io.rsocket.RSocket.class, RSocketStrategies.class, PooledByteBufAllocator.class })
class RSocketStrategiesAutoConfiguration {
@Bean
@ConditionalOnMissingBean
RSocketStrategies rSocketStrategies(ObjectProvider<RSocketStrategiesCustomizer> customizers);
@Bean
@Order(0)
@ConditionalOnBean(Jackson2ObjectMapperBuilder.class)
RSocketStrategiesCustomizer jacksonCborRSocketStrategyCustomizer(Jackson2ObjectMapperBuilder builder);
@Bean
@Order(1)
@ConditionalOnBean(ObjectMapper.class)
RSocketStrategiesCustomizer jacksonJsonRSocketStrategyCustomizer(ObjectMapper objectMapper);
}Default Codec Order:
Usage Example:
@Component
public class CustomCodecConfiguration {
@Bean
@Order(-1) // Higher priority than defaults
public RSocketStrategiesCustomizer customCodecCustomizer() {
return strategies -> {
strategies.encoder(new MyCustomEncoder());
strategies.decoder(new MyCustomDecoder());
};
}
}Automatically configures RSocket server infrastructure supporting both standalone servers and WebFlux integration.
/**
* Auto-configures RSocket server based on application type and properties
*/
@AutoConfiguration(after = RSocketStrategiesAutoConfiguration.class)
@ConditionalOnClass({ RSocketServer.class, RSocketStrategies.class, HttpServer.class, TcpServerTransport.class })
@ConditionalOnBean(RSocketMessageHandler.class)
@EnableConfigurationProperties(RSocketProperties.class)
class RSocketServerAutoConfiguration {
// WebFlux integration configuration
@Conditional(OnRSocketWebServerCondition.class)
@Configuration
static class WebFluxServerConfiguration {
@Bean
@ConditionalOnMissingBean
RSocketWebSocketNettyRouteProvider rSocketWebsocketRouteProvider(
RSocketProperties properties,
RSocketMessageHandler messageHandler,
ObjectProvider<RSocketServerCustomizer> customizers
);
}
// Standalone server configuration
@ConditionalOnProperty(prefix = "spring.rsocket.server", name = "port")
@Configuration
static class EmbeddedServerConfiguration {
@Bean
@ConditionalOnMissingBean
RSocketServerFactory rSocketServerFactory(
RSocketProperties properties,
ReactorResourceFactory resourceFactory,
ObjectProvider<RSocketServerCustomizer> customizers
);
@Bean
@ConditionalOnMissingBean
RSocketServerBootstrap rSocketServerBootstrap(
RSocketServerFactory rSocketServerFactory,
RSocketMessageHandler rSocketMessageHandler
);
@Bean
RSocketServerCustomizer frameDecoderRSocketServerCustomizer(
RSocketMessageHandler rSocketMessageHandler
);
}
}Server Configuration Conditions:
Automatically configures RSocketRequester.Builder for client connections.
/**
* Auto-configures prototype RSocketRequester.Builder beans
*/
@AutoConfiguration(after = RSocketStrategiesAutoConfiguration.class)
@ConditionalOnClass({ RSocketRequester.class, io.rsocket.RSocket.class, HttpServer.class, TcpServerTransport.class })
class RSocketRequesterAutoConfiguration {
@Bean
@Scope("prototype")
@ConditionalOnMissingBean
RSocketRequester.Builder rSocketRequesterBuilder(
RSocketStrategies strategies,
ObjectProvider<RSocketConnectorConfigurer> connectorConfigurers
);
}Usage Example:
@Service
public class RSocketClientService {
private final RSocketRequester.Builder requesterBuilder;
public RSocketClientService(RSocketRequester.Builder requesterBuilder) {
this.requesterBuilder = requesterBuilder; // New instance per injection
}
public Mono<String> makeRequest() {
return requesterBuilder
.tcp("localhost", 9898)
.route("greeting")
.data("Hello")
.retrieveMono(String.class);
}
}Automatically configures Spring messaging support for RSocket with @MessageMapping annotations.
/**
* Auto-configures RSocketMessageHandler for Spring messaging integration
*/
@AutoConfiguration(after = RSocketStrategiesAutoConfiguration.class)
@ConditionalOnClass({ RSocketRequester.class, io.rsocket.RSocket.class, TcpServerTransport.class })
class RSocketMessagingAutoConfiguration {
@Bean
@ConditionalOnMissingBean
RSocketMessageHandler messageHandler(
RSocketStrategies rSocketStrategies,
ObjectProvider<RSocketMessageHandlerCustomizer> customizers
);
}Usage Example:
@Controller
public class MessagingController {
@MessageMapping("user.{id}")
public Mono<User> getUser(@DestinationVariable String id) {
return userService.findById(id);
}
@MessageMapping("notifications")
public Flux<Notification> streamNotifications() {
return notificationService.stream();
}
}The auto-configuration uses several conditional annotations to enable features:
@ConditionalOnClass: Activates when specific classes are on classpathio.rsocket.RSocket, RSocketServer)RSocketRequester, RSocketStrategies)HttpServer, TcpServerTransport)@ConditionalOnBean(RSocketMessageHandler.class): Server config requires message handler@ConditionalOnMissingBean: Provides default beans when none exist@ConditionalOnProperty("spring.rsocket.server.port"): Standalone server needs port@ConditionalOnWebApplication(Type.REACTIVE): WebSocket integration for reactive appsOnRSocketWebServerCondition: Complex condition for WebSocket server integrationAll auto-configuration supports customization through various customizer interfaces:
// Customize RSocket strategies (codecs, routing)
@Component
class MyStrategiesCustomizer implements RSocketStrategiesCustomizer {
@Override
public void customize(RSocketStrategies.Builder strategies) {
strategies.encoder(myEncoder);
strategies.decoder(myDecoder);
}
}
// Customize message handler
@Component
class MyMessageHandlerCustomizer implements RSocketMessageHandlerCustomizer {
@Override
public void customize(RSocketMessageHandler messageHandler) {
messageHandler.setDefaultDataMimeType(MimeTypeUtils.APPLICATION_CBOR);
}
}
// Customize server configuration
@Component
class MyServerCustomizer implements RSocketServerCustomizer {
@Override
public void customize(RSocketServer server) {
server.payloadDecoder(PayloadDecoder.ZERO_COPY);
}
}Install with Tessl CLI
npx tessl i tessl/maven-org-springframework-boot--spring-boot-starter-rsocket