【发布时间】:2018-03-28 13:29:55
【问题描述】:
场景: 客户端(angular js 1.4)将调用 Rest 端点获取数据,服务器(spring boot)将处理文件列表并返回准确的数据。要处理文件列表,服务器将根据文件数量花费时间。所以我实现了 STOMP 通知,以向客户端发送通知,说“文件列表已被处理,这是一堆文件(结果)”。
问题: Stomp 连接建立成功,客户端也订阅了,但是当服务器发布事件时,客户端无法接收。
下面是我的代码sn-p:
WebSocketConfig.java
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/ws").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
registry.setApplicationDestinationPrefixes("/app");
registry.enableSimpleBroker("/topic"); // Enables a simple in-memory broker
}
}
SocketController.java
@Controller
public class SocketController {
@SendTo("/topic/public")
public String sendMessage() {
LOGGER.info("====> chatMessage()");
return "List updated successfully";
}
}
main.js
connect() {
var socket = new SockJS('/ws');
var stompClient = Stomp.over(socket);
event.preventDefault();
console.log("socket: ", socket);
console.log("stompClient: ", stompClient);
stompClient.connect({}, function (frame) {
console.log('Connected: ' + frame);
stompClient.subscribe('/topic/public', function (payload) {
console.log("payload: ", payload);
var message = JSON.parse(payload.body);
console.log("message: ", message);
});
}, function (error) {
console.log("onError() called");
console.log("error: ",error);
});
};
使用的脚本:
<script src="https://cdnjs.cloudflare.com/ajax/libs/sockjs-client/1.1.4/sockjs.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/stomp.js/2.3.3/stomp.min.js"></script>
main.js 的connect() 方法在按钮点击时被调用。我猜可能存在关于范围的问题。
【问题讨论】:
标签: java angularjs spring-boot sockjs