Spring 4 STOMP Websockets - 如何实现多渠道

时间:2014-04-10 17:12:48

标签: spring websocket stomp

与最新的使用STOMP和SockJS的Spring 4教程一样,我们发现了以下类型的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。 的虽然 我确实订阅了正确的频道,消息没有出现问题,如本

所示

调试日志:

打开Web Socket ... stomp.js:130 Web Socket打开... stomp.js:130

  
    
      

CONNECT       接受版本: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

  
    
      

SUBSCRIBE       ID:分0       目的地:/主题/问候/ 1

    
  

stomp.js:130

  
    
      

SEND       目的地:/应用/你好/ 1       内容长度:18

    
  

{“name”:“textext”}


应该有回应,但没有任何回复......

有人能看到我在这里失踪的东西吗?

欢呼声, 海因里希

1 个答案:

答案 0 :(得分:4)

目前无法将参数传递给@SendTo / @SendToUser@MessageMapping上的占位符在@SendTo / @SendToUser中不可用。对此有一个open 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() + "!"));
}

2015年9月8日更新:

从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() + "!");
}