2016-07-08 9 views
0

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>

Antwort

1

Sie müssen die URL ändern, die Sie abonnieren möchten. So etwas wie dieses:

Sobald die Verbindung zum Socket-Endpunkt hergestellt ist, müssen Host und Port nicht im Abonnement definiert werden.

+0

dies hat den Trick! Ich kann nicht glauben, dass ich das nicht versucht habe. –