Cómo enviar un mensaje al cliente a través de websocket usando Spring
sockjs spring-websocket (1)
Pude resolver mi problema gracias a @Boris the Spider. La solución correcta es hacer algo así:
@Controller
@RequestMapping("/")
public class PhotoController {
@Autowired
private SimpMessagingTemplate template;
@MessageMapping("/form")
@SendTo("/topic/greetings")
public Greeting validate(AddPhotosForm addPhotosForm) {
FireGreeting r = new FireGreeting( this );
new Thread(r).start();
return new Greeting("Hello world !");
}
public void fireGreeting() {
System.out.println("Fire");
this.template.convertAndSend("/topic/greetings", new Greeting("Fire"));
}
}
Intento usar Spring con websocket. Comencé mi investigación con este tutorial .
En mi lado del cliente tengo algo así para inicializar la conexión al servidor:
function connect() {
var socket = new SockJS(''/myphotos/form'');
stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
setConnected(true);
console.log(''Connected: '' + frame);
stompClient.subscribe(''/topic/greetings'', function(greeting){
showGreeting(JSON.parse(greeting.body).content);
});
});
}
Funciona muy bien, en mi controlador puedo hacer mi proceso en la siguiente clase:
@Controller
@RequestMapping("/")
public class PhotoController {
@MessageMapping("/form")
@SendTo("/topic/greetings")
public Greeting validate(AddPhotosForm addPhotosForm) {
return new Greeting("Hello world !");
}
}
Ahora, lo que quiero hacer es tener un hilo enviando un mensaje al cliente escuchando en "/ topic / greeting". Escribí mi clase de Runnable así:
public class FireGreeting implements Runnable {
private PhotoController listener;
public FireGreeting(PhotoController listener) {
this.listener = listener;
}
@Override
public void run() {
while (true) {
try {
Thread.sleep( 2000 );
listener.fireGreeting();
} catch ( InterruptedException e ) {
e.printStackTrace();
}
}
}
}
Y completé mi controlador así:
@Controller
@RequestMapping("/")
public class PhotoController {
@MessageMapping("/form")
@SendTo("/topic/greetings")
public Greeting validate(AddPhotosForm addPhotosForm) {
// added this part
FireGreeting r = new FireGreeting( this );
new Thread(r).start();
return new Greeting("Hello world !");
}
// added this method
@SendTo("/topic/greetings")
public Greeting fireGreeting() {
System.out.println("Fire");
return new Greeting("Fire");
}
}
El método PhotoController.fireGreeting se llama como quiero, pero no sucedió nada en el lado del cliente. Alguna sugerencia ? Gracias.