Spring Web Reactive | 5. RSocket | 5.3. アノテーション付きレスポンダー

RSocketレスポンダーは@MessageMapping@ConnectMappingメソッドで実装します。@MessageMappingは個別リクエスト、@ConnectMappingはセットアップやメタデータプッシュなどの接続レベルイベントを処理します。アノテーション付きレスポンダーは、サーバー側とクライアント側で対称的にサポートされます。

5.3.1. サーバーレスポンダー

Spring設定へRSocketMessageHandlerを追加し、@MessageMapping@ConnectMappingメソッドを持つ@Controller Beanを検出します。

@Configuration
class ServerConfig {
    @Bean
    fun rsocketMessageHandler() = RSocketMessageHandler().apply {
        routeMatcher = PathPatternRouteMatcher()
    }
}

RSocketサーバーを起動し、レスポンダーを接続します。

val context: ApplicationContext = ...
val handler = context.getBean<RSocketMessageHandler>()

val server = RSocketServer.create(handler.responder())
        .bind(TcpServerTransport.create("localhost", 7000))
        .awaitSingle()

RSocketMessageHandlerはデフォルトで複合メタデータとルーティングメタデータをサポートします。その他のMIMEタイプにはMetadataExtractorを設定します。データ形式に必要なエンコーダーとデコーダーも設定します。

デフォルトではSimpleRouteMatcherAntPathMatcherを使用します。効率的なルートマッチングにはspring-webPathPatternRouteMatcherを使用します。RSocketルートは階層化できますがURLパスではありません。デフォルトの区切り文字は.で、URLデコードは行いません。

共有するRSocketStrategiesRSocketMessageHandlerを設定できます。

RSocketStrategies.builder()
    .encoders(encoders -> encoders.add(new Jackson2CborEncoder()))
    .decoders(decoders -> decoders.add(new Jackson2CborDecoder()))
    .routeMatcher(new PathPatternRouteMatcher())
    .build();

5.3.2. クライアントレスポンダー

クライアント側のアノテーション付きレスポンダーはRSocketRequester.Builderで設定します。クライアントレスポンダーを参照してください。

5.3.3. @MessageMapping

サーバーまたはクライアントレスポンダーを設定した後、@MessageMappingメソッドを使用できます。

@Controller
public class RadarsController {
    @MessageMapping("locate.radars.within")
    public Flux<AirportLocation> radars(MapRequest request) {
        // ...
    }
}

このメソッドは、ルートlocate.radars.withinを持つRequest-Stream対話に応答します。

メソッド引数 説明
@Payload リクエストペイロード。他の対応引数型でない場合、アノテーションは省略できます。
RSocketRequester リモートエンドポイントを呼び出すリクエスター。
@DestinationVariable @MessageMapping("find.radar.{id}")などのルート変数から抽出した値。
@Header MetadataExtractorで抽出登録されたメタデータ値。
@Headers Map<String, Object> 抽出登録されたすべてのメタデータ値。

戻り値はレスポンスペイロードとしてシリアライズされます。具体的な値、MonoFluxなどの非同期型、voidMono<Void>など値を持たない型を使用できます。

入力カーディナリティ 出力カーディナリティ 対話タイプ
0, 1 0 Fire-and-Forget
0, 1 1 Request-Response
0, 1 Many Request-Stream
Many 0, 1, Many Request-Channel

5.3.4. @ConnectMapping

@ConnectMappingはRSocket接続開始時のSETUPフレームと、METADATA_PUSHによる後続のメタデータプッシュ通知を処理します。

SETUPMETADATA_PUSHフレームのメタデータとデータに基づき、@MessageMappingと同じ引数をサポートします。ルートパターンで処理対象の接続を限定できます。パターンがなければ、すべての接続に一致します。

@ConnectMappingメソッドはデータを返せません。戻り値はvoidまたはMono<Void>にします。新しい接続の処理がエラーを返すと、接続は拒否されます。