简体   繁体   English

Java SockJS Spring客户端和消息大小

[英]Java SockJS Spring client and message size

Using SockJS java client, I am trying to connect to Spring sockjs server and is getting error 1009 for messages (without headers) of ~20Kb. 使用SockJS java客户端,我试图连接到Spring sockjs服务器,并获得错误1009的消息(没有标头)~20Kb。 Javascript library works fine. Javascript库工作正常。

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]

I have couple of config classes on server (I do not know at the moment if I am configuring these things more times than necessary): 我在服务器上有几个配置类(如果我配置这些东西的次数超过必要的话,我现在还不知道):

@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)));
    }
}

and

@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);
    }
}

According to Stomp spring web socket message exceeds size limit that should help but when connecting Java Spring SockJS client, I still get error 1009 (too big message). 根据Stomp spring web socket消息超出大小限制应该有帮助但是在连接Java Spring SockJS客户端时,我仍然得到错误1009(太大的消息)。

I suspect therefore I may have one of two issues: 因此我怀疑我可能有两个问题之一:

  1. Java SockJS client must be also configured to RECEIVE bigger messages. Java SockJS客户端也必须配置为RECEIVE更大的消息。
  2. Or, I am still misconfigured on server. 或者,我仍然在服务器上配置错误。

How can I increase buffer size on Java SockJS Spring client? 如何在Java SockJS Spring客户端上增加缓冲区大小?

I stumbled with the same problem. 我偶然发现了同样的问题。 It's all about the configuration of the client, not the server. 这都是关于客户端的配置,而不是服务器。 You can create WebSocketContainer instance and configure it. 您可以创建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 - size in bytes. your_size - 以字节为单位的大小。

If you're doing it like this: 如果你这样做:

SockJsClient sockJsClient = new SockJsClient(transports);
    WebSocketStompClient stompClient = new WebSocketStompClient(sockJsClient);

Try: 尝试:

stompClient.setInboundMessageSizeLimit(your_message_size_limit);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM