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を設定します。データ形式に必要なエンコーダーとデコーダーも設定します。
デフォルトではSimpleRouteMatcherがAntPathMatcherを使用します。効率的なルートマッチングにはspring-webのPathPatternRouteMatcherを使用します。RSocketルートは階層化できますがURLパスではありません。デフォルトの区切り文字は.で、URLデコードは行いません。
共有するRSocketStrategiesでRSocketMessageHandlerを設定できます。
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> |
抽出登録されたすべてのメタデータ値。 |
戻り値はレスポンスペイロードとしてシリアライズされます。具体的な値、MonoやFluxなどの非同期型、voidやMono<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による後続のメタデータプッシュ通知を処理します。
SETUPとMETADATA_PUSHフレームのメタデータとデータに基づき、@MessageMappingと同じ引数をサポートします。ルートパターンで処理対象の接続を限定できます。パターンがなければ、すべての接続に一致します。
@ConnectMappingメソッドはデータを返せません。戻り値はvoidまたはMono<Void>にします。新しい接続の処理がエラーを返すと、接続は拒否されます。