Spring Websocket:没有从SimpMessagingTemplate接收到任何信息



我目前在Spring-MVC webapp中使用Websockets随时向spring-security认证的用户发送通知。关键是通知用户,而不需要任何页面刷新或用户交互(比如Facebook)。

因此,我使用Spring的SimpMessagingTemplate

看起来(如在浏览器控制台上看到的)客户端订阅正确,并且SimpMessagingTemplate实际上发送了一条消息(调试Spring代码显示一个愉快的流程发生,sent == true等)。然而,在客户端什么也没发生——这就是问题所在。

经过几个小时的重新阅读参考,其他Stackoverflow帖子等(做同样的事情在这里..),我找不到合适的解决方案。唯一的区别是,我有一个重复的websocket配置,这可能是我的麻烦的原因,但我不能摆脱(更多关于下面:见dispatcher-servlet.xmlapplicationContext.xml)。

客户端,我这样订阅:

<script>
    var socket = new SockJS('/stomp');
    var client = Stomp.over(socket);
    client.connect({}, function(s) {
            client.subscribe('/user/queue/notify', function (msg) {
            alert('SHOULD SEE THIS.. BUT DOES NOT WORK');
            console.log("SHOULD SEE THIS.. BUT DOES NOT WORK");
        });
    });
</script>

我有一个控制器,发送一个简单的消息给用户"niilzon"每10秒(这只是一个简单的测试,当然)

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.messaging.simp.SimpMessagingTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Controller;
@Controller
public class WebsocketTestController {
    @Autowired
    private SimpMessagingTemplate messagingTemplate;
    @Scheduled(fixedDelay = 10000)
    public void sendStuff() {
        messagingTemplate.convertAndSendToUser("niilzon", "/queue/notify", "SEEING THIS WOULD BE GREAT");
    }
}

浏览器控制台,"niilzon"用户登录后:

<<< CONNECTED
version:1.1
heart-beat:0,0
user-name:niilzon
connected to server undefined
>>> SUBSCRIBE
id:sub-0
destination:/user/queue/notify

下面是XML配置:

dispatcher-servlet.xml:

<!-- TODO this is duplicated in applicationContext !
 If removing the websocket tag in dispatcher-servlet : 404 when client tries to connect to /stomp
 If removing the websocket tag in applicationContext : cannot autowire SimpMessagingTemplate in WebsocketTestController
 -->
<websocket:message-broker>
    <websocket:stomp-endpoint path="/stomp">
        <websocket:sockjs/>
    </websocket:stomp-endpoint>
    <websocket:simple-broker prefix="/topic,/queue"/>
</websocket:message-broker>

applicationContext.xml:

<websocket:message-broker>
    <websocket:stomp-endpoint path="/stomp">
        <websocket:sockjs/>
    </websocket:stomp-endpoint>
    <websocket:simple-broker prefix="/topic,/queue"/>
</websocket:message-broker>

dispatcher-servlet.xml所述,websocket配置在applicationContext.xml中重复。如果我删除dispatcher-servlet.xml中的标记,客户端在尝试连接时得到404。如果我在applicationContext.xml中删除标签,SimpMessagingTemplate不能在WebsocketTestController中自动连接。

配置重复可能是问题的一部分吗?这是我唯一的线索了,但我无法弥补。需要注意的一件重要事情是,在这两个xml文件之间有一些其他配置标记是重复的。下面是两个配置文件之间的所有重复,放在一起(加上上面看到的websocket配置):

<import resource="spring-security.xml"/>
<context:component-scan base-package="com.beatboxnow.**"/>
<tx:annotation-driven />
<!-- TODO merge / inherit contexts instead of this dupe ? How ? same with tx:annotationDriven -->
<cache:annotation-driven />
<bean id="cacheManager" class="org.springframework.cache.ehcache.EhCacheCacheManager">
    <property name="cacheManager" ref="ehcache"/>
</bean>
<bean id="ehcache" class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean">
    <property name="configLocation" value="classpath:ehcache.xml"/>
    <property name="shared" value="true"/>
</bean>

web应用的其他部分没有问题,它有很多视图、控制器、服务、存储库等。

感谢这个StackOverflow帖子在这里加载mvc-dispatcher-servlet.xml和applicationContext.xml?,我设法合并在dispatcher-servletapplicationContext XML的重复。

窍门就是像这样在dispatcher-servlet中导入applicationContext:
<import resource="applicationContext.xml" />

,并删除所有重复项(显然不触及applicationContext.xml中的任何标签)。

我从这个项目开始就有这个部分配置重复的问题,并计划稍后删除它-当时尝试了导入,但当时我没有设法做到这一点。现在这个Websocket问题迫使我再试一次(复制之前没有阻塞),令人惊讶的是,它工作得很完美,我想我在第一次尝试时犯了一个愚蠢的错误,因为它实际上是相当微不足道的:)

相关内容

  • 没有找到相关文章

最新更新