7

我有一个基本的 spring websocket 应用程序,它当前向订阅者发送基本数据。目前系统使用SimpMessageSendingOperations该类作为消息处理程序。如果我打电话SimpMessageSendingOperations.convertAndSend(destination, object),那么对象将被订阅的客户转换并接收。

我希望能够向客户发送自定义标头。我已经尝试使用该SimpMessageSendingOperations.convertAndSend(destination, object, headers)方法来做到这一点。但是,自定义标头不包含在 stomp 消息中。

通过代码进行调试,它看起来像是使用本机标头和原始本机标头映射来构建单块标头的StompHeaderAccessor.toStompHeaderMap()方法调用 。toNativeHeaderMap()

有没有办法将自定义标头添加到 stomp 消息中?

4

1 回答 1

7

StompHeaderAccessor 扩展了 NativeMessageHeaderAccessor,这似乎是非 stomp 标头所在的位置,但它们都存储在一个名为 nativeHeaders 的标头中——它本身就是一个映射。

@MessageMapping("/hello")
@SendTo("/topic/greetings")
public  GenericMessage<Greeting> greeting(HelloMessage message) throws Exception {      
    Map<String, List<String>> nativeHeaders = new HashMap<>();
    nativeHeaders.put("hello", Collections.singletonList("world"));

    Map<String,Object> headers = new HashMap<>();
    headers.put(NativeMessageHeaderAccessor.NATIVE_HEADERS, nativeHeaders);

    return new GenericMessage<Greeting>(new Greeting("Hello, " + message.getName() + "!"), headers);
}

一个简单的拦截器服务器端将您的自定义标头包装到 nativeHeaders 标头应该足以将它们暴露在客户端,它们可以作为 map message.headers.nativeHeaders 使用。类似地,您可以编写一个客户端拦截器来将 nativeHeaders 移动到常规标头中 - 因此在您的客户端意识到该消息之前,所有预期的标头都只是在 message.headers 中。

于 2014-02-04T13:51:16.930 回答