Java 从Spring websocket会话提取远程端点对象

Java 从Spring websocket会话提取远程端点对象,java,spring,spring-mvc,websocket,spring-websocket,Java,Spring,Spring Mvc,Websocket,Spring Websocket,在javaxwebsockets中,我们可以使用如下内容 Session.getAsyncRemote().sendText(字符串文本) Session.getBasicRemote().sendText() 如何使用SpringWebSocket发送异步消息。 从SpringWebCockets的WebSocketSession中,我们可以提取RemoteEndPoint并发送异步消息 注:我使用的是基本的弹簧WebSocket 配置和代码如下所示: @Configuration

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

Session.getAsyncRemote().sendText(字符串文本) Session.getBasicRemote().sendText()

如何使用SpringWebSocket发送异步消息。 从SpringWebCockets的WebSocketSession中,我们可以提取RemoteEndPoint并发送异步消息

注:我使用的是基本的弹簧WebSocket

配置和代码如下所示:

    @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 {

        }



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

    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]
那么,可以使用SpringWebSocket发送异步消息吗? 如果是,请让我知道上述代码中需要进行哪些配置更改..或者我们可以从spring Websocket会话中提取核心AsyncRemoteEndPoint和BasicRemoteEndpoint并发送异步消息..或者如果不是上述两种情况..将代码移动到公共位置并进行同步(sessionObject) { 消息 }…对不起,如果问题的框架不清晰或已经是重复的问题


请注意,我没有在spring websocket上使用任何Stomp客户端或任何其他功能。我使用的是普通的spring websocket。是否可以不使用Future(java功能)(如果是的话……会更好)?

我在会话中使用了ConcurrentWebSocketSessionDecorator。 根据:


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

您找到答案了吗?我使用了以下方法..((JettyWebSocketSession)会话).getNativeSession().getRemote().SendstringByFuture您可以按如下方式获取本机会话,并使用当前所需的方法..javax.websocket.session session=((StandardWebSocketSession)webSocketSession).getNativeSession();
    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]