2017-03-01 56 views
1

我有兩個不同的java彈簧應用程序。第一個使用websocket發送消息,它工作正常。java spring websocket從其他應用程序發送回覆

客戶端:

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); 
       }); 
      }); 

服務器:

@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"); 
    } 

它工作正常,但我需要從其他java應用另一臺服務器上發送到這個消息的答覆。我在那裏有一個石英工作,它掃描數據庫並使用websockets將訂閱響應發送給訂閱的客戶端。我希望每個客戶都只能收到他的消息,而不是廣播。

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

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

和配置在兩種情況下:

@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(); 
     } 

    } 

我不明白如何從其他應用程序發送正確的消息。我想我需要檢索並存儲sessionId的某個地方,然後用於回覆。另外,我應該創建配置和控制器來回復,我做錯了什麼?

回答

0

幸運的是,我已經設法解決了這種情況。首先,我沒有找到直接從其他應用程序與頁面交互的方式,我相信這是不可能的,因爲連接是必需的。我決定在第一個應用程序上使用Jersey端點,該應用程序具有與該頁面的websocket連接。因此,第二個應用程序調用第一個應用程序的REST url,然後第一個應用程序發送websocket消息。

重要重要!!!!!

如果您的應用程序中有一個「/」上下文映射到spring-mvc,使其成爲/ mvc或其他任何內容。因爲如果Spring中有多個上下文(根和servlet上下文),spring websocket消息傳遞基礎結構會創建N組bean,其中N是您的內容數。所以我遇到了一個情況,當WS會話被註冊在一個上下文中,但會話檢查,convertAndSend方法等運行在其他上下文中。我花了幾個小時。如果你看到時,你不能將消息發送給訂閱會話的情況下,請到

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

如果你看到

subscriptionRegistry.getAllSubscriptions() 

是空的,請檢查你的「/」上下文和讓它不是「/」。

相關問題