如何在 Spring ApplicationListener (SessionConnectedEvent) 中发送消息
How do I send a message in an Spring ApplicationListener (SessionConnectedEvent)
我在 SockJS 上使用 Stomp 和 Spring 消息传递。我正在尝试在连接新用户时向所有登录用户发送消息。所以首先是我的听众:
@Component
public class SessionConnectedListener implements ApplicationListener<SessionConnectedEvent> {
private static final Logger log = LoggerFactory.getLogger(SessionConnectedListener.class);
@Autowired
private SimpMessagingTemplate template;
@Override
public void onApplicationEvent(SessionConnectedEvent event) {
log.info(event.toString());
// Not sure if it's sending...?
template.convertAndSend("/topic/login", "New user logged in");
}
}
我的 WebSocket 配置
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("chat").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic", "/queue");
config.setApplicationDestinationPrefixes("/app");
}
}
我的 JS 配置
var socket = new SockJS('/chat');
stompClient = Stomp.over(socket);
stompClient.connect({}}, function(frame) {
// ... other working subscriptions
stompClient.subscribe("/topic/login", function(message) {
console.log(message.body);
});
});
我的问题是我的 template.convertAndSend() 在 ApplicationListener 中不起作用。但是,如果我将它放在一个用@MessageMapping 注释的控制器方法中,它将起作用,并且我将有一个控制台日志客户端。
所以我的问题是:template.convertAndSend() 可以在 ApplicationListener 中工作吗?如果是这样,如何?还是我遗漏了什么?
感谢您的帮助!
PS : 我的 log.info(event.toString());在 ApplicationListener 中工作,所以我知道我正在进入 onApplicationEvent() 方法。
在 ApplicationListener
内使用模板发送消息应该可以。请查看此 Spring WebSocket Chat 示例作为示例。
好的!可能很奇怪,我的监听器在以下包中:
package my.company.listener;
但是由于我在应用上下文中的配置,convertAndSend() 方法无法正常工作。
@ComponentScan(basePackages = { "my.company" }, excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = { "my.company.web.*" }))
然而,当我将我的监听器(用@Component 注释)移动到 web 子包时,它起作用了!
package my.company.web.listener;
我在 SockJS 上使用 Stomp 和 Spring 消息传递。我正在尝试在连接新用户时向所有登录用户发送消息。所以首先是我的听众:
@Component
public class SessionConnectedListener implements ApplicationListener<SessionConnectedEvent> {
private static final Logger log = LoggerFactory.getLogger(SessionConnectedListener.class);
@Autowired
private SimpMessagingTemplate template;
@Override
public void onApplicationEvent(SessionConnectedEvent event) {
log.info(event.toString());
// Not sure if it's sending...?
template.convertAndSend("/topic/login", "New user logged in");
}
}
我的 WebSocket 配置
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("chat").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic", "/queue");
config.setApplicationDestinationPrefixes("/app");
}
}
我的 JS 配置
var socket = new SockJS('/chat');
stompClient = Stomp.over(socket);
stompClient.connect({}}, function(frame) {
// ... other working subscriptions
stompClient.subscribe("/topic/login", function(message) {
console.log(message.body);
});
});
我的问题是我的 template.convertAndSend() 在 ApplicationListener 中不起作用。但是,如果我将它放在一个用@MessageMapping 注释的控制器方法中,它将起作用,并且我将有一个控制台日志客户端。
所以我的问题是:template.convertAndSend() 可以在 ApplicationListener 中工作吗?如果是这样,如何?还是我遗漏了什么?
感谢您的帮助!
PS : 我的 log.info(event.toString());在 ApplicationListener 中工作,所以我知道我正在进入 onApplicationEvent() 方法。
在 ApplicationListener
内使用模板发送消息应该可以。请查看此 Spring WebSocket Chat 示例作为示例。
好的!可能很奇怪,我的监听器在以下包中:
package my.company.listener;
但是由于我在应用上下文中的配置,convertAndSend() 方法无法正常工作。
@ComponentScan(basePackages = { "my.company" }, excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = { "my.company.web.*" }))
然而,当我将我的监听器(用@Component 注释)移动到 web 子包时,它起作用了!
package my.company.web.listener;