2017-12-29 51 views
1

WebSocketHandlerAdapter를 원자로 네트워크 서버에 연결하는 방법을 알 수 없습니다.스프링 webflux : 웹 소켓 어댑터를 원자로 네트워크 서버에 부착하는 순수한 기능 방법

요구 사항 : 원자로 netty 서버를 시작하고 http (REST) ​​엔드 포인트와 websocket 엔드 포인트를 동일한 서버에 첨부하고 싶습니다. 필자는 설명서와 설명서에 언급 된 샘플 데모 응용 프로그램을 살펴 보았습니다. 그들은 newHandler() 함수를 사용하여 HttpHandlerAdapter를 HttpServer에 연결하는 방법을 보여줍니다. 그러나 웹 소켓의 경우 스프링 부트 및 주석 예제를 사용하도록 다시 전환됩니다. 기능 엔드 포인트를 사용하여 웹 소켓을 연결하는 방법을 찾을 수 없습니다.

구현 방법에 대해 올바른 방향을 알려주십시오. 1. websocket 어댑터를 netty 서버에 연결하려면 어떻게합니까? 2. HttpServer 또는 TcpServer를 사용해야합니까?

참고 : 1. 스프링 부트를 사용하지 않습니다. 2. 주석을 사용하고 있지 않습니다. 3. 기능적 webflux 끝점 만 사용하여이 작업을 수행하려고합니다.

샘플 코드 :

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 
    } 

답변

1

불행하게도, 전체 SpringBootApplication을 실행하지 않고 그렇게 쉬운 방법이 없습니다. 그렇지 않으면, 전체 Spring WebFlux 핸들러 계층 구조를 스스로 작성해야합니다. SpringBootApplication와 기능 라우팅을 구성하기 위해 고려 : SpringBoot 인프라 대신 ReactorNetty와 직접 상호 작용을 고려하는 경우

시도하지

@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(); 
     } 
    } 

경우;합니다. Reactor Netty 네이티브 Netty에 대한 좋은 추상화를 제공하며 동일한 기능성 관리자에서 상호 작용할 수 있습니다.

ReactorHttpHandlerAdapter handler = 
        new ReactorHttpHandlerAdapter(yourHttpHandlers); 

      HttpServer.create() 
         .startRouterAndAwait(routes -> { 
            routes.ws("/pathToWs", (in, out) -> out.send(in.receive())) 
             .file("/static/**", ...) 
             .get("**", handler) 
             .post("**", handler) 
             .put("**", handler) 
             .delete("**", handler); 
           } 
        ); 

+0

감사 Oleh. SpringBoot 나 annotation을 사용하여 webflux를 기존 스프링 어플리케이션에 통합하려고 시도하고 있습니다. xml 구성 응용 프로그램 컨텍스트를 사용하거나 기능 라우팅을 사용하여이 작업을 수행해야합니다. 나는 너의 두 번째 제안을 시도 할 것이다. 이 줄은 ** (in, out) -> out.send (in.receive()) ** **라고 할 수 있습니다. 난 당신이 원자로 websocketinbound 및 webcoketoutboud 언급하고 있다고 가정합니다. 현재의 websocket 핸들러에 reactor interface를 구현해야합니까? – chirpi