JavaSpringWebSocket从其他应用程序发送回复

JavaSpringWebSocket从其他应用程序发送回复,java,spring,websocket,Java,Spring,Websocket,我有两个不同的JavaSpring应用程序。第一个使用websocket发送消息,它工作正常 客户: var socket = new SockJS('http://localhost:8080/myapp/hello'); stompClient = Stomp.over(socket); stompClient.connect({}, function(frame) { console.log('Connecte

我有两个不同的JavaSpring应用程序。第一个使用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应用程序发送对此消息的回复。我在那里有一个quartz作业,它扫描数据库并使用WebSocket向订阅的客户端发送回复。我希望每一位客户都能收到他唯一的信息,而不是广播

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并将其存储在某个地方,然后用于回复。另外,我应该创建应答的配置和控制器吗?我做错了什么

幸运的是,我设法解决了这个问题。首先,我没有找到直接从其他应用程序与页面交互的方法,我认为这是不可能的,因为需要连接。我决定在第一个有websocket连接到页面的应用程序上使用Jersey端点。所以,第二个应用调用第一个应用的RESTURL,然后第一个应用发送websocket消息

重要!重要

如果你的应用程序中有一个“/”上下文,例如映射到SpringMVC,则将其设置为/mvc或其他任何内容。因为如果您在spring中有多个上下文(根上下文和servlet上下文),SpringWebSocket消息传递基础设施将创建N组bean,其中N是您的内容数。所以我遇到了这样一种情况:WS-session在一个上下文中注册,而session check、convertAndSend方法等在另一个上下文中运行。我为此花了几个小时。如果您发现无法向订阅的会话发送消息,请转到

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

为空,请检查“/”上下文并使其不是“/”

幸运的是,我设法解决了这个问题。首先,我没有找到直接从其他应用程序与页面交互的方法,我认为这是不可能的,因为需要连接。我决定在第一个有websocket连接到页面的应用程序上使用Jersey端点。所以,第二个应用调用第一个应用的RESTURL,然后第一个应用发送websocket消息

重要!重要

如果你的应用程序中有一个“/”上下文,例如映射到SpringMVC,则将其设置为/mvc或其他任何内容。因为如果您在spring中有多个上下文(根上下文和servlet上下文),SpringWebSocket消息传递基础设施将创建N组bean,其中N是您的内容数。所以我遇到了这样一种情况:WS-session在一个上下文中注册,而session check、convertAndSend方法等在另一个上下文中运行。我为此花了几个小时。如果您发现无法向订阅的会话发送消息,请转到

org.springframework.messaging.simp.broker.DefaultSubscriptionRegistry#getSubscriptions(String destination, Message<?> message). 
为空,请检查“/”上下文并使其不是“/”