Миграция существующего обработчика Spring Websocket для использования rsocket - PullRequest
0 голосов
/ 27 апреля 2020

Предположим, у меня есть простой обработчик Websocket для сообщений чата:

@Override
public Mono<Void> handle(WebSocketSession webSocketSession) {
    webSocketSession
            .receive()
            .map(webSocketMessage -> webSocketMessage.getPayloadAsText())
            .map(textMessage -> textMessageToGreeting(textMessage))
            .doOnNext(greeting-> greetingPublisher.push(greeting))
            .subscribe();
    final Flux<WebSocketMessage> message = publisher
            .map(greet -> processGreeting(webSocketSession, greet));
    return webSocketSession.send(message);
}

Что нужно сделать здесь в целом, так как он будет использовать протокол rsocket ?

1 Ответ

1 голос
/ 27 апреля 2020

Контроллер RSocket в Spring WebFlux больше похож на RestController, чем на WebSocketHandler. Таким образом, приведенный выше пример очень прост:

@Controller
public class RSocketController {

    @MessageMapping("say.hello")
    public Mono<String> saHello(String name) {
        return Mono.just("server says hello " + name);
    }
}

и это эквивалентно методу requestResponse.

Если этот ответ вас не устраивает, опишите, пожалуйста, что вы хотите достижения.

РЕДАКТИРОВАТЬ

Если вы хотите рассылать сообщения всем клиентам, им необходимо подписаться на один и тот же поток.

public class GreetingPublisher {

    final FluxProcessor processor;
    final FluxSink sink;

    public GreetingPublisher() {
        this.processor = DirectProcessor.<String>create().serialize();
        this.sink = processor.sink();
    }

    public void addGreetings(String greeting) {
        this.sink.next(greeting);
    }

    public Flux<String> greetings() {
        return processor;
    }
}

@Controller
public class GreetingController{

    final GreetingPublisher greetingPublisher = new GreetingPublisher();

    @MessageMapping("greetings.add")
    public void addGreetings(String name) {
        greetingPublisher.addGreetings("Hello, " + name);
    }

    @MessageMapping("greetings")
    public Flux<String> sayHello() {
        return greetingPublisher.greetings();
    }
}

Ваши клиенты должны вызвать конечную точку greetings с помощью метода requestStream. Куда бы вы ни отправили сообщение с greetingPublisher.addGreetings(), оно будет передано всем клиентам.

...