3

我正在使用 Stomp over SockJS 和 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 注释的 Controller 方法中,它将起作用,并且我将拥有一个控制台日志客户端。

所以我的问题是:template.convertAndSend()可以在ApplicationListener中工作吗?如果是这样,怎么做?还是我错过了什么?

谢谢您的帮助!

PS:我的log.info(event.toString()); 在 ApplicationListener 中工作,所以我知道我正在进入 onApplicationEvent() 方法。

4

2 回答 2

0

使用模板发送消息ApplicationListener应该可以。请查看此Spring WebSocket Chat示例以获取示例。

于 2015-06-18T09:50:27.810 回答
0

好的!尽管它可能很奇怪,但我的 Listener 在以下包中:

package my.company.listener;

但是由于我在 App 上下文中的配置,convertAndSend()方法不起作用。

@ComponentScan(basePackages = { "my.company" }, excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = { "my.company.web.*" }))

但是,当我将侦听器(使用 @Component 注释)移动到web子包时,它起作用了!

package my.company.web.listener;

于 2015-08-05T00:25:46.233 回答