问题标签 [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+rabbitmq stomp:如何获取所有在线用户并断开部分用户的连接?
如果spring store用户的websocket session,怎么获取,如果我用someHandler把session放到map中,那意味着map的大小可能大于10w+,我觉得不太好。</p>
会话处理程序.java
spring - Spring集成路由单
我正在尝试使用spring集成实现路由单,配置如下
和
为了在我添加了标题丰富器后查阅路由单
此实现有效,但在 2 次中有效,在调试了 spring 代码后,我偶然发现了这段代码并找出了问题所在。
在 UnicastingDispatcher 类中
给出 [org.springframework.integration.jms.JmsSendingMessageHandler#11, routingSlip.replyChannel.bridgeTo.handler]
它是循环采摘的。因此,一旦它选择了 BridgeHandler 和 JmsSendingMessageHandler 下一个。
是否有任何我一直错过咨询 BridgeHandler 的配置?
stomp - Spring Websocket url 命中 RequestMapping 但不是 MessageMapping
我在现有 Web 应用程序中设置 websocket 配置时遇到问题。
控制器
客户
当客户端尝试连接时,我看到的是 spring 尝试将 /mobile-socket 与现有 Web 应用程序的 RequestMappings 进行匹配,最后通过 @RequestMapping("/{somevar}") 找到与之匹配的一个。
我是 WebSockets 的新手,但我希望端点注册是这类连接的统称?
即使删除了错误的 RequestMapping 被击中,我似乎也无法让 MessageMapping 被击中。我在我的日志中看到了这个
spring-security - 如何防止 Spring 生成默认的 simpSessionId?
我正在尝试使用 websockets 和 STOMP 设置 spring。
在客户端,我发送一个标头变量 'simpSessionId':%session_id%
但是,在接收到消息时,spring 总是将提供的标头放在名为 nativeHeaders 的键中,并将默认的 simpSessionId 放在标头根中。
有什么想法可以让 spring 获取提供的会话 ID 吗?
已编辑
好的,我有一个手机应用程序和一个网站访问同一台服务器。我需要能够在手机应用程序上设置 webocket。
在手机应用程序上,我通过传统的 REST 端点登录到服务器,如果成功,我会在响应中收到一个 session-id。
我在手机上使用webstomp-client,Spring 4.1.9,Spring Security 4.1,Spring Session 1.2.0。
理想情况下,我会使用令牌登录套接字 CONNECT 上的 STOMP websocket,但我知道他目前是不可能的,因为 webstomp-client 不会在 CONNECT 上传递自定义标头。
我有两个问题:
如何在后续请求中传递我在 REST 登录中检索到的会话 ID?我尝试添加诸如 SPRING.SESSION.ID 之类的标头,但单步执行代码时,我总是看到消息处理返回到始终默认为 1、2 等的 simpSessionId。我尝试扩展 AbstractSessionWebsocketMessageBrokerConfigurer,但它没有获取我的会话 ID,它总是在 simpSessionAttributes 中查找,它总是为空的。
该代码似乎还试图获取 http 会话,这是一个 Web 浏览器场景。我假设我应该忽略这个
会话到期。对于可能已过期的会话应该采取什么策略?我不应该也传递一个记住我风格的身份验证令牌吗?还是我应该依赖一些永恒的无状态会话?这对我来说并不清楚,这方面似乎没有记录。
显然,我做错了什么。这是我的配置:
@Configuration @EnableRedisHttpSession(maxInactiveIntervalInSeconds=1200) 公共类 SessionConfig {
}
===
==
====
=== 为了简洁起见,我已经删除了一些额外的安全配置。
@Configuration @EnableWebSecurity @Order(100) 公共类 SecurityConfig 扩展 WebSecurityConfigurerAdapter {
}
===
java - 确保收到消息
我需要编写一个可以在客户端发送推送通知的应用程序。但有时客户端会断开连接,所以我想存储通知并在客户端重新连接时将它们发送给客户端。
有没有办法做到这一点?我需要一种在发送之前知道客户端是否存在的方法,或者一种知道是否收到通知的方法。而且我的通知是特定于客户的。
我不能炫耀很多代码,但我想使用这样的东西:
我使用 spring-websocket 和 stomp-endpoint。
谢谢 !
java - 如何订阅内部 Spring Boot/Simple Broker 主题队列?
我需要订阅内部 Spring Boot 主题/user/exchange/amq.direct/chat.message
以创建一个机器人,该机器人将订阅主题队列并回答消息。
}
我的控制器:
如何订阅我通过 SimpMessagingTemplate 放置消息的内部队列/主题?
spring - 如何配置 Spring Sockjs Java Client 消息转换器
我有一个使用 STOMP 的 SockJS Java 客户端。基于此https://github.com/rstoyanchev/spring-websocket-portfolio/blob/master/src/test/java/org/springframework/samples/portfolio/web/load/StompWebSocketLoadTestClient.java。
我的代码:
当我配置stompClient
为:
我发了一条信息:
其中message是一个String类对象,服务器端抛出下一个转换错误:
观察错误:
MessageConversionException:无法为 GenericMessage [payload=byte[33],headers={simpMessageType=MESSAGE,stompCommand=SEND,nativeHeaders={destination=[/app/chatchannel] 从 [[B] 转换为 [org.gasmart.websocket.Message] ], content-type=[text/plain;charset=UTF-8] , content-length=[33]}, simpSessionAttributes={ip=/127.0.0.1:59629}, simpHeartbeat=[J@147a2bf, contentType=text /plain;charset=UTF-8,lookupDestination=/chatchannel,simpSessionId=79431feb8b5f4a9497492ccc64f8965f,simpDestination=/app/chatchannel}]
看到content-type标头是由 SockJS Java 客户端创建的。
如果我配置stompClient
为:
我发了一条信息:
其中 message 是一个字节数组,服务器不会抛出错误。但我需要在发送之前将所有字符串转换为字节数组。我想了解为什么服务器可以转换使用 SimpleMessageConverter 发送的相同 JSON 对象和使用 StringMessageConverter 发送的一个。
我对从 JavaScript 客户端和 Java 客户端发送的 JSON 进行了比较。两者都发送相同的 JSON 消息。然后我实现了一个 ChannelInterceptor 来打印在消息发送到相应控制器之前收到的消息:
对应的服务器控制器是:
Java 输出:
而 JavaScript:SockJS + Stomp.js:
观察区别: content-type=[text/plain;charset=UTF-8]
Spring 消息传递中有更多转换器:
您可以观察此包中的 SimpleMessageConverter 和 StringMessageConverter。但是有 ByteArrayMessageConverter、CompositeMessageConverter、SmartMessageConverter 等。这些转换器如何工作?
如果我想从 Java 客户端发送字符串,我需要什么转换器?
为什么服务器可以转换 JSON 消息 {"from":"cliente1","text":"KIKO"} 从 JScript 客户端发送,但不能从 Java 客户端发送?
spring - 使用 SubProtocolWebSocketHandler 和 stompSubProtocolHandler 的一些示例?
我找不到 stompSubProtocolHandler 和 SubProtocolWebSocketHandler 的使用示例?
我需要扩展这个 SubProtocolWebSocketHandler 类吗?
我正在使用 Sockjs Java 客户端的处理程序,它扩展了 StompSessionHandlerAdapter 并且正在工作。我可以连接、订阅和发送消息:
私有静态类 ProducerStompSessionHandler 扩展 StompSessionHandlerAdapter { ...
}
但是我看到另一个用户告诉我有两个实现:SubProtocolWebSocketHandler 和 stompSubProtocolHandler。 https://stackoverflow.com/a/28306539/6243317
这些是通过 STOMP 客户端实现的 Java Websocket 吗?怎么用?优点?为什么要使用这个实现?
java - Spring Cloud Stream 项目是否需要 Web 服务器(Tomcat)?
我正在使用Spring Cloud Stream编写消息驱动的微服务。
- 项目A:Producer(Spring Cloud Stream,集成tomcat及其端口:8080)
- 项目B:Consumer(Spring Cloud Stream,集成tomcat及其端口:8081)
- 消息代理:RabbitMQ(amqp 端口:5672)
我的问题是:对于项目 A 和 B,他们是否需要集成 Web 服务器/端口(Tomcat)?或者只是一个普通的java应用程序就可以了?
spring - 如何使用 RabbitTemplate 模仿 SimpMessagingTemplate.convertAndSendToUser?
所以我一直在阅读有关使用 RabbitMQ 代理的 Spring Message Relay(Spring Messaging 的东西)功能。我想要实现的目标如下:
有一个服务(1),它充当rabbitmq和浏览器之间的消息中继。这现在工作正常。我正在使用 MessageBrokerRegistry.enableStompBrokerRelay 来做到这一点。
在后端有另一个服务 (2),它将向 RabbitMQ 上的已知队列发送消息,并将该消息路由到特定用户。作为发件人,我想控制消息被传递给谁。
通常,您会使用 SimpMessagingTemplate 来执行此操作。但问题是,消息的来源实际上无法访问该模板,因为它没有充当中继,没有使用 websockets,也没有保存队列名称到会话 ID 的映射。
我能想到的一种方法是在服务 1 上编写一个简单的类,它将侦听所有队列并使用 simp 模板转发它们。但是我摔倒了,这不是一个理想的方法,我觉得可能已经有一种方法可以使用 Spring 来实现它。
你能给些建议么?