java spring websocket从其他应用程序发送回复

问题描述:

我有两个不同的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的某个地方,然后用于回复。另外,我应该创建配置和控制器来回复,我做错了什么?

幸运的是,我已经设法解决了这种情况。首先,我没有找到直接从其他应用程序与页面交互的方式,我相信这是不可能的,因为连接是必需的。我决定在第一个应用程序上使用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() 

是空的,请检查你的“/”上下文和让它不是“/”。