【问题标题】:Custom Stomp Headers using Spring websockets使用 Spring websockets 自定义 Stomp 标头
【发布时间】:2014-02-24 03:56:43
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: java spring header stomp spring-websocket


    【解决方案1】:

    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 标头应该足以将它们公开在客户端,它们可以作为映射 message.headers.nativeHeaders 使用。同样,您可以编写一个客户端拦截器来将 nativeHeaders 移动到常规标头中 - 因此在您的客户端意识到该消息之前,所有预期的标头都只是在 message.headers 中。

    【讨论】:

    • 使用这个我可以通过在convertAndSend 方法中添加一个MessagePostProcessor 参数来添加自定义标题。被覆盖的postProcessMessage 中的逻辑然后按照建议添加本机标头
    • 嗨 Jaimie,你能在 JIRA 中创建一个请求来解决这个问题吗?虽然你已经找到了一种方法,但它真的不应该那么难弄清楚。
    • 感谢您的回答!您还可以解释如何获取消息附带的标头到服务器吗?
    猜你喜欢
    • 2018-03-30
    • 1970-01-01
    • 2014-10-18
    • 2014-03-17
    • 2017-02-16
    • 2014-09-21
    • 2016-01-28
    • 2015-12-16
    • 2018-07-25
    相关资源
    最近更新 更多