CtrlK
BlogDocsLog inGet started
Tessl Logo

tessl/maven-org-springframework-boot--spring-boot-starter-rsocket

Starter for building RSocket clients and servers with Spring Boot auto-configuration.

Pending
Overview
Eval results
Files

auto-configuration.mddocs/

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.

Capabilities

RSocket Strategies Auto-Configuration

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:

  1. CBOR codecs with Jackson (priority 0)
  2. JSON codecs with Jackson (priority 1)

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()); 
        };
    }
}

RSocket Server Auto-Configuration

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:

  • WebSocket Integration: Requires reactive web application, WebSocket transport, mapping path configured
  • Standalone Server: Requires server port configuration

RSocket Requester Auto-Configuration

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);
    }
}

RSocket Messaging Auto-Configuration

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();
    }
}

Configuration Conditions

The auto-configuration uses several conditional annotations to enable features:

Class Conditions

  • @ConditionalOnClass: Activates when specific classes are on classpath
  • RSocket core classes (io.rsocket.RSocket, RSocketServer)
  • Spring messaging classes (RSocketRequester, RSocketStrategies)
  • Netty classes (HttpServer, TcpServerTransport)

Bean Conditions

  • @ConditionalOnBean(RSocketMessageHandler.class): Server config requires message handler
  • @ConditionalOnMissingBean: Provides default beans when none exist

Property Conditions

  • @ConditionalOnProperty("spring.rsocket.server.port"): Standalone server needs port
  • @ConditionalOnWebApplication(Type.REACTIVE): WebSocket integration for reactive apps

Custom Conditions

  • OnRSocketWebServerCondition: Complex condition for WebSocket server integration

Customization Points

All 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

docs

auto-configuration.md

client-configuration.md

codec-configuration.md

index.md

message-handling.md

server-configuration.md

tile.json