Spring 4 STOMP Websockets - Как реализовать многоканальность

Как и в новейшем учебнике Spring 4 с STOMP и SockJS, мы находим RequestMapping следующего вида:

Homecontroller.java

@MessageMapping("/hello")
    @SendTo("/topic/greetings")
    public Greeting greeting(HelloMessage message) throws Exception {
        Thread.sleep(3000); // simulated delay
        return new Greeting("Hello, " + message.getName() + "!");
    }

теперь я попытался реализовать многоканальную поддержку, изменив это сопоставление запросов:

@MessageMapping("/hello/{id}")
    @SendTo("/topic/greetings/{id}")
    public Greeting greetingMultichannel(HelloMessage message) throws Exception {
        this.info();
        Thread.sleep(300); // simulated delay
        return new Greeting(" Hello, " + message.getName() + "!");
    }

MessageMapping не работает, sendTo не доставляет обратно на указанный URL. Хотя я подписался на правильный канал, и сообщение выходит без проблем, как видно на этом


журнал отладки:

Открытие веб-сокета ... Stomp.js: 130 Открыто веб-сокет ... Stomp.js: 130

CONNECT accept-версия: 1.1,1.0 сердцебиение: 10000,10000

Stomp.js: 130 ‹-------------------------------- ПОДКЛЮЧЕННОЕ сердцебиение: 0,0 версия: 1.1

Stomp.js: 130 подключено к серверу undefined Stomp.js: 130 Подключено: ПОДКЛЮЧЕНО версия: 1.1 сердцебиение: 0,0

(индекс): 23

ПОДПИСАТЬСЯ id: sub-0 цель: / topic / greetings / 1

Stomp.js: 130

ОТПРАВИТЬ пункт назначения: / app / hello / 1 content-length: 18

{"имя": "текст"}


должен быть ответ, но ничего не возвращается ..

Может ли кто-нибудь увидеть, что мне здесь не хватает?

ура, Генрих


person Heinrich    schedule 10.04.2014    source источник


Ответы (1)


В настоящее время нет возможности передавать параметры в @SendTo / @SendToUser, заполнители на @MessageMapping недоступны в @SendTo / @SendToUser. Для этого есть открытая Jira, следите за ней.

А пока используйте SimpMessagingTemplate:

@Autowired 
private SimpMessagingTemplate simpMessagingTemplate;

@MessageMapping("/hello/{id}")
public void greetingMultichannel(HelloMessage message, @DestinationVariable("id") Long id) throws Exception {
    this.info();
    Thread.sleep(300); // simulated delay

    simpMessagingTemplate.convertAndSend("/topic/greetings/" + id, new Greeting(" Hello, " + message.getName() + "!"));
}

Обновление от 8 сентября 2015 г .:

Начиная с Spring 4.2, в @SendTo / @SendToUser можно использовать заполнители переменных назначения. Теперь это возможно:

@MessageMapping("/hello/{id}")
@SendTo("/topic/greetings/{id}")
public Greeting greetingMultichannel(HelloMessage message) throws Exception {
    this.info();
    Thread.sleep(300); // simulated delay
    return new Greeting(" Hello, " + message.getName() + "!");
}
person Sergi Almar    schedule 26.09.2014