Какой самый простой способ передать двоичное сообщение на все сеансы? - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть этот код, который я хочу иметь возможность транслировать всем клиентам / сеансам:

public class EchoHandler implements WebSocketHandler {
    @Override
    public Mono<Void> handle(WebSocketSession session) {
        return session
                .send(session.receive().map(WebSocketMessage::retain));
    }

}

На данный момент это только эхо для того же клиента, как это может вещать всем?

ОБНОВЛЕНИЕ:

Я провел некоторые эксперименты и придумал

@Override
public Mono<Void> handle(WebSocketSession session) {
    BinaryWebsocketMessageSubscriber subscriber = new BinaryWebsocketMessageSubscriber(binaryEventPublisher);
    return session.receive()
            .map(WebSocketMessage::retain)
            .map(this::toBinaryEvent)
            .doOnNext(subscriber::onNext)
            .doOnError(subscriber::onError)
            .doOnComplete(subscriber::onComplete)
            .zipWith(session.send(binaryOutputEvents.map(dataBuffer -> session.binaryMessage(dataBufferFactory -> dataBuffer))))
            .then();

}

Все еще не работает, это обновление смогло отправить ответ другим Клиент веб-сокета, но только в очень короткий период. И для одного клиента это не будет длиться ~ 30-31 событий, затем он перестает работать. Не уверен, в чем причина. Вот суть полного класса EchoHandler .

...