我使用Spring框架和我有一個工作的WebSocket控制器,它看起來像這樣:通過SimpMessagingTemplate中的ServletContextListener發送短消息到所有客戶端
@Controller
public class GreetingController {
@MessageMapping("/hello")
@SendTo("/topic/greetings")
public Greeting greeting(HelloMessage message) throws InterruptedException {
return new Greeting("Hello, " + message.getName() + "!");
}
}
我也有這個配置:
@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();
}
}
這部分很棒!我可以使用Stomp.js在兩個或更多瀏覽器之間成功發送和接收消息。這是不起作用的部分。我已經實現了ServletContextListener
,其中包含一個自定義對象,爲簡單起見,我稱之爲「通知程序」。通知程序偵聽某些事件發生在服務器端。然後它調用'notify'方法,該方法應該向所有客戶端發送有關該事件的詳細信息。但它不起作用。
@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 + "!"));
}
}
我沒有得到異常。 SimpMessagingTemplate
已被Spring成功注入,所以它不爲空。我已經能夠進入Spring代碼,並發現在使用SimpMessagingTemplate
時,SimpleBrokerMessageHandler
的subscriptionRegistry
爲空。所以它必須是一個獨立於控制器正在使用的實例。我怎樣才能得到控制器使用的相同的subscriptionRegistry
?
好奇,如果你找到了答案。從Spring ApplicationEvent類調用時會發生相同的行爲。 – 2014-09-28 23:12:28
很抱歉,經過這麼多時間後才能回到這裏。我已在下面發佈我的解決方案。 – battmanz 2015-03-04 18:39:15