2017-12-29 30 views
1

WebSocketHandlerAdapterを原子炉ネットサーバに取り付ける方法を見つけることができません。spring webflux:WebSocketアダプタを原子炉ネットサーバに取り付ける純粋に機能的な方法

要件: 原子炉のNettyサーバーを開始し、http(REST)エンドポイントとwebsocketエンドポイントを同じサーバーに接続したいとします。私はドキュメンテーションと、ドキュメンテーションで言及されているサンプルデモアプリケーションのいくつかを見てきました。これらは、newHandler()関数を使用してHttpHandlerAdapterをHttpServerに接続する方法を示しています。しかし、WebSocketについては、スプリングブートとアノテーションの例を使用するように切り替わります。私は機能エンドポイントを使用してWebソケットを接続する方法を見つけることができません。

これを実装する方法については、正しい方向を教えてください。 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であなたの機能のルーティングを構成するために考えてみましょう:包みなさい

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

SpringBootのインフラがない場合

ではなくReactorNettyとの直接的な相互作用を検討してみてください。 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や注釈を使用することはオプションではないので、既存のSpringアプリケーションにwebfluxを統合しようとしています。私はxml構成アプリケーションのコンテキストを使用するか、機能的なルーティングを使用する必要があります。私はあなたの2番目の提案を試みます。あなたはこの行を黙示してください:**(in、out) - > out.send(in.receive()))**。私はあなたが原子炉websocketinboundとwebcoketoutboudを指していると仮定します。現在のwebsocketハンドラにリアクタインターフェイスを実装する必要がありますか? – chirpi

関連する問題