Java SockJS Spring 客户端和消息大小
Java SockJS Spring client and message size
使用 SockJS java 客户端,我正在尝试连接到 Spring sockjs 服务器并且收到 ~20Kb 的消息(没有 headers)的错误 1009。 Java脚本库工作正常。
Transport closed with CloseStatus[code=1009, reason=The decoded text message was too big
for the output buffer and the endpoint does not support partial messages] in WebSocketClientSockJsSession
[id='9fa30eb453e14a8c8612e1064640646a, url=ws://127.0.0.1:8083/user]
我在服务器上有几个配置 类(我现在不知道我是否配置这些东西的次数超过了必要):
@Configuration
@EnableWebSocket
public class WebSocketTransportConfig implements WebSocketConfigurer {
// Important web socket setup. If big message is coming through, it may overflow the buffer and this will lead in disconnect.
// All messages that are coming through normally (including snapshots) must be order of magnitude smaller, or connection will be broken
// sometimes
// There is also MaxBinaryMessageSize that we do not employ as we use Stomp, but for completeness it is also set to same values.
// Javadoc http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/socket/adapter/jetty/JettyWebSocketSession.html#setTextMessageSizeLimit-int-
public static final int MAX_TEXT_MESSAGE_SIZE = 2048000; // 2 Megabytes.
public static final int BUFFER_SIZE = MAX_TEXT_MESSAGE_SIZE * 5;
private static final Logger LOGGER = LogManager.getLogger(WebSocketTransportConfig.class);
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
}
@Bean
public DefaultHandshakeHandler handshakeHandler() {
LOGGER.info("Websocket buffer size: " + BUFFER_SIZE + " bytes.");
WebSocketPolicy policy = new WebSocketPolicy(WebSocketBehavior.SERVER);
policy.setMaxTextMessageBufferSize(BUFFER_SIZE);
policy.setMaxTextMessageSize(MAX_TEXT_MESSAGE_SIZE);
policy.setMaxBinaryMessageBufferSize(BUFFER_SIZE);
policy.setMaxBinaryMessageSize(MAX_TEXT_MESSAGE_SIZE);
policy.setInputBufferSize( BUFFER_SIZE);
policy.setIdleTimeout(600000);
return new DefaultHandshakeHandler(
new JettyRequestUpgradeStrategy(new WebSocketServerFactory(policy)));
}
}
和
@Configuration
@EnableWebSocketMessageBroker
@EnableScheduling
public class WebSocketBrokerConfig extends WebSocketMessageBrokerConfigurationSupport implements WebSocketMessageBrokerConfigurer {
@Override
public void configureWebSocketTransport(WebSocketTransportRegistration registry) {
// Increase buffers.
// Too little buffers may result in fatal errros when transmitting relatively large messages.
registry.setMessageSizeLimit(WebSocketTransportConfig.MAX_TEXT_MESSAGE_SIZE);
registry.setSendBufferSizeLimit(WebSocketTransportConfig.BUFFER_SIZE);
super.configureWebSocketTransport(registry);
}
}
根据 这应该有所帮助,但是当连接 Java Spring SockJS 客户端时,我仍然收到错误 1009(消息太大)。
因此我怀疑我可能遇到以下两个问题之一:
- Java SockJS 客户端也必须配置为接收更大的消息。
- 或者,我仍然在服务器上配置错误。
如何在 Java SockJS Spring 客户端上增加缓冲区大小?
如果你这样做:
SockJsClient sockJsClient = new SockJsClient(transports);
WebSocketStompClient stompClient = new WebSocketStompClient(sockJsClient);
尝试:
stompClient.setInboundMessageSizeLimit(your_message_size_limit);
我遇到了同样的问题。这都是关于客户端的配置,而不是服务器。
您可以创建 WebSocketContainer 实例并对其进行配置。
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
container.setDefaultMaxBinaryMessageBufferSize(your_size);
container.setDefaultMaxTextMessageBufferSize(your_size);
WebSocketClient transport = new StandardWebSocketClient(container);
WebSocketStompClient stompClient = new WebSocketStompClient(transport);
your_size - 字节大小。
使用 SockJS java 客户端,我正在尝试连接到 Spring sockjs 服务器并且收到 ~20Kb 的消息(没有 headers)的错误 1009。 Java脚本库工作正常。
Transport closed with CloseStatus[code=1009, reason=The decoded text message was too big
for the output buffer and the endpoint does not support partial messages] in WebSocketClientSockJsSession
[id='9fa30eb453e14a8c8612e1064640646a, url=ws://127.0.0.1:8083/user]
我在服务器上有几个配置 类(我现在不知道我是否配置这些东西的次数超过了必要):
@Configuration
@EnableWebSocket
public class WebSocketTransportConfig implements WebSocketConfigurer {
// Important web socket setup. If big message is coming through, it may overflow the buffer and this will lead in disconnect.
// All messages that are coming through normally (including snapshots) must be order of magnitude smaller, or connection will be broken
// sometimes
// There is also MaxBinaryMessageSize that we do not employ as we use Stomp, but for completeness it is also set to same values.
// Javadoc http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/socket/adapter/jetty/JettyWebSocketSession.html#setTextMessageSizeLimit-int-
public static final int MAX_TEXT_MESSAGE_SIZE = 2048000; // 2 Megabytes.
public static final int BUFFER_SIZE = MAX_TEXT_MESSAGE_SIZE * 5;
private static final Logger LOGGER = LogManager.getLogger(WebSocketTransportConfig.class);
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
}
@Bean
public DefaultHandshakeHandler handshakeHandler() {
LOGGER.info("Websocket buffer size: " + BUFFER_SIZE + " bytes.");
WebSocketPolicy policy = new WebSocketPolicy(WebSocketBehavior.SERVER);
policy.setMaxTextMessageBufferSize(BUFFER_SIZE);
policy.setMaxTextMessageSize(MAX_TEXT_MESSAGE_SIZE);
policy.setMaxBinaryMessageBufferSize(BUFFER_SIZE);
policy.setMaxBinaryMessageSize(MAX_TEXT_MESSAGE_SIZE);
policy.setInputBufferSize( BUFFER_SIZE);
policy.setIdleTimeout(600000);
return new DefaultHandshakeHandler(
new JettyRequestUpgradeStrategy(new WebSocketServerFactory(policy)));
}
}
和
@Configuration
@EnableWebSocketMessageBroker
@EnableScheduling
public class WebSocketBrokerConfig extends WebSocketMessageBrokerConfigurationSupport implements WebSocketMessageBrokerConfigurer {
@Override
public void configureWebSocketTransport(WebSocketTransportRegistration registry) {
// Increase buffers.
// Too little buffers may result in fatal errros when transmitting relatively large messages.
registry.setMessageSizeLimit(WebSocketTransportConfig.MAX_TEXT_MESSAGE_SIZE);
registry.setSendBufferSizeLimit(WebSocketTransportConfig.BUFFER_SIZE);
super.configureWebSocketTransport(registry);
}
}
根据
因此我怀疑我可能遇到以下两个问题之一:
- Java SockJS 客户端也必须配置为接收更大的消息。
- 或者,我仍然在服务器上配置错误。
如何在 Java SockJS Spring 客户端上增加缓冲区大小?
如果你这样做:
SockJsClient sockJsClient = new SockJsClient(transports);
WebSocketStompClient stompClient = new WebSocketStompClient(sockJsClient);
尝试:
stompClient.setInboundMessageSizeLimit(your_message_size_limit);
我遇到了同样的问题。这都是关于客户端的配置,而不是服务器。 您可以创建 WebSocketContainer 实例并对其进行配置。
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
container.setDefaultMaxBinaryMessageBufferSize(your_size);
container.setDefaultMaxTextMessageBufferSize(your_size);
WebSocketClient transport = new StandardWebSocketClient(container);
WebSocketStompClient stompClient = new WebSocketStompClient(transport);
your_size - 字节大小。