Нужна помощь с Web чатом на Java и WebSocket

126
04 декабря 2020, 09:00

Сама настройка веб сокета

<websocket:message-broker application-destination-prefix="/app">
    <websocket:stomp-endpoint path="/hello">
        <websocket:sockjs/>
    </websocket:stomp-endpoint>
    <websocket:simple-broker prefix="/topic"/>
</websocket:message-broker>

Есть метод контроллера который отвечает за отправку сообщения в очередь

@MessageMapping("/hello")
public void chatting(MessageDto message) {
    SimpleDateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy hh:mm");
    message.setFormatDate(dateFormat.format(new Date()));
    Message saveMessage = messageService.saveMessage(message);
    messagingTemplate.convertAndSend("/topic/chat/" + saveMessage.getConversation().getUIDConversation(), message);
}

т.е. по задумке у меня для пары пользователей свой уникальный канал. Всё работает отлично если оба пользователя нажали на иконки друг друга на UI, получается что они оба подписываются на один и тот же канал созданный для них. Проблема заключается в том, если нажмет на иконку только один пользак и будет писать сообщения другому, который не нажал на иконку чата, то получается, что он в очереди один и сообщения уйдёт в никуда. Есть ли какой нибудь способ уведомить пользователя, что ему пришло сообщение или же как нибудь его автоматом подключить к очереди начавшего разговор юзера?
На всякий случай код коннекта js

$(document).ready(function () {
        $('.chat_list').click(function () {
            var idClickUser = this.id;
            UIDConversation = currentUserId + idClickUser;
            $.ajax({
                type: 'POST',
                url: '/chat/check',
                data: {
                    idClickUser: idClickUser,
                    currentUserId: currentUserId,
                    UIDConversation: UIDConversation
                },
                success: function (data) {
                    connect(UIDConversation);
                    $.each(data, function (key, value) {
                        if (value.name === userName) {
                            printMsg(value.msg, value.formatDate);
                        } else {
                            showMessage(value.name, value.msg, value.formatDate);
                        }
                    });
                }
            });
        });
    });
function connect(chatUID) {
        var socket = new SockJS('/hello');
        stompClient = Stomp.over(socket);
        stompClient.connect({}, function (frame) {
            console.log('Connected: ' + frame);
            stompClient.subscribe('/topic/chat/' + chatUID, function (message) {
                showMessage(JSON.parse(message.body).name,
                    JSON.parse(message.body).msg,
                    JSON.parse(message.body).formatDate);
            });
        });
    }
READ ALSO
Вставка данных с помощью ajax

Вставка данных с помощью ajax

На странице есть 2 таблицы, мне туда нужно вставлять ордера из БД, делаю с помощью ajaxДанные вставляются, но почему-то первый столбец в таблице...

94
Регулярные выражения для дат в Javascript

Регулярные выражения для дат в Javascript

Задача Есть инпут, который принимает текст в формате дате в виде ДДММ

123
Отловить событие перед загрузкой html

Отловить событие перед загрузкой html

Делаю 2 типа менюКакое из них загрузится пользователю решается с помощью js относительно ширины экрана

121