我正在使用Spring 4 Web套接字。 我有一个STOMP客户端。我想从客户端向STOMP服务器发送消息,STOMP服务器应该将数据返回给发送数据的同一个客户端。
这是我的代码。在WebSocketConfig中,我使用队列作为消息代理。
WebSocketConfig.java
package com.apple.store.datamonitor.dashboard.config;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.messaging.simp.config.MessageBrokerRegistry;
import org.springframework.web.socket.WebSocketHandler;
//import org.springframework.web.socket.config.WebSocketMessageBrokerStats;
import org.springframework.web.socket.config.annotation.AbstractWebSocketMessageBrokerConfigurer;
import org.springframework.web.socket.config.annotation.EnableWebSocketMessageBroker;
import org.springframework.web.socket.config.annotation.StompEndpointRegistry;
import com.apple.store.datamonitor.dashboard.websocket.ChartHandler;
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@PostConstruct
public void init() {
// webSocketMessageBrokerStats.setLoggingPeriod(10 * 1000); // desired time in millis
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/charthandler").withSockJS();
}
@Bean
public WebSocketHandler chartHandler() {
return new ChartHandler();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/queue");
config.setApplicationDestinationPrefixes("/app");
}
}
ChartUpdateHandler.java。
问候方法中的代码与此问题无关。假设它将一个简单的对象返回给客户端。
package com.apple.store.datamonitor.dashboard.websocket.controller;
import java.util.ArrayList;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.messaging.handler.annotation.MessageMapping;
import org.springframework.messaging.handler.annotation.SendTo;
import org.springframework.stereotype.Controller;
import com.apple.store.datamonitor.dashboard.domain.chart.BarData;
import com.apple.store.datamonitor.dashboard.domain.chart.BarDataWrapper;
import com.apple.store.datamonitor.dashboard.domain.report.Result;
@Controller
public class ChartUpdateController {
private static final Logger log = LoggerFactory.getLogger(ChartUpdateController.class);
@MessageMapping("/charthandler")
@SendTo("/queue/update")
public BarDataWrapper greeting(Result r) throws Exception {
// Thread.sleep(3000); // simulated delay
BarData data1 = new BarData(2, 0, 10, 0, 0, 0, 0, 2);
data1.setYaxis("11-05-2016 01:00:00");
List list1= new ArrayList<BarData>() {
{
add(data1);
}
};
BarData data2 = new BarData(5, 10, 50, 1, 1, 1, 2, 3);
data2.setYaxis("11-05-2016 01:00:00");
List list2= new ArrayList<BarData>() {
{
add(data2);
}
};
BarDataWrapper bd = new BarDataWrapper(list1, list2);
return bd;
}
}
@MessageMapping(/ charthandler) - 用于stomp客户端将数据发送到服务器 @SendTo(“/ queue / update”) - 这是服务器将数据推送回队列的地方。服务器客户端将监听队列。
这是我的Javascript。
$(document).ready(function() {
var socket = new SockJS('/datamonitordashboard/charthandler/');
stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
console.log('Connected: ' + frame);
stompClient.subscribe('/queue/update', function(result) {
console.log("l2 " + JSON.parse(result.body).l2List);
});
});
$('#sendInfo').click(function(e) {
sendData();
});
}
function sendData() {
var result = {
title: "hello",
sortOrder: "desc",
};
console.log(JSON.stringify(result));
stompClient.send("/app/charthandler", {
priority: 9
}, JSON.stringify(result));
}
在DOM准备好之后,我连接到stomp服务器,我正在使用bind绑定sendData()方法。现在它将数据发送到stomp服务器。
现在我打开了2个浏览器。从第一个浏览器我单击发送按钮,它将结果对象推送到StompServer,STOMP服务器将数据返回到第二个浏览器,这意味着,我在第二个浏览器中看到日志输出。 console.log(“l2”+ JSON.parse(result.body).l2List);
我想从客户端(浏览器1)向STOMP服务器发送消息,STOMP服务器应该将数据返回给同一个客户端(浏览器1)?它是如何做到的?
如果我将消息代理更改为主题而不是队列,则在我的WebSocketConfig中,它将消息发送到客户端浏览器1和浏览器2.我想将数据发送回同一客户端?
config.enableSimpleBroker( “/话题”);
我需要改变方法吗?针对上述问题的任何解决方案?