我在Tomcat 8上使用Spring 4 websockets,我有以下配置:
<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()
语句永远不会被执行,所以我认为我的控制器映射有问题或我没有正确使用目标端点(我不明白为什么我必须在此处指定应用程序前缀,但在连接到该端点时则不指定。)
答案 0 :(得分:3)
当使用简单的String
消息作为有效负载时,似乎无法映射。当我将message
包裹在一个对象中时,它就可以正常工作。
编辑:正如评论中所述,Spring已经附带了一个名为TextMessage
类的消息包装器。