Je commence à déplacer ma webapp de l'application Jetty 9 vers Spring Boot, mais je n'arrive pas à comprendre comment utiliser Jetty WebSocketHandler par opposition à Spring WebSocketHandler et WebSocketSession.Convertir Spring Websocket à Jetty Websocket
Je peux configurer correctement Spring WebSocketHandler dans mon Application.java, et j'ai trouvé les classes JettyWebSocketHandlerAdaptor et JettyWebSocketSession dans la documentation de Spring Framework, mais je n'ai pas été capable de savoir comment l'utiliser ou tout autre bon exemples.
Comment puis-je la main sur WebSocketHandler à la jetée? Étant donné que JettyWebSocketAdapter ne dérive d'autre chose que Object, j'ai essayé d'enregistrer un Spring WebSocketHandler, puis toutes ses méthodes se sont transmises à JettyWebSocketHandler. Est-il stupide de ma part de faire cela:
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);
}
}
printemps 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;
}
}
Il échoue peu importe depuis quand j'ouvrir ma page web la connexion websocket semble fermer chaque fois J'essaie de l'utiliser. La connexion se ferme une fois que je tente d'utiliser les méthodes de jettyHandler, l'exception est une exception 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
Comment pourriez-vous aller sur l'utilisation WebSocketHandler de la jetée directement? Je ne comprends pas assez Spring pour savoir comment diriger le trafic vers mes Jetty WebSockets. –