- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个 tomcat 集群,在一台服务器上有 2 个实例和 apache 代理。应用程序使用带有 web 套接字的 Spring 框架 4.3.10,apache-activemq-5.15.0 作为 stomp 代理:
<websocket:message-broker application-destination-prefix="/app">
<websocket:stomp-endpoint path="/wshandler" allowed-origins="*">
</websocket:stomp-endpoint>
<websocket:stomp-broker-relay prefix="/topic,/queue"
relay-host="localhost" relay-port="62356"
heartbeat-send-interval="10000" heartbeat-receive-interval="10000"/>
<websocket:client-inbound-channel>
<websocket:interceptors>
<bean class="somepath.TopicSubscriptionInterceptor"/>
</websocket:interceptors>
</websocket:client-inbound-channel>
</websocket:message-broker>
现在大约有 20 个客户端同时连接到网络套接字。一切正常,但我定期在日志中出现错误(估计一小时内出现 8-10 次)。我该如何解决?
2017-10-06 09:54:01,046 ERROR [StompSubProtocolHandler] Failed to parse TextMessage payload=[], byteCount=1, last=true] in session 6f. Sending STOMP ERROR to client.
java.lang.IllegalStateException: No decoder for session id '6f'
at org.springframework.web.socket.messaging.StompSubProtocolHandler.handleMessageFromClient(StompSubProtocolHandler.java:249)
at org.springframework.web.socket.messaging.SubProtocolWebSocketHandler.handleMessage(SubProtocolWebSocketHandler.java:307)
at org.springframework.web.socket.handler.WebSocketHandlerDecorator.handleMessage(WebSocketHandlerDecorator.java:75)
at org.springframework.web.socket.handler.LoggingWebSocketHandlerDecorator.handleMessage(LoggingWebSocketHandlerDecorator.java:56)
at org.springframework.web.socket.handler.ExceptionWebSocketHandlerDecorator.handleMessage(ExceptionWebSocketHandlerDecorator.java:58)
at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter.handleTextMessage(StandardWebSocketHandlerAdapter.java:110)
at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter.access$000(StandardWebSocketHandlerAdapter.java:42)
at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter$3.onMessage(StandardWebSocketHandlerAdapter.java:81)
at org.springframework.web.socket.adapter.standard.StandardWebSocketHandlerAdapter$3.onMessage(StandardWebSocketHandlerAdapter.java:78)
at org.apache.tomcat.websocket.WsFrameBase.sendMessageText(WsFrameBase.java:394)
at org.apache.tomcat.websocket.server.WsFrameServer.sendMessageText(WsFrameServer.java:119)
at org.apache.tomcat.websocket.WsFrameBase.processDataText(WsFrameBase.java:495)
at org.apache.tomcat.websocket.WsFrameBase.processData(WsFrameBase.java:294)
at org.apache.tomcat.websocket.WsFrameBase.processInputBuffer(WsFrameBase.java:133)
at org.apache.tomcat.websocket.server.WsFrameServer.onDataAvailable(WsFrameServer.java:82)
at org.apache.tomcat.websocket.server.WsFrameServer.doOnDataAvailable(WsFrameServer.java:171)
at org.apache.tomcat.websocket.server.WsFrameServer.notifyDataAvailable(WsFrameServer.java:151)
at org.apache.tomcat.websocket.server.WsHttpUpgradeHandler.upgradeDispatch(WsHttpUpgradeHandler.java:148)
at org.apache.coyote.http11.upgrade.UpgradeProcessorInternal.dispatch(UpgradeProcessorInternal.java:54)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:53)
最佳答案
在新的spring框架版本中解决了(https://github.com/spring-projects/spring-framework/commit/f425a993e7be82ffdbdda24370925a34c42925f2)
如果您使用的是旧版本(直到 2019),您可以通过重写 WebSocketHandlerDecorator 来解决这个问题:
@Slf4j
public class WebSocketSessionCapturingHandlerDecorator extends WebSocketHandlerDecorator {
public void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception {
if(session.isOpen()){
super.handleMessage(session, message);
}else{
log.info("Dropped inbound WebSocket message due to closed session");
}
}
并在主 WebSocketConfig 中使用它:
@Slf4j
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {
@Override
public void configureWebSocketTransport(WebSocketTransportRegistration registration) {
registration.addDecoratorFactory(new WebSocketHandlerDecoratorFactory() {
@Override
public WebSocketHandler decorate(WebSocketHandler webSocketHandler) {
return new WebSocketSessionCapturingHandlerDecorator(webSocketHandler);
}
});
}
关于java - Spring web 套接字和 Stomp 日志中的 "No decoder for session id",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46603988/
我正在通过 Sock.JS 客户端发送 stomp 消息。当我断开服务器连接时,我希望在客户端上显示一条警告消息。为此,我实现了服务器端心跳 stompClient = Stomp.over(sock
我们有一个 Spring over WebSockets 连接,我们正在传递一个 CONNECT框架: CONNECT\naccept-version:1.2\nheart-beat:10000,10
当用户使用 @SubscribeMapping 注释订阅 stomp 用户目的地时,我试图得到通知。我的想法是在它加入时发送一些初始化数据。 虽然我无法让这个工作: Javascript: stomp
我正在开发一个利用 websockets 工具的 Spring 应用程序。为了使其更健壮,我使用了 STOMP/SimpleBrokerMessageHandler,如文档中所述。一切顺利,我已经能够
从 Spring 4 开始,我们支持 STOMP (子)协议(protocol)超过 WebSocket .我确实了解 WebSocket 的好处与 HTTP 相比,使用 STOMP 的用途和好处超过
STOMP 规范规定订阅必须有id header。 https://stomp.github.io/stomp-specification-1.2.html#SUBSCRIBE_id_Header S
有没有办法获取STOMP客户端IP地址?我正在拦截入站 channel ,但我看不到任何检查 IP 地址的方法。 任何帮助表示赞赏。 最佳答案 您可以在与 HandshakeInterceptor 握
我是 Flutter 新手。我正在尝试连接到使用 stomp 的 spring websocket,但连接失败。我正在使用 stomp_dart_client 0.3.3。 Spring服务器工作正常
我正在尝试在 puppetmaster(开源 puppet )上设置 mcollective/activemq。我遇到了 ActiveMQ 无法识别 Stomp 协议(protocol)的问题。这是我
我尝试使用 sockjs 和 stomp.js ( http://jmesnil.net/stomp-websocket/doc/ ) 为 vert.x stomp 服务器编写一个简单的 javasc
我发现 Spring WebSocket Support 的当前文档令人惊讶。指导用户使用 stomp.js用于他们的客户端 JavaScript 实现。 这个项目,在它的 GitHub 页面上的自述
以下测试客户端代码(使用 https://github.com/jmesnil/stomp-websocket )在 JBoss 7.0.1 中产生异常: var client = Stomp.cli
我在 Websockets 上使用带有 STOMP 协议(protocol)的 Springwebsockets,并且我正在使用内存中的 borker。我想向特定用户发送消息。 在客户端,我订阅了一个
我正在使用以下代码创建/订阅主题并处理消息。有时连接丢失并且错误显示: Whoops! The connection was lost... 我想知道有没有办法重新连接它。是否可以在错误回调中或在方法
我正在使用 Spring WebSockets。它运行良好,但现在我需要在将消息发送到 Web 客户端之前对其进行修改。 因此我创建了以下拦截器: @Component public class St
我有一个要求是一些 STOMP websocket 连接需要同步处理。 意思是我有一个客户(spring)订阅了一个主题(“/topic”)。 我有一个服务器 (spring),它定义了代理 ("/t
我目前的stomp客户端流程设计如下: 打开stomp连接(发送CONNECT帧) 订阅提要(发送 SUBSCRIBE 帧) 做一个循环以持续接收提要: while (true) {
我想知道是否有一种方法可以在发送消息之前检查消费者是否正在运行?我正在使用最新的 php STOMP,并且正在努力查看是否有一种方法可以在发送消息之前检测它是否正在运行,并在队列中建立消息。 谢谢,史
我正在寻找 Stomp.js 或类似的库。我没有发现使用 angular2.rc6/final 示例或 lib。我怎样才能重新放置 Stomp.js 其他东西?在我之前使用 Angular 1.X 的
我使用的是 Artemis 2.6.2,只有 STOMP 和以下星座: 经纪人: 没有在 broker.xml 中配置队列,一切都是自动创建的。 服务器: 订阅目标 TaskResponse 没有选择
我是一名优秀的程序员,十分优秀!