Spring 4 websockets динамическое сопоставление сообщений не выполняется

Я использую веб-сокеты Spring 4 на Tomcat 8, и у меня есть следующая конфигурация:

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

Мой контроллер Spring имеет следующий метод:

@MessageMapping("/notify/{client}")
public void pushMessage(@DestinationVariable long client, String message) {
    System.out.println("Send " + message + " to " + client);
    template.convertAndSend("/topic/push/" + client, message);
}

Итак, что я пытаюсь здесь сделать, так это то, что если клиент 1 хочет отправить сообщение клиенту 2, он использует /app/notify/2. Затем контроллер Spring отправит сообщение в тему /topic/push/2.

Я написал следующий код в своем клиенте:

var id = 1;
var sock = new SockJS('/project/notify');
var client = Stomp.over(sock);
client.connect({}, function() {
    client.subscribe('/topic/push/' + id, function(message) {
        console.log(message);
    });
});

Соединение работает отлично, /project - это просто корень контекста моего приложения.

У меня также есть следующий код в моем клиенте для отправки сообщения:

client.send('/app/notify/' + id, {}, "test");

Обе переменные (client и id) доступны, я не получаю никаких ошибок в этой части кода, и я вижу в своей консоли, что сообщение действительно отправлено:

>>> SEND
destination:/app/notify/1
content-length:4

test 

Однако оператор System.out.println() в моем контроллере никогда не выполняется, поэтому я предполагаю, что что-то не так с моими сопоставлениями контроллера или я неправильно использую конечные точки назначения (я не понимаю, почему я должен указывать здесь префикс приложения, но не при подключении к этой конечной точке).


person g00glen00b    schedule 06.03.2014    source источник
comment
Я работаю над реализацией группового чата и следую аналогичному подходу, т.е. публикую сообщение в теме с уникальным groupId на сервере и на стороне клиента, подписываюсь на эту тему, используя идентификатор группы. Этот подход отлично работает, когда я использую Simple Broker, но терпит неудачу, когда я использую External Broker(RabbitMQ). В этом случае он говорит, что неверный пункт назначения. Вы имеете какое-нибудь представление об этом?   -  person Gurminder Singh    schedule 12.05.2014


Ответы (1)


Кажется, он не может сопоставить при использовании простого сообщения String в качестве полезной нагрузки. Когда я оборачиваю message в объект, все работает нормально.

РЕДАКТИРОВАТЬ: Как указано в комментариях, Spring уже поставляется с оболочкой сообщений, называемой TextMessage.

person g00glen00b    schedule 06.03.2014
comment
Вы можете использовать объект типа TextMessage для отправки вашей строки, так как вы используете STOMP. - person AliR; 12.03.2014
comment
Я использую SimpMessagingTemplate, который принимает org.springframework.messaging.Message, но TextMessage наследуется от org.springframework.web.socket... как отправить простую строку STOMP, не преобразованную в объект JSON? - person Fabio Bonfante; 06.06.2014
comment
не могли бы вы объяснить немного глубже, что вы подразумеваете под in an object, я пробовал что-то подобное, но не сработало. - person coding_idiot; 24.10.2015
comment
@coding_idiot напишите класс со строковым полем и используйте этот класс в качестве полезной нагрузки. Или используйте TextMessage, как упоминалось @AliR. - person g00glen00b; 24.10.2015
comment
сделал это, не сработало... похоже на проблему конфликта зависимостей. - person coding_idiot; 24.10.2015