2016-08-04 8 views
0

私は既存のJetty 9アプリケーションwebappをSpring Bootに移行し始めていますが、Spring WebSocketHandlerとWebSocketSessionではなくJetty WebSocketHandlerを使用する方法がわかりません。Spring WebsocketをJetty Websocketに変換する

Spring WebSocketHandlerをApplication.javaに適切に設定することができ、Spring Framework DocumentationのJettyWebSocketHandlerAdaptorクラスとJettyWebSocketSessionクラスが見つかりましたが、それを使用する方法や良い方法を見つけることができませんでした例。

http://docs.spring.io/autorepo/docs/spring-framework/4.1.9.RELEASE/javadoc-api/org/springframework/web/socket/adapter/jetty/JettyWebSocketHandlerAdapter.html

どのように私は桟橋にWebSocketHandlerを手渡すのですか? JettyWebSocketAdapterはObject以外のものから派生していないので、私はSpring WebSocketHandlerを登録しようとしていて、そのメソッドのすべてをJettyWebSocketHandlerに渡すようにしています。これを実行するために、私のそれは愚かである:

Application.java

@EnableWebSocket 
@SpringBootApplication 
public class Application extends SpringBootServletInitializer implements WebSocketConfigurer { 



    @Override 
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) { 
     return application.sources(Application.class); 
    } 

    @Override 
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { 
     SpringWSHandler springPlease = new SpringWSHandler(); 


     registry.addHandler(springPlease, "/websocket").setHandshakeHandler(handshaker()); 
    } 

    @Bean 
    public DefaultHandshakeHandler handshaker() 
    { 
     WebSocketPolicy policy = new WebSocketPolicy(WebSocketBehavior.SERVER); 
     policy.setInputBufferSize(8192); 
     policy.setIdleTimeout(600000); 

     return new DefaultHandshakeHandler(new JettyRequestUpgradeStrategy(new WebSocketServerFactory(policy))); 
    } 


    public static void main(String[] args) throws Exception { 
     SpringApplication.run(Application.class, args); 

    } 
} 

春WebSocketHandler

@Component 
public class SpringWSHandler implements WebSocketHandler { 

    private JettyHandler jettyHandler; 
    private JettyWebSocketSession jettySession; 

    private static Logger logger = LoggerFactory.getLogger(SpringWSHandler.class); 



    @Override 
    public void afterConnectionEstablished(WebSocketSession session) throws Exception { 
     logger.debug("Connection Established: " + session.getId()); 
     jettySession = new JettyWebSocketSession(session.getAttributes()); 
     jettyHandler = new JettyHandler(this, jettySession); 
     jettyHandler.onOpen(jettySession.getNativeSession()); 

    } 

    @Override 
    public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception { 
     logger.debug("Message from session: " + session.getId()); 
     jettyHandler.onMessage(message.getPayload().toString()); 

    } 

    @Override 
    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { 
     //TODO 

    } 

    @Override 
    public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { 
     logger.debug("Closing the session: " + session.getId()); 
     jettyHandler.onClose(closeStatus.getCode(), "Closing Connection"); 
     session.close(closeStatus); 
    } 

    @Override 
    public boolean supportsPartialMessages() { 
     return true; 
    } 

} 

私は私のWebページを開いた後のWebSocket接続がいつでも閉じるように見えるので、それは関係なく、失敗しました私はそれを使用しようとします。私はjettyHandlerのメソッドを使用しようとしたら、接続が閉じ、例外がExceptionWebSocketHandlerDecorator例外です:

11:44:27.530 [qtp1014565006-19] ERROR o.s.w.s.h.ExceptionWebSocketHandlerDecorator - Unhandled error for ExceptionWebSocketHandlerDecorator [delegate=LoggingWebSocketHandlerDecorator [[email protected]]] 
java.lang.NullPointerException: null 

答えて

0

いずれにそのようにそれらをミックスしようとしない、直接、SpringのWebSocketHandlerや桟橋のWebSocketHandlerを使用しています。

Jetty WebSocketHandlerは、Jetty LifeCycle階層の一部である必要があり、Jetty Serverにアクセスする必要があるため、この方法では使用できません。

JettyとSpringの間のLifeCycleはそれほどメッシュではないので、適切なJettyをSpringレイヤーにアクセスさせることも困難です。

WebSocketUpgradeFilterとカスタム実装WebSocketCreatorを使用して、目的のWebSocketを初期化し、事実の後にSpringレイヤーにアクセスすることができます。

お客様のカスタムWebSocketCreatorは、新しい着信Websocketアップグレードが発生するたびに呼び出されます。

+0

はどのように直接桟橋のWebSocketHandlerを使用して行くだろうか?私はSpringを理解していないので、Jetty WebSocketsにトラフィックを送る方法を本当に分かっています。 –

0

私は時間のかかるものを一緒にハックすることに成功しましたが、Spring BootでJetty WebSocketsを使用するより適切で適切な方法を聞くのが大好きです。

これにより、Spring WebSocketからJetty WebSocketおよび関連クラスにメッセージを渡すJettyWebSocketHandlerAdapter(JettyHandler)クラスにメッセージを渡すことができます。 Application.java

WebSocketHandlerセットアップ

@Override 
    public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {   
     SpringWSHandler springPlease = new SpringWSHandler(); 

     registry.addHandler(springPlease, "/websocket").setHandshakeHandler(factoryBean()); 
    } 

    //Configure buffer size and timeouts 
    @Bean 
    public HandshakeHandler factoryBean() 
    { 
     WebSocketPolicy policy = new WebSocketPolicy(WebSocketBehavior.SERVER); 
     policy.setInputBufferSize(8192); 
     policy.setIdleTimeout(3600000); 
     WebSocketServerFactory factory = new WebSocketServerFactory(policy); 
     return new DefaultHandshakeHandler(new JettyRequestUpgradeStrategy(factory)); 
    } 

SpringWSHandler.java

@Component 
public class SpringWSHandler implements WebSocketHandler { 

    private JettyHandler jettyHandler; 
    private JettyWebSocketSession jettySession; 

    private static Logger logger = LoggerFactory.getLogger(SpringWSHandler.class); 



    @Override 
    public void afterConnectionEstablished(WebSocketSession session) throws Exception { 
     //Application.java adapts WebSocket connections to Jetty 9 API when registering handlers with the Jetty handshaker 
     //We can cast spring WebSocketSessions to JettyWebSocketSessions, and initialize the org.eclipse.jetty.websocket.api.Session with itself. 
     jettySession = (JettyWebSocketSession) session; 
     jettySession.initializeNativeSession(jettySession.getNativeSession()); 

     //Setup our custom handler and populate the router, which was magically created by Spring using our annotated classes in Router and its dependencies.  
     jettyHandler = new ClothoJettyHandler(this, jettySession); 

     //Let the jetty web socket commence! 
     jettyHandler.onOpen(jettySession.getNativeSession()); 

    } 

    @Override 
    public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception { 
     logger.debug("Message from session: " + session.getId()); 
     jettyHandler.onMessage(message.getPayload().toString()); 

    } 

    @Override 
    public void handleTransportError(WebSocketSession session, Throwable exception) throws Exception { 
     //TODO 

    } 

    @Override 
    public void afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus) throws Exception { 
     logger.debug("Closing the session: " + session.getId()); 
     jettyHandler.onClose(closeStatus.getCode(), "Closing Connection"); 
     session.close(closeStatus); 
    } 

    @Override 
    public boolean supportsPartialMessages() { 
     return true; 
    } 

} 
関連する問題