Ich habe erfolgreich eine einfache WebSockets-Anwendung mit Spring Boot mit dieser tutorial als Leitfaden implementiert. Die App kann sich erfolgreich mit dem STOMP-Endpunkt verbinden, das Thema abonnieren und eine Antwort zurück erhalten.Wie abonniere ich einen Feder Websocket Message Broker von einem externen Client?
Um mit diesem Microservices Trend zu halten, habe ich versucht, den Client extern zur Spring Boot App zu machen. Ich kann erfolgreich eine Verbindung zu dem STOMP-Endpunkt herstellen, indem ich http://localhost:8080/delivery-ws
verwende Ich kann jedoch nicht abonnieren und Updates von der Spring-Start-App abrufen, die http://localhost:8080/topic/openDeliveries
verwendet, wie erwartet.
Gibt es eine Möglichkeit, topic/openDeliveries
extern zu abonnieren?
WebSocketConfig.java
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/app");
}
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/delivery-ws").setAllowedOrigins("*").withSockJS();
}
}
DeliveryController.java
@Controller
@RequestMapping("deliveries")
public class DeliveryController {
private DeliveryRepository repository;
SimpMessagingTemplate template;
@Autowired
public DeliveryController(DeliveryRepository repository, SimpMessagingTemplate template) {
this.repository = repository;
this.template = template;
}
public void updateListandBroadcast() {
System.out.println("in update and broadcast");
template.convertAndSend("/topic/openDeliveries", getOpenDeliveries());
}
public List<Delivery> getOpenDeliveries() {
return repository.findByDeliveredFalse();
}
@RequestMapping(value = "/new", method = RequestMethod.POST)
public @ResponseBody Delivery newDelivery(@RequestBody Delivery delivery) {
Delivery d = repository.save(delivery);
updateListandBroadcast();
return d;
}
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE)
public @ResponseBody void delete(@PathVariable String id) {
repository.delete(Long.parseLong(id));
updateListandBroadcast();
}
}
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Active Deliveries</title>
<script src="sockjs-0.3.4.js"></script>
<script src="stomp.js"></script>
<script src="jquery-3.0.0.js"></script>
<script type="text/javascript">
var stompClient = null;
function setConnected(connected) {
document.getElementById('connect').disabled = connected;
document.getElementById('disconnect').disabled = !connected;
document.getElementById('conversationDiv').style.visibility = connected ? 'visible' : 'hidden';
document.getElementById('response').innerHTML = '';
}
function connect() {
var socket = new SockJS('http://localhost:8080/delivery-ws');
stompClient = Stomp.over(socket);
stompClient.connect({}, function(frame) {
setConnected(true);
console.log('Connected: ' + frame);
stompClient.subscribe('http://localhost:8080/openDeliveries', function(deliveryList) {
console.log('in callback for opendelivery topic');
showDeliveries(deliveryList);
});
});
}
function disconnect() {
if (stompClient != null) {
stompClient.disconnect();
}
setConnected(false);
console.log("Disconnected");
}
function showDeliveries(list) {
console.log('in show deliveries');
var response = document.getElementById('response');
response.innerHTML = list.body;
}
</script>
</head>
<body onload="disconnect()">
<h1>Deliveries</h1>
<noscript>
<h2 style="color: #ff0000">Seems your browser doesn't support Javascript! Websocket relies on Javascript being enabled. Please enable
Javascript and reload this page!</h2>
</noscript>
<div>
<div>
<button id="connect" onclick="connect();">Connect</button>
<button id="disconnect" disabled="disabled" onclick="disconnect();">Disconnect</button>
</div>
<div id="conversationDiv">
<p id="response"></p>
<table id="data-table"></table>
</div>
</div>
</body>
</html>
dies hat den Trick! Ich kann nicht glauben, dass ich das nicht versucht habe. –