在javax-websockets中,我们可以使用如下
会话.getAsyncRemote().sendText(字符串文本)会话.getBasicRemote().sendText();
我们如何使用spring-websocket发送异步消息。从spring-webstacks的WebSocketSession中,我们可以提取RemoteEndPoint并发送异步消息吗
PS注意:我正在使用Basic Spring 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消息)内部{在这个方法中,我创建了多个线程并发送同一个会话Object和一些其他参数。。在每个线程中,我没有修改任何与会话对象相关的参数,但正在尝试执行
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]
那么,是否可以使用spring-websockets发送异步消息呢?如果是,请让我知道以上代码中需要进行哪些配置更改。。或者,我们可以从springWebsocketSession中提取核心AsyncRemoteEndPoint和BasicRemoteEndpoint吗?我们可以发送异步消息吗。。或者如果不是以上两种情况。。将代码移动到公共位置并放置synchronized(sessionObject){消息}。。抱歉,如果问题的框架不清楚或已经是重复的问题
请注意,我没有在spring-websocket上使用任何Stomp客户端或任何其他功能。。我用的是弹簧垫圈。。是否可以不使用Future(java功能)(如果是的话…会更好)?
我在会话中使用了ConcurrentWebSocketSessionDecorator。根据:https://jira.spring.io/browse/SPR-13602
decorator"使用发送缓冲区和每个会话的发送时间限制来强制每次发送一条消息。这在很大程度上有助于限制慢速客户端的影响"