Как подписать клиента на сервер rsocket? - PullRequest
1 голос
/ 26 апреля 2020

Моя цель - подписать клиента на сервер событий SSE. Клиенты будут использовать протокол WebSocket, поэтому я использую: spring.rsocket.server.transport: websocket

Аналог по блокировке стека ввода-вывода:

@Configuration
@EnableWebSocketMessageBroker
class WebSocketConfiguration: WebSocketMessageBrokerConfigurer {

    override fun configureMessageBroker(registry: MessageBrokerRegistry) {
        registry.enableSimpleBroker("/topic")

        registry.setApplicationDestinationPrefixes("/app")
    }

    override fun registerStompEndpoints(registry: StompEndpointRegistry) {
        registry.addEndpoint("/websocket")
                .setAllowedOrigins("*")
                .withSockJS();
    }
}

Использование:

@Service
class MessagingService(private val simpMessagingTemplate: SimpMessagingTemplate) {

    private val logger = KotlinLogging.logger {}

    fun notify(baseEvent: BaseEvent) {
        logger.debug { "Sending an event $baseEvent" }
        simpMessagingTemplate.convertAndSend("/topic/events", baseEvent)
    }
}

Код клиента:

function connect() {
    var socket = new SockJS('/websocket');
    stompClient = Stomp.over(socket);
    stompClient.connect({}, function (frame) {
        setConnected(true);
        console.log('Connected: ' + frame);
        stompClient.subscribe('/topic/events', function (event) {
            console.log('Handled message from ws: ' + event)
            showGreeting(JSON.parse(event.body));
        });
    });
}

Где simpMessagingTemplate отправляет событие подключенным клиентам.

Я хочу добиться того же с реактор и spring-boot-starter-rsocket, который работает с WebSocket также на уровне клиент-сервер.

Rsocket request-stream подходит, но в этом случае мне нужно поток вечного потока на сервере, потому что я не знаю, когда событие придет. Я не знаю как это сделать

...