2017-12-29 17 views
1

Ich bin nicht in der Lage einen Weg zu finden einen WebSocketHandlerAdapter an einen Reactor Netty Server anzuhängen.spring webflux: rein funktioneller Weg um websocket adapter an reactor-netty Server anzuschließen

Anforderungen: Ich möchte einen Reactor Netty Server starten und HTTP (REST) ​​Endpoints und Websocket Endpoints an denselben Server anhängen. Ich habe die Dokumentation und einige Beispiel-Demo-Anwendungen, die in der Dokumentation erwähnt werden, durchgelesen. Sie zeigen, wie Sie einen HttpHandlerAdapter mit der Funktion newHandler() an den HttpServer anhängen. Wenn es um Webstokes geht, wechseln sie zurück zu Springboots und Annotationsbeispielen. Ich bin nicht in der Lage zu finden, WebSockets mit funktionalen Endpunkten zu befestigen.

Bitte zeigen Sie mir in die richtige Richtung, wie dies zu implementieren ist. 1. Wie schließe ich den Websocket-Adapter an den Netty-Server an? 2. Sollte ich HttpServer oder TcpServer verwenden?

Hinweis: 1. Ich verwende keinen Spring Boot. 2. Ich verwende keine Anmerkungen. 3. Versuchen, dies nur mit funktionalen Webflux-Endpunkten zu erreichen.

Beispielcode:

public HandlerMapping webSocketMapping() 
{ 
    Map<String, WebSocketHandler> map = new HashMap<>(); 
    map.put("/echo", new EchoTestingWebSocketHandler()); 
    SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping(); 
    mapping.setUrlMap(map); 
    mapping.setOrder(-1); 
    return mapping; 
} 
public WebSocketHandlerAdapter wsAdapter() 
{ 
    HandshakeWebSocketService wsService = new HandshakeWebSocketService(new ReactorNettyRequestUpgradeStrategy()); 
    return new WebSocketHandlerAdapter(wsService); 
} 

    protected void startServer(String host, int port) 
    { 
    HttpServer server = HttpServer.create(host, port); 
    server.newHandler(wsAdapter()).block(); //how do I attach the websocket adapter to the netty server 
    } 

Antwort

1

Leider gibt es keine einfache Möglichkeit, das zu tun, ohne ganze SpringBootApplication angerannt. Andernfalls müssen Sie die gesamte Spring WebFlux-Handler-Hierarchie selbst schreiben. Betrachten Sie Ihr funktionelles Routing mit SpringBootApplication zu komponieren:

@SpringBootApplication 
    public class WebSocketApplication { 

     public static void main(String[] args) { 
      SpringApplication.run(WebSocketApplication.class, args); 
     } 


     @Bean 
     public RouterFunction<ServerResponse> routing() { 
      return route(
        POST("/api/orders"), 
        r -> ok().build() 
      ); 
     } 

     @Bean 
     public HandlerMapping wsHandlerMapping() { 
      HashMap<String, WebSocketHandler> map = new HashMap<>(); 

      map.put("/ws", new WebSocketHandler() { 
       @Override 
       public Mono<Void> handle(WebSocketSession session) { 
        return session.send(
          session.receive() 
            .map(WebSocketMessage::getPayloadAsText) 
            .map(tMessage -> "Response From Server: " + tMessage) 
            .map(session::textMessage) 
        ); 
       } 
      }); 

      SimpleUrlHandlerMapping mapping = new SimpleUrlHandlerMapping(); 
      mapping.setUrlMap(map); 
      mapping.setOrder(-1); 
      return mapping; 
     } 

     @Bean 
     HandlerAdapter wsHandlerAdapter() { 
      return new WebSocketHandlerAdapter(); 
     } 
    } 

Incase wenn SpringBoot infra nicht der Fall ist

Versuch direkte Interaktion mit ReactorNetty anstatt zu prüfen. Reactor Netty Bietet pritty gute Abstraktion um native Netty und Sie können mit ihm in der gleichen funktionalen Art interagieren:

+0

Dank Oleh. Ich versuche, webflux in eine vorhandene Federanwendung zu integrieren, daher ist die Verwendung von SpringBoot oder Annotation keine Option. Ich muss es entweder mithilfe des XML-Konfigurationsanwendungskontexts oder mithilfe von funktionalem Routing tun. Ich werde deinen zweiten Vorschlag versuchen. Können Sie bitte diese Zeile ausfüllen: ** (in, out) -> out.send (in.receive())) **. Ich nehme an, Sie beziehen sich auf Reaktorwebsäcke und webcoketoutboud. Sollte ich ein Reactor-Interface in meinem aktuellen Websocket-Handler implementieren? – chirpi

Verwandte Themen