2017-03-01 4 views
1

Ich habe zwei verschiedene java frühling anwendungen. Der erste sendet eine Nachricht mit Websocket und es funktioniert gut.java feder websocket senden antwort von anderen anwendung

Client:

var socket = new SockJS('http://localhost:8080/myapp/hello'); 
      stompClient = Stomp.over(socket); 
      stompClient.connect({}, function(frame) { 
       console.log('Connected: ' + frame); 
       stompClient.subscribe('/topic/greeting', function(greeting){ 
        console.log(greeting.body); 
        //showGreeting(JSON.parse(greeting.body).content); 
       }); 
      }); 

Server:

@MessageMapping("/send/{widgetId}") 
    public Greeting userMessage(@DestinationVariable String widgetId, 
      UserMessageWrapper userMessageWrapper) throws Exception { 
     dispatchMessage(widgetId, userMessageWrapper.getUserToken(), 
       userMessageWrapper.getMessage(), userMessageWrapper.getUserAgent()); 
     return new Greeting("asdasdsa"); 
    } 

Es funktioniert gut, aber ich brauche eine Antwort auf diese Nachricht von anderen Java-Anwendung auf andere Server zu senden. Ich habe einen Quarz-Job dort und es scannt db und sendet Antworten an abonnierte Clients mit WebSockets. Ich möchte, dass jeder Klient nur eine Nachricht für ihn empfängt, keine Sendung.

public void callJSWebSocket(){ 
    SimpMessageHeaderAccessor headerAccessor = SimpMessageHeaderAccessor 
      .create(SimpMessageType.MESSAGE); 
    headerAccessor.setSubscriptionId("sub-0"); 
    headerAccessor.setLeaveMutable(true); 

    messagingTemplate.convertAndSendToUser("user","/topic/greeting", 
      "asdsadasd1212"); 
} 

und Konfiguration in beiden Fällen:

@Configuration 
@EnableWebSocketMessageBroker 

    public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer { 

     @Override 
     public void configureMessageBroker(MessageBrokerRegistry config) { 
      config.enableSimpleBroker("/topic"); 
      config.setApplicationDestinationPrefixes("/ws"); 
     } 

     @Override 
     public void registerStompEndpoints(StompEndpointRegistry registry) { 
      registry.addEndpoint("/hello").setAllowedOrigins("*").withSockJS(); 
     } 

    } 

Ich verstehe nicht, wie Nachricht von einer anderen Anwendung richtig zu senden. Ich denke, ich muss sessionId irgendwo abrufen und speichern und dann für die Antwort verwenden. Außerdem, sollte ich Config und Controller für die Antwort erstellen und was mache ich falsch?

Antwort

0

Glücklicherweise habe ich es geschafft, diese Situation zu lösen. Erstens habe ich keine Möglichkeit gefunden, direkt mit anderen Anwendungen zu interagieren, und ich glaube, dass dies nicht möglich ist, da eine Verbindung erforderlich ist. Ich entschied mich, einen Jersey-Endpunkt für die erste App zu verwenden, die über eine Websocket-Verbindung mit der Seite verfügt. Die zweite App ruft die REST-URL der ersten App auf und die erste App sendet eine Websocket-Nachricht.

WICHTIG WICHTIG !!!!!

Wenn Sie in Ihrer App ein "/" -Kontext haben, der z. B. Spring-Mvc zugeordnet ist, machen Sie es/mvc oder irgendetwas anderes. Wenn Sie im Frühjahr mehr als einen Kontext haben (Root- und Servlet-Kontexte), erstellt die Federwebsocket-Messaging-Infrastruktur N Mengen von Beans, wobei N die Anzahl Ihrer Inhalte ist. Ich sah mich also einer Situation gegenüber, in der die WS-Sitzung in einem Kontext registriert wurde, aber die Sitzungsüberprüfung, die convertAndSend-Methode usw. in einem anderen Kontext ausgeführt wurde. Ich habe einige Stunden damit verbracht. Wenn Sie eine Situation sehen, wenn Sie eine Nachricht nicht abonniert Sitzung senden können, gehen Sie bitte auf

org.springframework.messaging.simp.broker.DefaultSubscriptionRegistry#getSubscriptions(String destination, Message<?> message). 

Und wenn Sie sehen, dass

subscriptionRegistry.getAllSubscriptions() 

leer ist, überprüfen Sie bitte Ihre „/“ Kontext und mach es nicht "/".