Как я могу передать данные с сервера конкретному клиенту, используя весеннюю загрузку webSocket rabbitmq - PullRequest
0 голосов
/ 09 января 2019

У меня есть сервер rabbitmq, на котором я использую данные, и я хочу отправить данные с помощью веб-сокета конкретному подключенному пользователю. если я использую / topic / message, все клиенты получают сообщение, но я хочу отправить данные определенному пользователю. Это сторона клиента:

    function connect() {
        var socket = new SockJS('/message');
        stompClient = Stomp.over(socket);
        stompClient.connect({}, function(frame) {
            setConnected(true);
            console.log('Connected : ' + frame);
            stompClient.subscribe('/user/queue/reply', function(msg){
                showGreeting(JSON.parse(msg.body).content);
            });
        });
    }

и файл конфигурации webSocket:

    @Configuration
    @EnableWebSocketMessageBroker
    public class WebSocketConfig  implements 
    WebSocketMessageBrokerConfigurer{
    private static final Logger log = 
    LoggerFactory.getLogger(WebSocketConfig.class);

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
    config
            .setUserDestinationPrefix("/user")
            .setApplicationDestinationPrefixes("/app")
            .enableSimpleBroker("/topic", "/queue", "/user");
}

   @Override
   public void registerStompEndpoints(StompEndpointRegistry registry) {
   registry.addEndpoint("/message").addInterceptors(new 
   HttpHandshakeInterceptor()).setAllowedOrigins("*").withSockJS();
}

}

и HttpHandshakeInterceptor:

    public class HttpHandshakeInterceptor implements HandshakeInterceptor {

@Override
public boolean beforeHandshake(ServerHttpRequest request, 
   ServerHttpResponse response, WebSocketHandler wsHandler,
                               Map<String, Object> attributes) throws 
   Exception {
    if (request instanceof ServletServerHttpRequest) {
        ServletServerHttpRequest servletRequest = 
    (ServletServerHttpRequest) request;
        HttpSession session = 
    servletRequest.getServletRequest().getSession();
        attributes.put("sessionId", session.getId());
    }
    return true;
}
    }

и это контроллер, на котором я получаю данные rabbitmq и хочу отправить их конкретному пользователю:

@RabbitListener(queues="${jsa.rabbitmq.queue}")
public void receivedStatus(byte[] msg) {

    String str = new String(msg, StandardCharsets.UTF_8);
    JSONParser jsonParser=new JSONParser();
    JSONArray clsArray = null;
    JSONArray clsRet = new JSONArray();
    JSONObject json_data = null;
    Object obj;
    try {
        obj = jsonParser.parse(str);
        clsArray = (JSONArray) obj;
        for (int i = 0; i < clsArray.size(); i++) {
            json_data = (JSONObject) clsArray.get(i);
            if((Long)json_data.get("TagKey") == 8 )
            {
                String tagName =  json_data.get("TagName").toString();
                Long devKey = (Long) json_data.get("DevKey");
                Long tagKey = (Long) json_data.get("TagKey");
                String tagVal = (String) json_data.get("Value");
                Long tagTime = (Long) json_data.get("Time");
                this.clsJ.add(json_data);
            }
        }

    } catch (ParseException e) {
        e.printStackTrace();
    }
}

и метод отображения сообщения:

@MessageMapping("/message")
public void status(JSONArray ret, SimpMessageHeaderAccessor headerAccessor) 
throws Exception {
    String sessionId = 
headerAccessor.getSessionAttributes().get("sessionId").toString();
    messagingTemplate.convertAndSendToUser(sessionId,"/queue/reply", 
    this.clsJ);
    this.clsJ.clear();
}

спасибо заранее.

...