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:
- ¿Podría decirnos más sobre la configuración de su cliente (navegador, versión)?
- ¿Su navegador soporta websocket (pruébelo there )?
- ¿También podría intentarlo en modo de incógnito (quizás una extensión del navegador de terceros es la culpa aquí)?
- ¿Podría verificar que su navegador no está utilizando un proxy HTTP para las solicitudes de localhost?
- ¿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.