问题标签 [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.
spring - 在 Spring Websocket 消息传递的预定方法中获取主体
想要使用 websockets 向特定客户端发送通知。有一个发送通知的计划任务,但无法在该任务中获取 Principal。找到了这篇文章,但据我所知,Spring 计划的方法必须是无参数的。
这可能吗?如何在预定方法中获取 websocket 主体?
java - 如何在 Spring 服务器中关闭 STOMP websocket
我正在使用 spring-websocket 和 spring-messaging(版本 4.2.2.RELEASE)通过具有全功能代理(Apache ActiveMQ 5.10.0)的 websockets 实现 STOMP。
我的客户只能订阅目的地 - 也就是说他们不应该能够发送消息。此外,我想对我的客户可以订阅的目的地实施更严格的控制。在任何一种情况下(即当客户端尝试发送消息或订阅无效目的地时)我希望能够
- 发送适当的错误,和/或
- 关闭网络套接字
请注意,我所有的目的地都转发到 ActiveMQ。我认为我可以在入站通道上实现ChannelInterceptor,但是查看 API 我无法弄清楚如何实现我想要的。这可能吗?验证客户端请求的最佳方法是什么?我的 websocket 配置如下:
spring-websocket - 集成 Spring 控制器消息映射和 Artemis
我正在研究切换到 WildFly 10,然后是 Artemis。我已经建立了一个简单的 Spring Websocket 项目,如下所述:https ://spring.io/guides/gs/messaging-stomp-websocket/ 。该项目的核心是 WebSocketConfig:
和控制器:
这就像 ActiveMQ 的魅力一样,在代理端不需要额外的配置。
知道 Artemis 需要预先创建的目的地,或者特别提到自动队列创建,我将其添加到我的 broker.xml 中:
但是,这并没有像我预期的那样工作,经纪人仍然拒绝创建/queue/greetings
. 因此,我进行了更多研究,发现实际上 Artemis 喜欢队列是带有jms.queue.*
前缀的名称。我将队列重命名为jms.queue.greetings
并对 Spring 代码进行了以下更改:
配置:
控制器:
据我了解,这应该迫使我的控制器向该队列发送消息。Broker 喜欢这种变化并最终创建了队列,但另一方面 Spring 控制器却没有——jms.queue.greetings 中没有出现任何消息。
我可以通过使代码不那么漂亮来强制解决这个问题,使用一些手工注入的服务订阅所需的队列,但是这样我就会失去 Spring sockJS 的魔力——Artemis(不像 RabbitMQ)似乎没有http
为 Stomp 提供端点, 连接到ws://
只会导致 CORS 错误。似乎也没有内置的 CORS 支持。
对于如何克服这个问题,我将不胜感激。
编辑:我的 JS 看起来像这样:
spring - Artemis 支持 Spring UserDestination 中的 StompBrokerRelay
我能够成功地将 Artemis 连接为 StompBrokerRelay,但我必须使用
我所有的队列都从
当我尝试使用 /user/ Destination 向用户发送私人消息时,它不起作用,原因是DefaultUserDestinationResolver,正如我在 jira 中描述的那样,错误被硬编码为搜索“/”并留下前导 / 所以如果我尝试发送到 /user/xxxx/jms.queue.call 它将被翻译成 /jms.queue.call 而它的工作应该去 jms.queue.call
是否可以覆盖AbstractMessageBrokerConfiguration中使用的DefaultUserDestinationResolver
spring - NoClassDefFoundError: DefaultLifecycleProcessor$1 取消部署 spring-messaging 应用程序时
我有一个在 Tomcat 7 上运行的 Spring 应用程序。添加 WebSockets 后,我开始在undeployment期间在日志中看到以下错误。
除了日志和增加的取消部署时间(它等待超时)之外,一切正常。
添加的 WebSockets 代码没有什么花哨的。只是一个@Controller
,一个子类AbstractWebSocketMessageBrokerConfigurer
和一个子类AbstractSecurityWebSocketMessageBrokerConfigurer
。
怎么了?我不认为我缺少任何罐子。我可以在 .jar 中的 jar中看到org.springframework.context.support.DefaultLifecycleProcessor
类。匿名类也在那里。spring-context-4.2.2-RELEASE
WEB-INF/lib
DefaultLifecycleProcessor$1
spring - 我可以使用 org.springframework.messaging.Message 获得 JMSXDeliveryCount 和 JMSDestination
我正在使用 Spring JMS 4.1.2,并且我正在使用 org.springframework.messaging.Message 作为 JMS 侦听器中的输入有效负载。我正在收听一个活动 MQ 队列,我想知道是否可以使用 org.springframework.messaging.Message 获取 JMSXDeliveryCount 和 JMSDestination,或者我是否必须使用 javax.jms.Message 类来完成这。
谢谢,
胡安
spring-websocket - 添加 STOMP 标头而不在 ChannelInterceptorAdapter 上重新创建 Message
我需要向 STOMP 消息添加标头,目前它的工作方式如下,但我正在重新创建消息,是否可以只添加本机标头而无需重新创建消息以提高性能。
spring - 路由滑簧集成 (4.2)
我正在尝试使用 Spring 集成来实现路由滑动(EI 模式)。我所做的配置是
所以当它到达routingServiceChannel时,它会去routingChannel2,然后是routingChannel1。但在我的情况下,它总是会抛出一个异常,即它没有回复通道。当我设置输出通道时,比如
然后路由发生在 xyzChannel 上,而不是去 routingChannel2 和 routingChannel1。
当我在 spring 集成核心中调试代码时,我偶然发现了这段代码,在
类 AbstractReplyProducingMessageHandler
在处理消息方法中,他们获取 routingSlip 映射并将其分配给结果。和
他们没有从回复中获取 routingSlip 配置,而是尝试从 requestMessage 中获取。我在这里错过了什么吗?我需要设置任何其他配置吗?
java - 如何自定义 spring-messaging websockets 用户订阅?
我在企业环境中使用spring-messaging websockets 。spring-messaging 组件在 DMZ 中运行。它通过防火墙连接到 ActiveMQ 代理网络,进入内部网络。连接在 DMZ 中使用 spring-security 进行身份验证,并且用户主体可用。
我需要订阅用户特定的主题,内部网络中的服务可以通过它们与 ActiveMQ 的连接发布到这些主题。spring-messaging/user
前缀似乎提供了这种功能。
开箱即用,如果我通过身份验证并且订阅了主题/user/foo/bar
然后DefaultUserDestinationResolver
将其转换为会话 ID,并且在 ActiveMQ 中我看到 STOMP 连接器对主题的订阅/foo/bar-userjf44st89
。在我的场景中有两个问题。
session-id
jf44st89
无法转换回用户 id,因此内部网络中的服务无法通过其 ActiveMQ 连接发布给特定用户。它们不是,也永远不会是从内部网络通过防火墙到运行 spring-messaging 组件的 DMZ 的允许路由,因此任何涉及发布到 spring-messaging 组件的解决方案都已失效。似乎没有什么可以阻止经过身份验证但未经授权的用户尝试猜测会话 ID 并订阅诸如
/foo/bar-userjf44st89
. 不太可能成功,但我更喜欢不可能。
所以我想DefaultUserDestinationResolver
用我自己的 bean 进行增强,它将创建表单的订阅,/user/user-id/session-id/foo/bar
这应该解决这两个问题并允许内部服务使用 ActiveMQ*
通配符来忽略 session-id 路径组件。
我的主要问题是如何最好地更换DefaultUserDestinationResolver
?它由AbstractMessageBrokerConfiguration
类创建为 bean。用户创建自己的@Primary
UserDestinationResolver bean 的预期方法是什么?我想保留它的大部分功能,DefaultUserDestinationResolver
只是修改它生成的主题的格式。
java - Spring WebSocketStompClient 不会使用 SockJsClient 连接
所以,我试图从 Rossen Stoyanchev 的一个很好的例子中复制 sockJs 代码:https ://github.com/rstoyanchev/spring-websocket-portfolio/blob/master/src/test/java/org/springframework/samples/投资组合/web/load/StompWebSocketLoadTestClient.java
但是,我遇到了一个问题,它无法连接到 Stomp 端点。执行冻结stompClient.connect()
,不再显示调试消息,甚至来自处理程序。
这是我的代码:
如果我使用WebSocketStompClient
它一切正常。
这个问题可以用 ActiveMQ 重现,所以我认为它不是 Artemis 特有的。我使用 Spring Boot 运行这个应用程序,我没有专门配置任何东西,它与WebSocketStompClient
.
如果有人遇到过类似的问题,我将不胜感激有关如何解决此问题的任何见解或建议。我在这里缺少一些额外的代理/spring-app 配置吗?