Tôi đang sử dụng khuôn khổ mùa xuân và tôi có một bộ điều khiển WebSocket làm việc đó trông như thế này:Gửi tin nhắn cho tất cả các khách hàng thông qua SimpMessagingTemplate trong ServletContextListener
@Controller
public class GreetingController {
@MessageMapping("/hello")
@SendTo("/topic/greetings")
public Greeting greeting(HelloMessage message) throws InterruptedException {
return new Greeting("Hello, " + message.getName() + "!");
}
}
Tôi cũng có cấu hình này:
@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();
}
}
Phần đó hoạt động rất tốt! Tôi có thể gửi và nhận thành công tin nhắn giữa hai hoặc nhiều trình duyệt bằng cách sử dụng Stomp.js. Đây là phần không hoạt động. Tôi đã thực hiện một ServletContextListener
có chứa một đối tượng tùy chỉnh mà, vì lợi ích đơn giản, tôi đã gọi là 'notifier'. Trình thông báo sẽ lắng nghe các sự kiện nhất định xảy ra ở phía máy chủ. Sau đó nó gọi phương thức 'thông báo', được cho là gửi chi tiết về sự kiện cho tất cả khách hàng. Nó không hoạt động, mặc dù.
@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 + "!"));
}
}
Tôi không nhận được một ngoại lệ. Các SimpMessagingTemplate
đã được tiêm thành công bởi mùa xuân, do đó, nó không phải là null. Tôi đã có thể bước vào mã Spring và đã tìm ra rằngcủa SimpleBrokerMessageHandler
bị trống khi sử dụng SimpMessagingTemplate
. Vì vậy, nó phải là một trường hợp riêng biệt từ một trong đó các bộ điều khiển đang sử dụng. Làm thế nào tôi có thể nhận được cùng một subscriptionRegistry
được sử dụng bởi các bộ điều khiển?
Tò mò nếu bạn tìm thấy một câu trả lời. Hành vi tương tự xảy ra khi gọi từ lớp Spring ApplicationEvent. –
Xin lỗi vì đã quay lại điều này sau rất nhiều thời gian. Tôi đã đăng giải pháp của tôi dưới đây. – battmanz