簡體   English   中英

java spring websocket發送來自其他應用程序的回復

[英]java spring websocket send reply from other application

我有兩個不同的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然后用於回復。 另外,我應該創建用於回復的配置和控制器以及我做錯了什么?

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

重要的重要!!!!!

如果你的應用程序中有一個“/”上下文,例如,映射到spring-mvc,make / mvc或其他任何內容。 因為如果在spring(root和servlet上下文)中有多個上下文,spring websocket消息傳遞基礎結構會創建N組bean,其中N是內容的編號。 所以我遇到了WS會話在一個上下文中注冊的情況,但會話檢查,convertAndSend方法等在其他上下文中運行。 我花了幾個小時。 如果您看到無法向訂閱會話發送消息的情況,請轉到

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

如果你看到了

subscriptionRegistry.getAllSubscriptions()

是空的,請檢查您的“/”上下文並使其不是“/”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM