Spring @SendToUser или convertAndSendToUser не доставляет сообщение другому аутентифицированному пользователю, чем вошедший в систему пользователь - PullRequest
0 голосов
/ 11 апреля 2020

Я новичок в весенней паутине. Я пытался разными способами отправить сообщение указанному c пользователю. Но не удалось. Что я пытаюсь сказать, у меня есть два пользователя jhon & alex. Когда Джон вошел в систему, он может отправить сообщение Алексу.

@MessageMapping("/message")
public void processMessageFromClient(@Payload Message msg, Principal principal) throws Exception {
    OutputMessage out = new OutputMessage(principal.getName(), msg.getText(),
            new SimpleDateFormat("HH:mm").format(new Date()));
    //*msg.getTo() gives the target user alex*
    messagingTemplate.convertAndSendToUser(msg.getTo(), "/queue/reply", out);
}

С помощью приведенного выше кода сообщение не отправляется alex (также аутентифицированному пользователю), на самом деле в этот момент ничего не происходит. Однако, если я изменяю msg.getTo () на Principal.getName (), которая является именем пользователя для текущего вошедшего в систему пользователя, это отправляет сообщение текущему вошедшему в систему пользователю, т.е. jhon. Но я хочу отправить Алексу.

Здесь мы используем конфигурацию сокета.

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

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/ict-socket-endpoint").setAllowedOrigins("*");
}

}

А ниже javascript клиент


    var ws;
    function setConnected(connected) {
        $("#connect").prop("disabled", connected);
        $("#disconnect").prop("disabled", !connected);
        if (connected) {
            $("#conversation").show();
        } else {
            $("#conversation").hide();
        }
        $("#greetings").html("");
    }

    function connect() {
        // connect to stomp where stomp endpoint is exposed
        var socket = new WebSocket("ws://localhost:8084/ict-socket-endpoint");
        ws = Stomp.over(socket);
        var header = {
            "name" : "alex"
        }
        ws.connect(header, function(frame) {
            ws.subscribe("/user/queue/errors", function(message) {
                alert("Error " + message.body);
            });
        ws.subscribe("/user/queue/reply", function(message) {
            console.log("message ====" + JSON.stringify(message.body));
            showGreeting(message.body);
        });
        }, function(error) {
            alert("STOMP error " + error);
        });
    }

    function disconnect() {
        if (ws != null) {
            ws.close();
        }
        setConnected(false);
        console.log("Disconnected");
    }

    function sendMsg() {
        var opts = {
            from: 'bhaba', //loggedIn user
            to: 'alex', //target user
            text: $("#name").val(),
            disconnect: 'disconnect'

          };
        var data = JSON.stringify(opts);
        ws.send("/app/message", {}, data);
    }

    function showGreeting(message) {
        $("#greetings").append(" " + message + "");
    }

    $(function() {
        $("form").on('submit', function(e) {
            e.preventDefault();
        });
        $("#connect").click(function() {
            connect();
        });
        $("#disconnect").click(function() {
            disconnect();
        });
        $("#send").click(function() {
            sendMsg();
        });
    });

Устал пытаться сейчас , Нужна помощь. Спасибо!

...