java spring websocket发送来自其他应用程序的回复

时间:2017-03-01 11:41:48

标签: java spring 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然后用于回复。另外,我应该创建用于回复的配置和控制器以及我做错了什么?

1 个答案:

答案 0 :(得分:0)

幸运的是我设法解决了这种情况。首先,我没有找到直接与其他应用程序进行页面交互的方法,我认为这是不可能的,因为需要连接。我决定在第一个应用程序上使用Jersey端点,该应用程序与页面具有websocket连接。因此,第二个应用程序调用第一个应用程序的REST URL,然后第一个应用程序发送websocket消息。

重要事项!!!!!

如果您的应用中有" /"映射到例如spring-mvc的上下文,使它/ mvc或其他任何东西。因为如果在spring(root和servlet上下文)中有多个上下文,spring websocket消息传递基础结构会创建N组bean,其中N是内容的编号。所以我遇到了WS会话在一个上下文中注册的情况,但会话检查,convertAndSend方法等在其他上下文中运行。我花了几个小时。如果您发现无法向订阅会话发送消息的情况,请转到

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

如果你看到

subscriptionRegistry.getAllSubscriptions()

为空,请检查您的&#34; /&#34;上下文并使其不是&#34; /&#34;。