使用Spring Websockets将消息发送到特定客户端

时间:2015-11-11 13:32:09

标签: spring spring-mvc websocket

所以我有一个Runnable类,一旦满足某个条件就应该调用notifyUser方法(String username,String content)。我一直试图让它工作但它总是失败NullPointerExceptions。这很可能与自动装配失败有关(因为Runnable类不是由Spring管理的)。在Spring管理的上下文中自动装配SimpMessagingTemplate工作得很好,方法可以做到他们应该做的事情。

我想要做的是调用SimpMessagingTemplate的方法(或类似的方法)convertAndSendToUser,但我无法在此上下文中自动装配它。到目前为止,我尝试过的所有内容都失败了,这就是为什么我认为我的一些基本概念出错了。

我的配置如下所示:

@Configuration
@EnableScheduling
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/test");
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/test").withSockJS();
    }
}

更新:我通过使用以下代码设法摆脱了NullPointerException ..但是客户端没有获取消息(convertAndSendToUser()以及convertAndSend())。开发人员控制台不显示任何传入消息。

AbstractApplicationContext ctx = new AnnotationConfigApplicationContext(Application.class);
ctx.getAutowireCapableBeanFactory().autowireBean(myService);

1 个答案:

答案 0 :(得分:1)

这是真的,因为你这样做:

new AnnotationConfigApplicationContext(Application.class);

在你的班级中,意味着开始新的appicationContext。但是您的user已在另一个上下文中注册。

目前尚不清楚为什么你不能让你的组件由Spring管理,但如果你无法访问SimpMessagingTemplate,则没有其他方法可以使用applicationContext

最好与我们分享您的代码以进行调查,并决定我们如何在那里提供帮助。

也许你可以在那里使用WebApplicationContextUtils ...