在使用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套接字。。。stomp.js:130Web套接字已打开。。。stomp.js:130
连接接受版本:1.1,1.0心跳:1000010000
stomp.js:130<lt<已连接心跳:0,0版本:1.1
stomp.js:130连接到服务器未定义的stomp.js:130已连接:已连接版本:1.1心跳:0,0
(索引):23
认购id:sub-0目的地:/t主题/问候/1
stomp.js:130
发送目的地:/app/hello/1内容长度:18
{"name":"textext"}
应该有回应,但没有任何回应。。
有人能看到我在这里缺了什么吗?
欢呼,Heinrich
当前无法将参数传递给@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() + "!"));
}
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() + "!");
}