5

我在 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");

两个变量 (clientid) 都是可访问的,我没有从这部分代码中得到任何错误,并且我可以在控制台中看到消息实际上已发送:

>>> SEND
destination:/app/notify/1
content-length:4

test 

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

4

1 回答 1

4

String使用简单消息作为有效负载时似乎无法映射。当我将它包装message在一个对象中时,它就可以正常工作了。

编辑:如评论中所述,Spring 已经带有一个名为TextMessage类的消息包装器。

于 2014-03-06T10:22:47.720 回答