Невозможно получить ответ от convertAndSendToUser + Stomp + Websocket + Spring boot - PullRequest
0 голосов
/ 08 марта 2020

Я впервые внедряю приложение WebSocket с использованием STOMP + брокер в памяти. Я хочу иметь возможность отправлять данные только клиенту, который их запросил. Я достиг точки, когда сообщение не передается всем пользователям. Однако клиент также не получает ответ.

Клиент подписался на очередь, но очередь не получает сообщение, которое кажется. Я убедился, что convertAndSendToUser вызывается с именем пользователя, и до тех пор исключений не было.

Ниже приведен мой код для обзора. Может кто-нибудь сказать мне, где я иду не так?

Консоль браузера:

Opening Web Socket...
stomp.min.js:9 Web Socket Opened...
stomp.min.js:9 >>> CONNECT
accept-version:1.2,1.1,1.0
heart-beat:10000,10000


stomp.min.js:9 <<< CONNECTED
version:1.2
heart-beat:0,0


stomp.min.js:9 connected to server undefined
app.js:15 Connected: CONNECTED
heart-beat:0,0
version:1.2

stomp.min.js:9 >>> SUBSCRIBE
id:sub-0
destination:/user/client-63/queue/totalsales


stomp.min.js:9 >>> SEND
destination:/app/getsales.client-63
content-length:14

{"data":"asd}

WebSocketBrokerConfig:

package com.hyb.enterprisedashboard.api.websocket;

import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import org.springframework.web.socket.config.annotation.WebSocketMessageBrokerConfigurer;

@Configuration 
@EnableWebSocketMessageBroker
public class WebSocketBrokerConfig implements WebSocketMessageBrokerConfigurer  {

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

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {

        registry
          .addEndpoint("/dashboardsocket")
          .setHandshakeHandler(new CustomHandshakeHandler()).withSockJS();
            }
}

Класс контроллера:

@Controller
public class DashboardController {

@Autowired
DashboardUtil dashboardutil;

@Autowired
private SimpMessagingTemplate simpMessagingTemplate;

@MessageMapping("/getsales.{username}")
    public void getTotalSales(@Payload String message, @DestinationVariable String username) throws Exception {
        String jsonString = "";
        try {
            jsonString = dashboardutil.getDataInJSON();
            this.simpMessagingTemplate.convertAndSendToUser(username, "/queue/totalsales", jsonString);
        } catch (Exception e) {

        }
    }

приложение. js

var ws;
var userId;
function setConnected(connected) {
    $("#connect").prop("disabled", connected);
}

function connect() {
    ws = new SockJS('/dashboardsocket');
    stompClient = Stomp.over(ws);
    userId = Math.floor((Math.random() * 100) + 1);
    stompClient.connect({}, function (frame) {
        setConnected(true);
        console.log('Connected: ' + frame);

    stompClient.subscribe("/user/client-"+userId+"/queue/totalsales", function (message) {
            printText(message);
        });

    });
    setConnected(true);
}

function sendData() {

    stompClient.send("/app/getsales.client-"+userId, {}, JSON.stringify({'data':$("#data").val()}));
}

function printText(message) {
    $("#textboard").append("<tr><td> " + message + "</td></tr>");
}

$(function() {
    $("form").on('submit', function(e) {
        e.preventDefault();
    });
    $("#connect").click(function() {
        connect();
    });

    $("#send").click(function() {
        sendData();
    });
});

индекс. html

<!DOCTYPE html>
<html>
<head>
    <title>WebSocket Chat Application</title>
    <link href="/bootstrap.min.css" rel="stylesheet">
    <link href="/style.css" rel="stylesheet">
    <script src="/jquery-1.10.2.min.js"></script>
    <script src="/app.js"></script>
     <script src="/sockjs.js"></script>
     <script src="/stomp.min.js"></script>
</head>
<body>
<div id="main-content" class="container">
    <div class="row">
        <div class="col-md-8">
            <form class="form-inline">
                <div class="form-group">
                    <label for="connect">Dashboard test</label>
                    <button id="connect" type="button">Connect</button>
                </div>
            </form>
        </div>
    </div>
    <div class="row">
        <div class="col-md-12">
            <table id="chat">
                <thead>
                <tr>
                    <th> Enter text</th>
                </tr>
                </thead>
                <tbody id="textboard">
                </tbody>
            </table>
        </div>
            <div class="row">

        <div class="col-md-6">
            <form class="form-inline">
                <div class="form-group">
                    <textarea id="data" placeholder="Write your message here..." required></textarea>
                </div>
                <button id="send" type="submit">Send</button>
            </form>
        </div>
        </div>
    </div>

</div>
</body>
</html>
...