Spring STOMP inviando messaggi da qualsiasi punto dell’applicazione

Sto costruendo un’applicazione che usa Stomp per mediare i messaggi su websocket. Sto cercando di inviare messaggi dal server al client senza una richiesta da nessuna parte nell’applicazione. Ho trovato due diverse opzioni online per l’invio di messaggi da qualsiasi punto dell’applicazione.

Il primo si trova nella documentazione di Websocket. Sezione 20.4.5:

@Controller public class GreetingController { private SimpMessagingTemplate template; @Autowired public GreetingController(SimpMessagingTemplate template) { this.template = template; } @RequestMapping(value="/greetings", method=POST) public void greet(String greeting) { String text = "[" + getTimestamp() + "]:" + greeting; this.template.convertAndSend("/topic/greetings", text); } } 

Il secondo è in una guida scritta da uno degli Spring Blogger :

 @Controller public class GreetingController { @Autowired private SimpMessagingTemplate template; @RequestMapping(value="/greeting", method=POST) public void greet(String greeting) { String text = "[" + getTimeStamp() + "]:" + greeting; this.template.convertAndSend("/topic/greeting", text); } } 

Entrambi sono molto simili. Il primo sovrascrive il costruttore predefinito e non esegue automaticamente l’inizializzazione del modello. Il secondo non crea un nuovo costruttore, ma esegue automaticamente l’inizializzazione del modello. La mia prima domanda è se queste due azioni siano equivalenti?

La questione più urgente è che ho problemi a chiamare il metodo “saluto” da qualsiasi luogo. Ho provato a farlo in un paio di modi diversi.

Ecco il primo:

  public class modifier { @Autowired private HelloController sender; public void adder(String words) throws Exception { sender.greet(words); } } 

Nel caso precedente, sembra che il nuovo HelloController non sia mai stato inizializzato. Durante il debug, trovo che quando il metodo adder chiama il metodo “greet”, il mittente è nullo e ricevo un’eccezione di puntatore nullo.

Ecco l’altra via che ho usato per impostare:

 public class modifier { public void adder(String words) throws Exception { HelloController sender = new HelloController(); sender.greet(words); } 

}

In questo secondo caso sopra, dopo il debug, c’è anche un’eccezione di puntatore nullo, tuttavia non è con il mittente. È con sender.template. Il modello del mittente è inizializzato, tuttavia non viene mai assegnato un valore o un ID. Quindi quando this.template.convertAndSend () viene chiamato all’interno di greet, viene sollevata un’eccezione di puntatore nullo su this.template.

Ho mischiato e abbinato le due implementazioni gound del controller e le mie due implementazioni di chiamare il metodo greet da una class separata nell’applicazione e nessuno funziona.

C’è qualcuno che potrebbe far luce sul mio problema? Qualsiasi aiuto, consiglio o consiglio sarebbe molto apprezzato!

Grazie in anticipo.

Come scritto correttamente nei commenti, ci sono diversi modi per aumentare la dipendenza, sono per lo più equivalenti, devi scegliere quelli che preferisci in base alle tue esigenze.

Come per l’altra domanda: in spring il controller è l’object (un singleton) che ascolta le richieste degli utenti, quindi la mapping @RequestMapping gestisce le richieste HTTP all’URL designato.

Se è necessario inviare messaggi dal server al client utilizzando l’object SimpMessagingTemplate, è necessario sapere che il client deve utilizzare il protocollo STOMP (oltre i socket Web) e deve essere sottoscritto all’argomento corretto.

Infatti, utilizzando STOMP il server non può inviare arbitrariamente messaggi al client, ma può solo pubblicare messaggi per argomenti e il client deve essere iscritto agli argomenti giusti per riceverli.