метаданные маршрутизации rsocket с использованием RSocket-Java для Spring Rsocket Server

Как настроить метаданные маршрутизации (в полезной нагрузке с использованием только RSocket-Java, когда сервер использует Spring Boot Rsocket.

Flux<Payload> s = connection.flatMapMany(requester -> requester.requestStream(DefaultPayload.create("Some Message")))

Сервер использует @MessageMapping (/ route)


person user3549576    schedule 05.07.2020    source источник


Ответы (1)


Тип взаимодействия

Тип взаимодействия RSocket в SpringBoot с использованием @MessageMapping определяется на основе подписи аннотированного метода (дополнительная информация в документы Spring)

Предположим, у него есть подпись:

@MessageMapping("/route")
Flux<String> getStreamOfStrings(String message) {...}

На основе таблицы мощности из Spring docs тип взаимодействия - Request-Stream.

Клиент RSocket

Клиент RSocket java должен иметь указанный mime-тип для метаданных:

RSocket rsocketClient = RSocketConnector.create()
    //metadata header needs to be specified
    .metadataMimeType(WellKnownMimeType.MESSAGE_RSOCKET_COMPOSITE_METADATA.getString())
    // value of spring.rsocket.server.port eg 7000
    .connect(TcpClientTransport.create(7000))
    .block();

Данные

Данные будут простой строкой:

ByteBuf data = ByteBufAllocator.DEFAULT.buffer().writeBytes("request msg".getBytes());

Метаданные

Маршрутизация в RSocket определяется как расширение метаданных и должна быть отправлена вместе с данными для указания маршрутизации. Вот пример того, как его можно создать (см. Другие классы в пакете io.rsocket.metadata)

CompositeByteBuf metadata = ByteBufAllocator.DEFAULT.compositeBuffer();
RoutingMetadata routingMetadata = TaggingMetadataCodec.createRoutingMetadata(ByteBufAllocator.DEFAULT, List.of("/route"));
CompositeMetadataCodec.encodeAndAddMetadata(metadata,
        ByteBufAllocator.DEFAULT,
        WellKnownMimeType.MESSAGE_RSOCKET_ROUTING,
        routingMetadata.getContent());

Запрос потока запроса

Данные и метаданные создаются, поэтому вы можете выполнять requestSteam, используя:

rsocketClient.requestStream(DefaultPayload.create(data, metadata))
    .map(Payload::getDataUtf8)
    .toIterable()
    .forEach(System.out::println);
person haal    schedule 07.07.2020
comment
Это работает! Нужно ли нам создавать метаданные для каждого маршрута или есть способ использовать их из списка при создании полезной нагрузки? - person user3549576; 07.07.2020
comment
Один из вариантов - инициализировать метаданные для каждого маршрута и сохранить их в Map (Route, Metadata) и использовать их при создании полезной нагрузки. - person haal; 07.07.2020