我有一个Stomp客户端,配置为通过Web套接字协议与ActiveMQ代理通信。
stomp.js具有以下发送功能:
Client.prototype._transmit = function(command, headers, body) {
var out;
out = Frame.marshall(command, headers, body);
if (typeof this.debug === "function") {
this.debug(">>> " + out);
}
while (true) {
if (out.length > this.maxWebSocketFrameSize) {
this.ws.send(out.substring(0, this.maxWebSocketFrameSize));
out = out.substring(this.maxWebSocketFrameSize);
if (typeof this.debug === "function") {
this.debug("remaining = " + out.length);
}
} else {
return this.ws.send(out);
}
}
};
其中:
command
是'SEND'
,
headers
是{"content-length" : false}
,
和body
是一个非常长的字符串化JSON对象。 (长于this.maxWebSocketFrameSize
)
maxWebSocketFrameSize = 16 * 1024;
这是在客户端的初始化中设置的。
因此,此函数将我的大型消息分成多个帧并单独发送。
stomp.js中的默认调试日志给我(在Chrome控制台中)
<<< ERROR
content-type:text/plain
message:The maximum command length was exceeded
org.apache.activemq.transport.stomp.ProtocolException: The maximum command length was exceeded
at org.apache.activemq.transport.stomp.StompWireFormat.readHeaderLine(StompWireFormat.java:158)
at org.apache.activemq.transport.stomp.StompWireFormat.readLine(StompWireFormat.java:148)
at org.apache.activemq.transport.stomp.StompWireFormat.parseAction(StompWireFormat.java:181)
at org.apache.activemq.transport.stomp.StompWireFormat.unmarshal(StompWireFormat.java:98)
at org.apache.activemq.transport.stomp.StompWireFormat.unmarshal(StompWireFormat.java:62)
at org.apache.activemq.transport.ws.StompSocket.onMessage(StompSocket.java:76)
at org.eclipse.jetty.websocket.WebSocketConnectionRFC6455$WSFrameHandler.onFrame(WebSocketConnectionRFC6455.java:722)
at org.eclipse.jetty.websocket.WebSocketParserRFC6455.parseNext(WebSocketParserRFC6455.java:349)
at org.eclipse.jetty.websocket.WebSocketConnectionRFC6455.handle(WebSocketConnectionRFC6455.java:225)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint.handle(SelectChannelEndPoint.java:627)
at org.eclipse.jetty.io.nio.SelectChannelEndPoint$1.run(SelectChannelEndPoint.java:51)
at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:608)
at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:543)
at java.lang.Thread.run(Unknown Source)
ActiveMQ控制台窗口显示:
WARN | Transport Connection to: StompSocket_721080149 failed: java.io.IOException
WARN | Exception occurred processing:
null
null
null
null
null
null
null
如果我在out
上放置一个断点,那么根据代码,每个帧都应该是应该的。 body
的子字符串。我不确定这是否正确,或者是否应重组以拥有自己的命令等。
如果这是正确的行为,那么可能是我的ActiveMQ代理配置:
<transportConnector name="websocket" uri="ws://0.0.0.0:24511/>
适用于任何短于16 * 1024的邮件。
我确实将上面的transportConnector配置更改为:
<transportConnector name="websocket" uri="ws://0.0.0.0:24511?websocket.maxTextMessageSize=9999999"/>
并在stomp.js中手动将maxWebSocketFrameSize = 16 * 1024
更改为maxWebSocketFrameSize = 16 * 1024 * 1024
。这给了我足够的框架尺寸和完美的工作。
我很想知道这是否是一个好的解决方案,或者如果将大型消息拆分成多个帧将是更理想的方法。如果是后者(或不是),为什么在ActiveMQ中框架显示为null