spring sockjs spring-websocket

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.