sto usando il framework Spring e ho un controller websocket di lavoro che assomiglia a questo:Invia messaggio a tutti i clienti tramite SimpMessagingTemplate in ServletContextListener
@Controller
public class GreetingController {
@MessageMapping("/hello")
@SendTo("/topic/greetings")
public Greeting greeting(HelloMessage message) throws InterruptedException {
return new Greeting("Hello, " + message.getName() + "!");
}
}
Ho anche questa configurazione:
@Configuration
@EnableWebSocketMessageBroker
public class HelloWebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/hello").withSockJS();
}
}
Questa parte funziona alla grande! Posso inviare e ricevere messaggi con successo tra due o più browser utilizzando Stomp.js. Ecco la parte che non funziona. Ho implementato uno ServletContextListener
che contiene un oggetto personalizzato che, per motivi di semplicità, ho chiamato "notifier". Il notificatore ascolta determinati eventi che si verificano sul lato server. Quindi chiama il metodo 'notify', che dovrebbe inviare dettagli sull'evento a tutti i client. Tuttavia, non funziona.
@WebListener
public class MessageListener implements ServletContextListener, Notifiable {
private Notifier notifier;
@Autowired
private SimpMessagingTemplate messageSender;
public MessageListener() {
notifier = new Notifier(this);
}
public void contextInitialized(ServletContextEvent contextEvent) {
WebApplicationContextUtils
.getRequiredWebApplicationContext(contextEvent.getServletContext())
.getAutowireCapableBeanFactory()
.autowireBean(this);
notifier.start();
}
public void contextDestroyed(ServletContextEvent contextEvent) {
notifier.stop();
}
public void notify(NotifyEvent event) {
messageSender.convertAndSend("/topic/greetings", new Greeting("Hello, " + event.subject + "!"));
}
}
non ottengo un'eccezione. Lo SimpMessagingTemplate
è stato iniettato con successo da Spring, quindi non è nullo. Sono stato in grado di inserire il codice Spring e ho capito che lo subscriptionRegistry
SimpleBrokerMessageHandler
è vuoto quando si utilizza lo SimpMessagingTemplate
. Quindi deve essere un'istanza separata da quella utilizzata dai controller. Come posso ottenere lo stesso subscriptionRegistry
utilizzato dai controller?
Curioso se hai trovato una risposta. Lo stesso comportamento si verifica quando si chiama da una classe ApplicationEvent di Spring. –
Ci scusiamo per tornare a questo dopo tanto tempo. Ho pubblicato la mia soluzione qui sotto. – battmanz