当前位置: 首页 > 知识库问答 >
问题:

Stomp订阅回调在Spring MVC中不起作用

李康安
2023-03-14

我用的是Spring MVC(4.2.2.RELEASE)和Tomcat 8。我的要求是向浏览器发送一个通知。请找到下面的代码。

控制器-------------------@Controller公共类MessageController{/@Autowired private SimpMessageTemplate模板;@Autowire private SimpMessageSendingOperations模板;列表noteList=new ArrayList();

    public MessageController() {
        SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
    }  
    //@SubscribeMapping("/topic/notify")
    //@SendToUser("/topic/notify")
    public void sendMessage(String msg){
        Notification note = new Notification();
        note.setMsg(msg);
        noteList.add(note);
        template.convertAndSend("/topic/price", noteList);
    }
}


Configuration
---------------
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfiguration extends AbstractWebSocketMessageBrokerConfigurer {

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

    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.setApplicationDestinationPrefixes("/app");
        registry.enableSimpleBroker("/queue","/topic");
    }

}

Client code
---------
var socket = new SockJS("/intl-fcstone/ws");
    var stompClient = Stomp.over(socket);
    var connectCallback = function() {
        console.log('----inside connectCallback before----');
        stompClient.subscribe('/topic/price', notifyUser);
        console.log('----inside connectCallback after----');
    };
    var errorCallback = function(error) {
        console.log('----inside errorCallback----');
        alert(error.headers.message);
    };
    stompClient.connect("guest", "guest", connectCallback, errorCallback);

    function notifyUser(frame) {
        console.log('----inside notifyUser1----'+frame);
        console.log('----inside notifyUser2----'+frame.body);
        var notes = JSON.parse(frame.body);
        console.log('----inside notifyUser3----'+notes);
        if(notes !=''){

            var $messageDiv = $('#notification_div'); // get the reference of the div
            $messageDiv.show().html(notes);
        }

Chrome console
---------------
Opening Web Socket...
stomp.js:134 Web Socket Opened...
stomp.js:134 >>> CONNECT
login:guest
passcode:guest
accept-version:1.1,1.0
heart-beat:10000,10000


stomp.js:134 <<< CONNECTED
version:1.1
heart-beat:0,0
user-name:suppliersin@gmail.com


stomp.js:134 connected to server undefined
(index):159 ----inside connectCallback before----CONNECTED
user-name:suppliersin@gmail.com
heart-beat:0,0
version:1.1


stomp.js:134 >>> SUBSCRIBE
id:sub-0
destination:/topic/price


(index):161 ----inside connectCallback after----CONNECTED
user-name:suppliersin@gmail.com
heart-beat:0,0
version:1.1

---------------------------

after this, nothing happens.

http://localhost:8080/intl-fcstone/ws/info shows

{
entropy: -646614392,
origins: [
"*:*"
],
cookie_needed: true,
websocket: true
}


Any help on this is much appreciated.

共有2个答案

林富
2023-03-14

此问题已得到解决。我在上下文中添加了一些行.xml

<websocket:message-broker application-destination-prefix="/app">
    <websocket:stomp-endpoint path="/ws">
        <websocket:handshake-interceptors>
            <bean class="org.springframework.web.socket.server.support.HttpSessionHandshakeInterceptor" />
        </websocket:handshake-interceptors>
        <websocket:sockjs session-cookie-needed="true" />
    </websocket:stomp-endpoint>
    <websocket:simple-broker prefix="/topic, /queue" />

    <websocket:client-inbound-channel>
        <websocket:executor core-pool-size="50"
                max-pool-size="100" keep-alive-seconds="60" />
    </websocket:client-inbound-channel>
    <websocket:client-outbound-channel>
        <websocket:executor core-pool-size="50"
                max-pool-size="100" keep-alive-seconds="60" />
    </websocket:client-outbound-channel>
    <websocket:broker-channel>
        <websocket:executor core-pool-size="50"
                max-pool-size="100" keep-alive-seconds="60" />
    </websocket:broker-channel>
</websocket:message-broker>

并使用

@Autowired private SimpMessageSendingOperations template; 

在我的控制器中。我也用了

template.convertAndSendToUser(authentication.getName(), "/queue/price", noteList);

其向特定用户发送通知。

最后,在客户端

user = frame.headers['user-name'];
stompClient.connect(user, user, connectCallback, errorCallback);
魏宸
2023-03-14

请关注这个Spring的网络口袋

 类似资料:
  • 通过选择,,和,我创建了一个全新的Spring初始化项目。 我做了一个小项目: 我试着将三个人保存到数据库中。保存方法只返回需要执行的Mono。如果我尝试通过简单的订阅来执行它,一切都很好: 但是,当我使用而不是时,应用程序挂起: 如果我手动查询数据库,我会看到Jim已被保存,但Jack和John未被保存。 这是窃听器,还是我做错了什么?我希望在代码进一步发展之前保证用户在数据库中,所以我真的很想

  • 我正在尝试让Spring WebSocket(Spring 4)在我一直在做的项目中工作。到目前为止,我已经打开了WebSocket,添加了订阅者并发送了消息。 从昨天开始,我一直在试图弄清楚为什么我的endpoint不处理HTML中包含的stomp客户端发送的消息。控制台中实际上也没有错误(好吧,我不完全确定这里的“连接到服务器未定义”是什么意思)。 以下是Chrome控制台的输出: 这是我的代

  • 我有一个websocket服务器和一个websocket客户端,都是Java的。websocket服务器具有以下功能: 在 Java 网页滑板客户端中,我在我的踩踏会话处理程序中提供了以下内容: 然后,我能够通过客户端向服务器路径“hello”发送消息来在两者之间进行通信,然后由于客户端订阅了“topic/greetings”,所以我也要用我的stompFrameHandler来处理响应。 但是我

  • 我正在开发一个利用websockets功能的Spring应用程序。为了使它更健壮,我使用了STOMP/SimpleBrokerMessageHandler,如文档中所述。一切进展顺利,我已经能够非常快速地连接javasctipt客户端,所以我转而使用“AndroidSync”库在Android客户端上工作。 我发现的事实是,Android客户端(我想其他客户端也是如此)在服务器处理订阅请求后没有收

  • 我正在尝试编写一个Spring服务,它订阅一个外部只读STOMP代理,并读取/处理它发布的消息。 铁路公司将消息推送到主题“/topic/TRAIN\u MVT\u ALL\u TOC”。我可以成功地连接到主题,但似乎无法将侦听器实例化为其消息。 我已经设置了一个Spring@Configuration类来连接它,在运行应用程序之后,它似乎连接正确。 我还创建了消息处理例程,使用@Message映

  • 问题内容: 我一直在尝试可以在网上找到的所有内容,但没有任何效果。希望大家能看到新的问题。这是我第一次使用ActionCable,在本地一切正常,但是当推送到heroku时。我的日志没有像我的开发服务器那样显示任何可操作的订阅: 在发送消息时,我确实看到了,但没有将它们追加,这是在猜测是否意味着未访问/调用该方法? 我确实在heroku的日志中注意到它说,开发人员正在localhost:3000监