2015-01-31 20 views
14

Provo a utilizzare Spring con websocket. Ho iniziato le mie indagini con this tutorial.Come inviare un messaggio al client tramite websocket utilizzando Spring

Nel mio lato client ho qualcosa di simile per inizializzare la connessione al server:

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); 
     }); 
    }); 
} 

E le grandi opere, nel mio controller sono in grado di fare il mio processo nella seguente classe:

@Controller 
@RequestMapping("/") 
public class PhotoController { 

    @MessageMapping("/form") 
    @SendTo("/topic/greetings") 
    public Greeting validate(AddPhotosForm addPhotosForm) { 
     return new Greeting("Hello world !"); 
    } 
} 

Ora quello che voglio fare è avere una discussione che invia un messaggio al client che ascolta "/ topic/greeting". Ho scritto la mia classe Runnable come questo:

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(); 
      } 
     } 
    } 
} 

e completato il mio controller del genere:

@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"); 
    } 
} 

Il metodo PhotoController.fireGreeting si chiama come voglio, ma non è successo niente sul lato client. Qualche suggerimento? Grazie.

+9

Si prega di leggere [21.4.5 Invio di messaggi] (http://docs.spring.io/spring/docs/current/spring-framework-reference/html/ websocket.html # websocket-stomp-handle-send) dell'esercitazione Websocket di Spring. Questo non è certamente il modo in cui lo fai. Prendi in considerazione anche la lettura di Spring [meccanismo di pianificazione] (http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/annotation/EnableScheduling.html) piuttosto che utilizzare thread non elaborati (non correttamente) . –

+0

Grazie per il link, è esattamente quello che voglio fare. Riguardo il thread che uso, evidentemente non lo userò nello stato finale della mia applicazione. Ho una lunga procedura sul lato server che invierà informazioni al client per fargli sapere quali passi sono già stati fatti. – cheb1k4

risposta

30

Sono stato in grado di risolvere il mio problema grazie a @ Boris the Spider. La soluzione corretta è quella di fare qualcosa di simile:

@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")); 
    } 
} 
+0

Grazie, mi saluti il ​​giorno. –

+0

Mi scusi, questo approccio è sicuro? – LeafiWan

Problemi correlati