enablewebsocketmessagebroker baeldung java spring websocket

java - baeldung - No se puede ejecutar la demostración de socket web de primavera



websocket java (5)

¿Cómo se asigna su DispatcherServlet? Here podría ser lo que estás buscando

Estoy tratando de ejecutar una demo de spring web socket pero no puedo probarlo por completo. Estoy usando Java 7 y Tomcat 7.0.50. No recibo ningún error durante el inicio del servidor, pero cuando abro la página web con js que realiza la conexión, obtengo la página 404 que no se encuentra. No estoy seguro de si me falta algo en la configuración para hacerlo funcionar y cómo puedo conectarlo desde el lado js.

Tengo el siguiente archivo xml:

<beans ....> <context:annotation-config /> <websocket:message-broker application-destination-prefix="/app"> <websocket:stomp-endpoint path="/hello"> <websocket:sockjs /> </websocket:stomp-endpoint> <websocket:simple-broker prefix="/topic" /> </websocket:message-broker> </beans>

Mi clase de controlador es:

@Controller public class SwsService { @MessageMapping("/hello") @SendTo("/topic/greetings") public Greeting greeting(HelloMessage message) throws Exception { return new Greeting("Hello, " + message.getName() + "!"); } public String getGreeting() { return "Hello, you are in!"; } }

El js desde el cual estoy llamando esto es:

var sock = new SockJS("/hello"); sock.onopen = function () { console.log("open"); }; sock.onclose = function () { console.log("closed"); }; sock.onmessage = function (message) { console.log("msg", message); };

La salida de la consola cuando ejecuto el tomcat:

Feb 19, 2014 3:28:47 PM org.apache.catalina.core.AprLifecycleListener init INFO: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:/Program Files/Java/jre7/bin;C:/Windows/Sun/Java/bin;C:/Windows/system32;C:/Windows;C:/Program Files/Java/jre6/bin/client;C:/Program Files/Java/jre6/bin;C:/Program Files/Java/jre6/lib/i386;C:/Windows/system32;C:/Windows;C:/Windows/System32/Wbem;C:/Windows/System32/WindowsPowerShell/v1.0/;C:/Program Files/Intel/OpenCL SDK/2.0/bin/x86;C:/Program Files/TortoiseGit/bin;C:/Python24;C:/Program Files/TortoiseSVN/bin;C:/Program Files/nodejs/;C:/Program Files/Git/cmd;C:/Users/harsh/AppData/Roaming/npm;E:/IDE/eclipse_indigo;;. Feb 19, 2014 3:28:47 PM org.apache.tomcat.util.digester.SetPropertiesRule begin WARNING: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property ''source'' to ''org.eclipse.jst.jee.server:SWS'' did not find a matching property. Feb 19, 2014 3:28:48 PM org.apache.coyote.AbstractProtocol init INFO: Initializing ProtocolHandler ["http-bio-8080"] Feb 19, 2014 3:28:48 PM org.apache.coyote.AbstractProtocol init INFO: Initializing ProtocolHandler ["ajp-bio-8009"] Feb 19, 2014 3:28:48 PM org.apache.catalina.startup.Catalina load INFO: Initialization processed in 1412 ms Feb 19, 2014 3:28:48 PM org.apache.catalina.core.StandardService startInternal INFO: Starting service Catalina Feb 19, 2014 3:28:48 PM org.apache.catalina.core.StandardEngine startInternal INFO: Starting Servlet Engine: Apache Tomcat/7.0.50 Feb 19, 2014 3:28:51 PM org.apache.catalina.core.ApplicationContext log INFO: No Spring WebApplicationInitializer types detected on classpath Feb 19, 2014 3:28:51 PM org.apache.catalina.core.ApplicationContext log INFO: Initializing Spring root WebApplicationContext Feb 19, 2014 3:28:51 PM org.springframework.web.context.ContextLoader initWebApplicationContext INFO: Root WebApplicationContext: initialization started Feb 19, 2014 3:28:51 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh INFO: Refreshing Root WebApplicationContext: startup date [Wed Feb 19 15:28:51 IST 2014]; root of context hierarchy Feb 19, 2014 3:28:52 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions INFO: Loading XML bean definitions from ServletContext resource [/WEB-INF/classes/conf/SwsContext.xml] Feb 19, 2014 3:28:53 PM org.springframework.scheduling.concurrent.ExecutorConfigurationSupport initialize INFO: Initializing ExecutorService ''clientInboundChannelExecutor'' Feb 19, 2014 3:28:53 PM org.springframework.scheduling.concurrent.ExecutorConfigurationSupport initialize INFO: Initializing ExecutorService ''clientOutboundChannelExecutor'' Feb 19, 2014 3:28:53 PM org.springframework.scheduling.concurrent.ExecutorConfigurationSupport initialize INFO: Initializing ExecutorService ''messageBrokerSockJsScheduler'' Feb 19, 2014 3:28:53 PM org.springframework.web.servlet.handler.AbstractUrlHandlerMapping registerHandler INFO: Mapped URL path [/hello/**] onto handler of type [class org.springframework.web.socket.sockjs.support.SockJsHttpRequestHandler] Feb 19, 2014 3:28:53 PM org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup start INFO: Starting beans in phase 2147483647 Feb 19, 2014 3:28:53 PM org.springframework.web.context.ContextLoader initWebApplicationContext INFO: Root WebApplicationContext: initialization completed in 2173 ms Feb 19, 2014 3:28:53 PM org.apache.coyote.AbstractProtocol start INFO: Starting ProtocolHandler ["http-bio-8080"] Feb 19, 2014 3:28:53 PM org.apache.coyote.AbstractProtocol start INFO: Starting ProtocolHandler ["ajp-bio-8009"] Feb 19, 2014 3:28:53 PM org.apache.catalina.startup.Catalina start INFO: Server startup in 5842 ms

La salida de la consola del navegador:

GET http://localhost:8080/hello/info 404 (Not Found) sockjs-0.3.min.js:27 closed

¿Cómo puedo probarlo con éxito?

Actualizaciones

También intenté ejecutar el ejemplo de la cartera desde aquí: https://github.com/rstoyanchev/spring-websocket-portfolio según lo sugerido por @jhadesdev

Pero tampoco ayuda. Cuando ejecuto mvn tomcat7:run , veo el siguiente resultado y abro url en el navegador que dice 404.

[INFO] Scanning for projects... [INFO] [INFO] Using the builder org.apache.maven.lifecycle.internal.builder.singlethrea ded.SingleThreadedBuilder with a thread count of 1 [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building spring-websocket-portfolio 1.0.0-SNAPSHOT [INFO] ------------------------------------------------------------------------ [INFO] [INFO] >>> tomcat7-maven-plugin:2.2:run (default-cli) @ spring-websocket-portfol io >>> [INFO] [INFO] --- maven-resources-plugin:2.5:resources (default-resources) @ spring-web socket-portfolio --- [debug] execute contextualize [INFO] Using ''UTF-8'' encoding to copy filtered resources. [INFO] skip non existing resourceDirectory E:/libraries/spring-websocket-portfol io/src/main/resources [INFO] [INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ spring-websoc ket-portfolio --- [INFO] No sources to compile [INFO] [INFO] <<< tomcat7-maven-plugin:2.2:run (default-cli) @ spring-websocket-portfol io <<< [INFO] [INFO] --- tomcat7-maven-plugin:2.2:run (default-cli) @ spring-websocket-portfol io --- [INFO] Running war on http://localhost:8080/spring-websocket-portfolio [INFO] Using existing Tomcat server configuration at E:/libraries/spring-websock et-portfolio/target/tomcat [INFO] create webapp with contextPath: /spring-websocket-portfolio Feb 27, 2014 10:20:46 AM org.apache.coyote.AbstractProtocol init INFO: Initializing ProtocolHandler ["http-bio-8080"] Feb 27, 2014 10:20:46 AM org.apache.catalina.core.StandardService startInternal INFO: Starting service Tomcat Feb 27, 2014 10:20:46 AM org.apache.catalina.core.StandardEngine startInternal INFO: Starting Servlet Engine: Apache Tomcat/7.0.47 Feb 27, 2014 10:20:49 AM org.apache.catalina.core.ApplicationContext log INFO: No Spring WebApplicationInitializer types detected on classpath Feb 27, 2014 10:20:49 AM org.apache.coyote.AbstractProtocol start INFO: Starting ProtocolHandler ["http-bio-8080"]

Se quedó allí y no sigue adelante.


Estaba enfrentando el mismo problema. Este hilo me dio suficientes pistas para resolver el problema. Muchas gracias.

SOLUCIÓN: En caso de que tenga un Servlet Dispatcher de Spring MVC configurado en su web.xml y asignado a un patrón de URL como se muestra a continuación

<servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>/webui/*</url-pattern> </servlet-mapping>

Luego tienes que crear la instancia de SockJS como se muestra a continuación

var socket = new SockJS(''/contextPath/webui/hello'');

NOTA: Reemplace contextPath con la ruta de contexto de su aplicación.


Intente agregar una carpeta de recursos dentro de la aplicación web, donde todos los archivos stomp y sockjs.js estén disponibles. Eche un vistazo a este ejemplo de una https://github.com/rstoyanchev/spring-websocket-portfolio , que se puede ejecutar con mvn clean install jetty:run .

El problema parece ser que o bien el sockjs no está en el servidor o alguna ruta es incorrecta. Según el ejemplo del enlace, un punto final de stomp se puede configurar de la siguiente manera :

@EnableWebSocketMessageBroker public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/portfolio").withSockJS(); } }

Luego en javascript el punto final puede llamarse así:

var socket = new SockJS(''/spring-websocket-portfolio/portfolio'') var stompClient = Stomp.over(socket);

donde /spring-websocket-portfolio es la ruta de implementación raíz de su aplicación.


Su aplicación se ve bien.

Definitivamente debe prefijar las solicitudes de JavaScript con el contexto raíz de su aplicación, como se mencionó jhadesdev .

¿Su aplicación registra filtros adicionales o personaliza los programadores de mensajes? Tal vez algún otro elemento de configuración esté interfiriendo aquí.

El último ejemplo de cartera definitivamente debería funcionar, aquí hay algunas preguntas:

  1. ¿Podría decirnos más sobre la configuración de su cliente (navegador, versión)?
  2. ¿Su navegador soporta websocket (pruébelo there )?
  3. ¿También podría intentarlo en modo de incógnito (quizás una extensión del navegador de terceros es la culpa aquí)?
  4. ¿Podría verificar que su navegador no está utilizando un proxy HTTP para las solicitudes de localhost?
  5. ¿Podría verificar si este HTTP 404 está en el registro de acceso de Tomcat? (y ver si tienes algo interesante en esos o en catalina.out?)

This extensión de Chrome puede ayudarte a probar Websockets.

También puede echar un vistazo a mi proyecto de simple-chat que utiliza Spring Boot con Websockets.