Я впервые внедряю приложение 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>