当前位置: 首页 > 知识库问答 >
问题:

从Spring websocket会话提取远程endpoint对象

史钊
2023-03-14

在javax websockets中,我们可以使用如下内容

配置和代码如下:

    @Configuration
    @EnableWebMvc
    @EnableAspectJAutoProxy
    @EnableWebSocket
    public class WebMVCConfig extends WebMvcConfigurerAdapter implements WebSocketConfigurer {


        private static final String ENDPOINT_URL = "/echo";

        @Override
        public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
            registry.addHandler(socketHandler(), ENDPOINT_URL).setAllowedOrigins("*");
        }

        @Bean
        public WebSocketHandler socketHandler() {
            return new WebSocketTestHandler();
        }

        @Override
        public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
            configurer.enable();
        }

        @Bean
        public DefaultHandshakeHandler handshakeHandler() {

            WebSocketPolicy policy = new WebSocketPolicy(WebSocketBehavior.SERVER);
            policy.setInputBufferSize(8192);
            policy.setIdleTimeout(600000);

            return new DefaultHandshakeHandler(new JettyRequestUpgradeStrategy(new WebSocketServerFactory(policy)));
        }

        public class SpringMVCInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
            @Override
            protected Class<?>[] getRootConfigClasses() {
                return new Class[] { ApplicationConfig.class, RabbitMQConfig.class, RabbitConnectionFactory.class,
                        WebPropertyPlaceHolderConfig.class};
            }

            @Override
            protected Class<?>[] getServletConfigClasses() {
                return null;
            }

            @Override
            protected String[] getServletMappings() {
                return new String[] { "/" };
            }

            @Override
            public void onStartup(ServletContext servletContext) throws ServletException {
                super.onStartup(servletContext);
            }


    @Configuration
    public class WebSocketTestHandler extends TextWebSocketHandler {

    @Override
        public void afterConnectionEstablished(WebSocketSession session) throws Exception {
            log.info("Connection is established to Server....:: Session Open : {}", session.isOpen());
        }

        @Override
        public void handleTextMessage(WebSocketSession session, TextMessage message) {

    }

    @Override
        public void afterConnectionClosed(WebSocketSession curSession, CloseStatus status) throws Exception {

        }



}

因此,在handleTextMessage(WebSocketSession会话,TextMessage消息)内部{在此方法内部创建多个线程并发送相同的会话对象和一些其他参数。在每个线程内部,不修改任何与会话对象相关的参数,但正在尝试执行

    TextMessage socketMessage = new TextMessage(message);
    session.sendMessage(socketMessage); 

}

因此每个线程都试图使用相同的会话对象发送消息..但我面临以下错误

    java.lang.IllegalStateException: Blocking message pending 10000 for BLOCKING
            at org.eclipse.jetty.websocket.common.WebSocketRemoteEndpoint.lockMsg(WebSocketRemoteEndpoint.java:130) ~[websocket-common-9.3.8.v20160314.jar:9.3.8.v20160314]
            at org.eclipse.jetty.websocket.common.WebSocketRemoteEndpoint.sendString(WebSocketRemoteEndpoint.java:379) ~[websocket-common-9.3.8.v20160314.jar:9.3.8.v20160314]
            at org.springframework.web.socket.adapter.jetty.JettyWebSocketSession.sendTextMessage(JettyWebSocketSession.java:188) ~[spring-websocket-4.2.4.RELEASE.jar:4.2.4.RELEASE]
            at org.springframework.web.socket.adapter.AbstractWebSocketSession.sendMessage(AbstractWebSocketSession.java:105) ~[spring-websocket-4.2.4.RELEASE.jar:4.2.4.RELEASE]

共有1个答案

孟乐
2023-03-14

我在会话上使用了ConcurrentWebSocketSessionDecorator。根据:https://jira.spring.io/browse/spr-13602

decorator“使用发送缓冲区和每个会话的发送时间限制来强制每次发送一条消息。这对限制慢速客户端的影响有很大帮助。”

 类似资料:
  • 问题内容: 根据EJB客户端应用程序上的Netbeans教程,我似乎无法调用该方法: 编译错误: 客户: ejb: 远程接口: 现在,如果接口被修改: Bean现在可以使用以下方法: 但是,有一个NPE: 如何正确调用该方法?EJB未实例化? 问题答案: 我从头开始。我能想到的唯一区别是,我没有创建EJB应用程序,而是为bean创建了EJB模块。否则,我认为是相同的。 结构体: 客户代码: 豆:

  • 因此,我开发了一个定制的身份验证提供商,(为了大大简化事情),它将当前用户的密码替换为他们不知道的、完全随机的密码。在身份验证过程中,使用一些wizzy加密,重新生成密码并通过Kerberos身份验证过程传递,以替换他们可能输入的任何密码(忽略)。我不能太详细地介绍它是如何工作的,但不管怎样,它确实在本地工作。我们的想法是在运行Windows Server 2012的云端机器上使用它,但我遇到了一

  • 我想把文件从远程服务器拉到我的本地服务器。我正在使用Spring Integration SFTP来拉文件。我有以下配置: 我不想在成功拉取后从remotedir中删除文件。这里发生的事情是每30秒,从remotedir的文件就会被拉到我的本地文件。我希望spring batch程序在第一次之后停止,不要再次拉出相同的文件。我怎样才能做到这一点?

  • 我有一个PGP公钥加密的会话包,我想从中提取会话密钥,这样我就可以单独解密会话密钥。我正在使用BouncyCastle库,并像这样提取会话密钥: 其中session_key_enc.bin是二进制格式的加密会话密钥,private.pem是与我在GPG中用于加密数据的公钥相对应的私钥。在加密数据之前,我将RSA密钥对的公钥部分转换为PGP格式的密钥,并将其导入GPG。 当我运行OpenSSL命令时

  • 我正在学习Appium,我无法使用以下功能创建远程会话。虽然>功能在模拟设备上的Appium server本身中工作 线程“main”org.openqa.selenium.sessionNotCreatedException中出现异常:无法创建新的远程会话。原始错误:127.0.0.0.1生成信息:版本:“3.141.59”,修订版:“E82BE7D358”,时间:“2018-11-14T08:

  • 我创建了简单的Java应用程序来学习Spring和hibernate集成。我做了所有的设置和应用程序也工作良好。 一切正常。但是,我想看看我的应用程序当前使用了多少会话,比如打开的连接和关闭的hibernate连接。 在Sessionfactory类中,我们使用“getStatistics”方法来检索hibernate统计数据,但这对我没有帮助。它也给了我零分。请找到下面的图片。 http://w