我在 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 /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()
我的控制器中的语句永远不会执行,所以我认为我的控制器映射有问题或者我没有正确使用目标端点(我不明白为什么我必须在这里指定应用程序前缀,但不是连接到该端点时)。