问题标签 [spring-messaging]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
3070 浏览

spring - java.lang.IllegalStateException:需要 SockJsMessageCodec 但不可用:

你好,我是 websocket 的新手。我不知道为什么我得到这个异常。

p>

在我的控制台上输出

这是我的 bjplayer-servlet.xml

对于我的控制器

我的 JavaScript

我的 JSP。

我的 Jar 文件。

我错过了什么吗?异常说 SockJsMessageCodec 不可用..

请有人提前帮助我..

顺便说一句,这是我遵循的演示。https://gerrydevstory.com/2014/03/04/stock-ticker-demo-webapp-using-spring-4-websocket/

0 投票
1 回答
1553 浏览

java - 将 spring-reactor 集成到现有 Spring Framework 4 STOMP Over WebSocket 应用程序中

我的应用程序使用 Spring Framework 4 包含的 spring-messaging 模块(具有来自 Spring Integration 项目的关键抽象,例如 Message、MessageChannel、MessageHandler 和其他可以作为此类消息传递架构的基础的其他东西。)

我的应用程序使用 Websocket 和 STOMP。它与大量 java websocket 客户端保持连接(websocket 会话),其中一个要求是使用 akka 或反应器。

我想在 clientInboundChannelExecutor 和 clientOutboundChannelExecutor 中集成 spring-reactor RingBufferAsyncTaskExecutor 代替 ThreadPoolTask​​Executor 以获得更好的吞吐量。至少我已经将这种方法确定为将 spring-reactor 集成到我现有应用程序中的方法——这可能不是正确的方法。

我正在查看 reactor-si-quickstart,因为它演示了如何将反应器与 spring 集成一起使用,并且 Spring Framework 4 中的 spring-messaging 包含来自 Spring Integration 项目的关键抽象。我认为这将是最接近的参考。

我的 web socket 工作 java 配置具有以下类声明 public class WebSocketConfig extends WebSocketMessageBrokerConfigurationSupport 实现 WebSocketMessageBrokerConfigurer。WebSocketMessageBrokerConfigurationSupport 扩展了 AbstractMessageBrokerConfiguration。

在 org.springframework.messaging.simp.config.AbstractMessageBrokerConfiguration 我想尝试配置 RingBufferAsyncTaskExecutor 代替 ThreadPoolTask​​Executor

当我尝试在 WebSocketConfig 中覆盖此方法时,“ChannelRegistration 类型的方法 getOrCreateTaskExecRegistration() 不可见”,因为在 AbstractMessageBrokerConfiguration 它受到保护......

我不完全理解我的 WebSocketConfig 中的 WebSocketMessageBrokerConfigurationSupport 层次结构或 WebSocketMessageBrokerConfigurer 接口。我只是在尝试覆盖我的自定义工作所需的内容。

不确定它是否相关,但我不需要外部代理,因为我的应用程序目前没有向所有连接的订阅者发送任何数据,而且不太可能下线。与守护进程类型的 java websocket 客户端的通信是点对点的,但是浏览器中的 web ui websocket 确实使用订阅来获取实时数据,因此它是一个方便的设置(而不是 spring 集成直接通道)并且有明确的来源如何设置它 - 我仍然不确定它是最有效的应用程序设计。spring-framework 参考文档中描述的基于 WebSocket 消息传递架构的 STOMP 是最全面的方法,因为这是我的第一个 spring 项目。

是否有可能通过将 spring-reactor 集成到我现有的应用程序中来提高性能?

或者我是否应该尝试使用 spring 集成,据我所知,这将需要进行大量修改 - 鉴于 Spring Framework 4 包含的 spring-messaging 模块来自 spring 集成,这似乎是不合逻辑的。

我应该如何将 spring-reactor 集成到我的标准 spring 框架中 4 STOMP Over WebSocket 消息架构?

如果在 clientInboundChannelExecutor 和 clientOutboundChannelExecutor 中配置 RingBufferAsyncTaskExecutor 代替 ThreadPoolTask​​Executor 是正确的方法,我应该怎么做?

0 投票
0 回答
1349 浏览

spring - Spring Framework 4 Websocket STOMP 负载测试突然 SimpleBrokerMessageHandler - 在所有 websocket 会话上处理 DISCONNECT

这必须与负载有关,但没有警告或错误 SimpleBrokerMessageHandler - 处理 DISCONNECT 开始发生在一定数量的同时连接之上。我已经尝试过跟踪日志记录,但我仍然看不到会话关闭的原因。但是,即使少一个客户端连接,测试也能顺利进行。

这是一个非常标准的 spring framework 4 websocket STOMP 应用程序,除了我为入站、出站和代理通道配置了 reactor-spring RingBufferAsyncTaskExecutor。我使用的是简单代理,因为目前我总是只回复 websocket 会话的连接客户端,即:org.springframework.messaging.simp.broker.SimpleBrokerMessageHandler - 广播到 1 个会话。

这是日志的一部分,一切看起来都很正常,然后所有 websocket 会话都断开连接,我的客户端自动尝试重新连接,但他们无法连接。是否在某个地方设置了限制,或者有更多春季经验的人知道问题出在哪里?

0 投票
1 回答
1035 浏览

spring - MessageListenerContainer 与 MessageHandler?

如果我将 Spring Integration 与 XML-Configuration 一起使用,则可以像下面这样完成消息侦听器:

问题是:我想在运行时创建自己的 ListenerContainers……如何获得相同的结果,或者更确切地说,如何将 MessageHandler 与 MessageListenerContainer 结合起来?

谢谢和问候

0 投票
1 回答
1182 浏览

java - 将 HTML 链接添加到 Spring RedirectAttribute 消息

在最终用户在我们的网站上成功提交表单后,我们希望向信息性消息(Spring RediractAttribute/Flash 消息)添加一个 html 可点击链接。

因此,最后会看到以下(闪存)消息:

成功

对象已更新。

信息

记得编辑属性

其中Edit Attribute将是最终用户浏览器中的可点击链接。

我们很难协调的是代码去哪里创建链接 html 文本?

我们觉得messages.properties 文件中不应该有任何html,我们也不觉得我们的控制器中应该有任何html 生成。

这是我们的控制器代码:

然后这里是我们的jsp标记代码来显示这两个信息消息:

任何关于如何在我们的信息消息中获得可点击链接的友好建议将不胜感激。

0 投票
1 回答
1502 浏览

spring-websocket - 带有 stomp 和 spring-sessions 的 spring-messaging xml 配置

我正在尝试使用 stomp 设置带有 spring-messaging 的 WebSocket,并使用带有 spring-session 的 redis 支持的会话。我们的应用程序上下文是通过 xml 连接的,spring-session 正在处理应用程序的非 websocket 部分。websocket的相关配置如下

我在这里定义了我认为 spring-session 与 web 套接字集成的必要 bean:

但我不确定将它们连接到网络套接字配置的位置,并且无法找到任何有关如何以这种方式进行操作的文档。

想法?

0 投票
1 回答
4119 浏览

spring-security - Spring 安全性/Spring 会话/Web 套接字

我们正在尝试结合使用 spring session、spring security 和 websockets 来实现 websocket API 的安全性,而不使用 cookie。

理想情况下,我们将使用授权标头或使用 websocket/stomp 消息进行身份验证,但这似乎不适用于当前的 spring websocket 支持。

我们正在使用预身份验证提供程序来验证查询参数令牌并登录用户。我可以看到正确的用户在预身份验证中被拉出以进行握手,但 SecurityContext 对连接到 websocket 的拦截器不可用.

我们的spring安全配置是

我们的 websocket 配置是

0 投票
1 回答
611 浏览

spring - Spring MVC 无法从 @MessageMapping 注释方法访问 @Autowired 字段

我一直在设置我的 Spring 4 MVC 应用程序以通过 WebSocket 与 STOMP 一起工作,到目前为止我已经成功,我的 servlet 可以毫无问题地处理和发送 STOMP 消息。

但是,在处理来自控制器内部的 @MessageMapping 注释方法的这些消息时,我遇到了一个烦人的问题:我无法从这些方法内部访问任何 @Autowired 控制器的字段(它们都是空指针),但我可以访问@RequestMapping 注释方法在同一控制器上的这些字段没有任何问题。

我的调度程序 Servlet 配置:

我的控制器:

0 投票
0 回答
773 浏览

spring - 通过 RabbitMQ 使用 SockJS 向 Spring Websocket 处理程序发送消息

我正在开发 2 个应用程序之间的消息代理通信:Grails 客户端和 Spring Boot 微服务。为了让我的客户端以长轮询方式更新,我使用了 WebSockets。

我已成功配置 Grails 和 Spring Boot 以通过 RabbitMQ 代理使用 Web 套接字。Grails 客户端按预期从 Spring Boot 获取所有发布。

但是我在将消息从 Grails 端的 JS 代码发送到服务器端的 Spring Boot 处理程序时遇到了问题。

我遵循以下所有默认配置:https ://github.com/zyro23/grails-spring-websocket/blob/010ea1fb3557a63b6ce0d87a0b055f6cbc7df319/README.md

我以前在 Spring Boot 端编写的相同配置:

我的客户代码调用:

但是注释@MessageMapping("/hello")不适用于我的 Spring 引导处理程序方法。

另一件奇怪的事情是,当我启用具有相同注释的 Grails 处理程序时,它们运行良好并接收所有消息。

我已经监视了 RabbitMQ 管理控制台,并且似乎在 Spring Boot 处理程序客户端从不向代理发送消息的情况下。

是否有人发现跨应用程序 Web 套接字消息发送存在相同的问题?

提前致谢!

0 投票
5 回答
24209 浏览

spring - Spring @SubscribeMapping 是否真的为客户端订阅了某个主题?

我正在将 Spring Websocket 与 STOMP(简单消息代理)一起使用。在我的@Controller我使用 method-level @SubscribeMapping,它应该为客户端订阅一个主题,以便客户端随后接收该主题的消息。假设,客户端订阅了“聊天”主题:

stompClient.subscribe('/app/chat', ...);

由于客户端订阅了“/app/chat ”,而不是“/topic/chat”,因此该订阅将转到使用映射的方法@SubscribeMapping

这是 Spring 参考。说:

默认情况下,@SubscribeMapping 方法的返回值作为消息直接发送回连接的客户端,并且不通过代理。这对于实现请求-回复消息交互很有用;例如,在初始化应用程序 UI 时获取应用程序数据。

好的,这就是我想要的,但只是部分!订阅后发送一些初始化数据,好吧。但是订阅呢?在我看来,这里发生的事情只是一个request-reply,就像一个服务一样。订阅刚刚被消耗。如果是这种情况,请澄清我。

  • 如果经纪人没有参与,客户是否订阅了某个地方?
  • 如果稍后我想向“聊天”订阅者发送一些消息,客户端会收到吗?似乎并非如此。
  • 谁真正意识到订阅?经纪人?还是其他人?

如果这里客户没有在任何地方订阅,我想知道为什么我们称之为“订阅”;因为客户端只收到一条消息,而不是未来的消息。

编辑:

为了确保订阅已经实现,我尝试如下:

服务器端:

配置:

控制器:

客户端:

我想发生的事情:

  1. 当客户端订阅 ' /topic/greetings' 时,该方法try1被执行。
  2. 当客户端向' /app/hello'发送消息时,它应该收到问候消息,即@SendTo' /topic/greetings'。

结果:

  1. 如果客户端订阅/topic/greetings,则该方法try1无法捕获它。

  2. 当客户端发送 msg 到 ' /app/hello' 时,greeting方法被执行,并且客户端收到了问候消息。所以我们知道它已经/topic/greetings正确地订阅了''。

  3. 但请记住 1. 失败了。经过一番尝试,客户端订阅的时候已经可以了'/app/topic/greetings',即前缀/app(这个可以通过配置理解)。

  4. 现在 1. 正在工作,但是这次 2. 失败:当客户端发送 msg 到 ' /app/hello' 时,是的,greeting方法已执行,但客户端没有收到问候消息。(因为可能现在客户端订阅了以 ' /app' 为前缀的主题,这是不需要的。)

所以,我得到的是我想要的 1 或 2 个,但不是这 2 个加在一起。

  • 如何使用这种结构实现这一点(正确配置映射路径)?