Ich beginne meine vorhandene Jetty 9 Webapp-Anwendung auf Spring Boot zu verschieben, aber ich kann nicht herausfinden, wie Sie einen Jetty WebSocketHandler im Gegensatz zu einem Spring WebSocketHandler und WebSocketSession verwenden.Konvertieren von Spring Websocket in Jetty Websocket
Ich kann den Spring WebSocketHandler in meiner Application.java ordnungsgemäß einrichten, und ich fand die JettyWebSocketHandlerAdaptor und die JettyWebSocketSession-Klassen in der Spring Framework-Dokumentation, aber ich konnte nicht herausfinden, wie man es oder etwas Gutes verwendet Beispiele.
Wie gebe ich die WebSocketHandler auf Anlegestelle über? Da der JettyWebSocketAdapter nicht von etwas anderem als Object abgeleitet ist, habe ich versucht, einen Spring WebSocketHandler zu registrieren und dann alle seine Methoden selbst an einen JettyWebSocketHandler übergeben zu lassen. Ist es von mir dumm tun dies zu:
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);
}
}
Frühling 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;
}
}
Es schlägt fehl, unabhängig nach, da ich meine Webseite öffnen die websocket Verbindung zu schließen scheint, wann immer Ich versuche es zu benutzen. Die Verbindung wird geschlossen, sobald ich versuche, jettyHandler Methoden zu verwenden, die Ausnahme ist eine ExceptionWebSocketHandlerDecorator Ausnahme:
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
Wie konnten Sie direkt Jetty der WebSocketHandler gehen über die Verwendung? Ich verstehe Spring nicht gut genug, um wirklich zu wissen, wie man den Traffic zu meinen Jetty WebSockets leitet. –