Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/385.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 踩踏弹簧WebSocket消息超出大小限制_Java_Spring Mvc_Spring Websocket_Stomp_Sockjs - Fatal编程技术网

Java 踩踏弹簧WebSocket消息超出大小限制

Java 踩踏弹簧WebSocket消息超出大小限制,java,spring-mvc,spring-websocket,stomp,sockjs,Java,Spring Mvc,Spring Websocket,Stomp,Sockjs,我正在将SpringWebSocket实现到我们的SpringMVCWeb应用程序中。然而,当我试图向端点发送一条非常大的消息时,我遇到了消息大小过大的限制 我得到以下错误: message:The 'content-length' header 68718 exceeds the configured message buffer size limit 65536 14:49:11,506 ERROR [org.springframework.web.socket.messaging.St

我正在将SpringWebSocket实现到我们的SpringMVCWeb应用程序中。然而,当我试图向端点发送一条非常大的消息时,我遇到了消息大小过大的限制

我得到以下错误:

message:The 'content-length' header 68718  exceeds the configured message buffer size limit 65536

14:49:11,506 ERROR [org.springframework.web.socket.messaging.StompSubProtocolHandler] (http-localhost/127.0.0.1:8080-4) Failed to parse TextMessage payload=[13684590},..], byteCount=16384, last=true] in session vlsxdeol. Sending STOMP ERROR to client.: org.springframework.messaging.simp.stomp.StompConversionException: The 'content-length' header 68718  exceeds the configured message buffer size limit 65536
at org.springframework.messaging.simp.stomp.BufferingStompDecoder.checkBufferLimits(BufferingStompDecoder.java:148) [spring-messaging-4.1.6.RELEASE.jar:4.1.6.RELEASE]
at org.springframework.messaging.simp.stomp.BufferingStompDecoder.decode(BufferingStompDecoder.java:124) [spring-messaging-4.1.6.RELEASE.jar:4.1.6.RELEASE]
以下是我的配置:

@MessageMapping("/user/sockettest" )
@SendTo("/topic/sockettestresult")
public String sockAdd(ListId[] listIds) {
..
SecurityContextHolder.getContext().getAuthentication().getPrincipal();

return stringRet;
}
xml配置如下所示:

<websocket:stomp-endpoint path="/user/sockettest">
<websocket:sockjs/>
</websocket:stomp-endpoint>

<websocket:simple-broker prefix="/topic"/>

<websocket:message-converters register-defaults="false">
    <bean id="mappingJackson2MessageConverter" class="org.springframework.messaging.converter.MappingJackson2MessageConverter">
        <property name="objectMapper" ref="objectMapper"></property>
    </bean>
</websocket:message-converters>
</websocket:message-broker>
你能告诉我什么是好的工作吗

回答:如果您知道最大尺寸限制是多少

 <websocket:transport message-size="75536" send-buffer-size="75536"></websocket:transport>

我正在研究如何进行部分消息传递,一旦我发现并使其正常工作,我将立即将其发布到此处

考虑
定义的
选项:

配置传入子协议消息的最大大小。 例如,STOMP消息可以作为多个WebSocket消息接收 或在使用SockJS回退选项时发出多个HTTP POST请求


使用
WebSocketMessageBrokerConfigure.configureWebSocketTransport(WebSocketTransportRegistration)
实现和
setMessageSizeLimit()
在注释配置中也可以实现同样的效果。

设置默认值65kb时,我遇到了类似的javascript错误。。然后我将其设置为随机,再次得到一些错误,如

连接被中断

。所以我试着增加时间限制,这对我很有效。实际上,当限制超过时,消息被发送到数据包/帧中,当它从服务器接收响应时,它超时

您可以使用下面的方法调整它

@EnableWebSocketMessageBroker
public class AppWebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
----
---
    @Override
        public void configureWebSocketTransport(WebSocketTransportRegistration registration) {
            registration.setMessageSizeLimit(200000); // default : 64 * 1024
            registration.setSendTimeLimit(20 * 10000); // default : 10 * 10000
            registration.setSendBufferSizeLimit(3* 512 * 1024); // default : 512 * 1024

        }
---
}
List transports=new ArrayList();
WebSocketContainer=ContainerProvider.getWebSocketContainer();
container.setDefaultMaxTextMessageBufferSize(512*1024)//修理
WebSocketClient wsClient=新标准WebSocketClient(容器);
添加(新WebSocketTransport(wsClient));
//添加(新的RestTemplateXhrTransport());
SockJsClient SockJsClient=新的SockJsClient(传输);
WebSocketStompClient stompClient=新的WebSocketStompClient(sockJsClient);
setMessageConverter(新的SimpleMessageConverter());
stompClient.setInboundMessageSizeLimit(512*1024)//修理

行注释为修复解决了我的问题


考虑
定义的
选项:

配置传入子协议消息的最大大小。例如,当使用SockJS回退选项时,STOMP消息可以作为多个WebSocket消息或多个httppost请求接收

在注释配置中,也可以使用

WebSocketMessageBrokerConfigurer.configureWebSocketTransport(WebSocketTransportRegistration) 
setMessageSizeLimit()
就此事进行讨论

这是对的,但是。。。如果您使用的是Spring WebSocket,则stomp消息为

StompSubProtocolHandler

agentWebSocketHandler或CoratorFactory将把
WebSocketHandler
代理给自定义
DelegatingIntroductionInterceptor

import org.springframework.aop.framework.ProxyFactory;
import org.springframework.aop.support.AopUtils;
import org.springframework.aop.support.DefaultIntroductionAdvisor;
import org.springframework.aop.target.SingletonTargetSource;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.handler.WebSocketHandlerDecoratorFactory;

public class AgentWebSocketHandlerDecoratorFactory implements WebSocketHandlerDecoratorFactory {


    @Override
    public WebSocketHandler decorate(WebSocketHandler handler) {
        ProxyFactory proxyFactory = new ProxyFactory();
        proxyFactory.setTargetClass(AopUtils.getTargetClass(handler));
        proxyFactory.setTargetSource(new SingletonTargetSource(handler));
        proxyFactory.addAdvisor(new DefaultIntroductionAdvisor(new SubProtocolWebSocketHandlerInterceptor()));
        proxyFactory.setOptimize(true);
        proxyFactory.setExposeProxy(true);
        return (WebSocketHandler) proxyFactory.getProxy();

    }

}
而自定义的
DefaultIntroductionAdvisor
将在建立连接后拦截WebSocketHandler
,并设置WebSocketSession
textMessageSizeLimit

import org.aopalliance.intercept.MethodInvocation;
import org.springframework.aop.support.DelegatingIntroductionInterceptor;
import org.springframework.web.socket.WebSocketSession;

public class SubProtocolWebSocketHandlerInterceptor extends DelegatingIntroductionInterceptor {

    @Override
    protected Object doProceed(MethodInvocation mi) throws Throwable {
        if(mi.getMethod().getName().equals("afterConnectionEstablished") ) {
            WebSocketSession session = (WebSocketSession) mi.getArguments()[0];
            session.setTextMessageSizeLimit(50*1024*1024);
        }
        return super.doProceed(mi);
    }
}
这是经过测试的,将接受16KB更大的消息
在本例中,消息限制大小为50*1024*1024

谢谢,这部分用于发送消息,但我无法在客户端接收消息…也许
setSendBufferSizeLimit()
是为您准备的?这很有效!下面是我在xml中是如何做到这一点的,我目前正在研究部分消息。spring中是否有任何现成的支持来拆分websocket消息?看起来像是完全独立的问题。是的:Spring Integration是为您准备的:除了@Ashutosh的答案之外,我还发现了您可以参考的Spring文档页面
@Override
    public void afterSessionStarted(WebSocketSession session, MessageChannel outputChannel) {
        if (session.getTextMessageSizeLimit() < MINIMUM_WEBSOCKET_MESSAGE_SIZE) {
            session.setTextMessageSizeLimit(MINIMUM_WEBSOCKET_MESSAGE_SIZE);
        }
        this.decoders.put(session.getId(), new BufferingStompDecoder(this.stompDecoder, getMessageSizeLimit()));
    }
 @Override
    public void configureWebSocketTransport(WebSocketTransportRegistration registry) {
        registry.setMessageSizeLimit(50 * 1024 * 1024); //this not work todo
        registry.setSendBufferSizeLimit(50 * 1024 * 1024);
        registry.setDecoratorFactories(agentWebSocketHandlerDecoratorFactory());
    }

  @Bean
        public  AgentWebSocketHandlerDecoratorFactory agentWebSocketHandlerDecoratorFactory() {
        return new AgentWebSocketHandlerDecoratorFactory();
    }
import org.springframework.aop.framework.ProxyFactory;
import org.springframework.aop.support.AopUtils;
import org.springframework.aop.support.DefaultIntroductionAdvisor;
import org.springframework.aop.target.SingletonTargetSource;
import org.springframework.web.socket.WebSocketHandler;
import org.springframework.web.socket.handler.WebSocketHandlerDecoratorFactory;

public class AgentWebSocketHandlerDecoratorFactory implements WebSocketHandlerDecoratorFactory {


    @Override
    public WebSocketHandler decorate(WebSocketHandler handler) {
        ProxyFactory proxyFactory = new ProxyFactory();
        proxyFactory.setTargetClass(AopUtils.getTargetClass(handler));
        proxyFactory.setTargetSource(new SingletonTargetSource(handler));
        proxyFactory.addAdvisor(new DefaultIntroductionAdvisor(new SubProtocolWebSocketHandlerInterceptor()));
        proxyFactory.setOptimize(true);
        proxyFactory.setExposeProxy(true);
        return (WebSocketHandler) proxyFactory.getProxy();

    }

}
import org.aopalliance.intercept.MethodInvocation;
import org.springframework.aop.support.DelegatingIntroductionInterceptor;
import org.springframework.web.socket.WebSocketSession;

public class SubProtocolWebSocketHandlerInterceptor extends DelegatingIntroductionInterceptor {

    @Override
    protected Object doProceed(MethodInvocation mi) throws Throwable {
        if(mi.getMethod().getName().equals("afterConnectionEstablished") ) {
            WebSocketSession session = (WebSocketSession) mi.getArguments()[0];
            session.setTextMessageSizeLimit(50*1024*1024);
        }
        return super.doProceed(mi);
    }
}