gpt4 book ai didi

java - 从 Spring websocket session 中提取远程端点对象

转载 作者:行者123 更新时间:2023-12-01 22:22:11 26 4
gpt4 key购买 nike

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

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

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

PS 注意:我正在使用基本的 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 session,TextMessage message) { 在这个方法内部,我创建多个线程并发送相同的 session 对象和一些其他参数。在每个线程内部,我没有修改任何与 session 对象相关的参数,但正在尝试执行

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

}

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

    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发送异步消息?如果是,请告诉我上面的代码需要进行哪些配置更改。或者我们可以从 Spring Websocket Session 中提取核心 AsyncRemoteEndPoint 和 BasicRemoteEndpoint 吗?我们可以发送异步消息吗?或者如果不是上述两种情况,请移动代码到共同的地方并放置同步(sessionObject){发信息}..很抱歉,如果问题的框架不清楚或已经是重复的问题

请注意,我没有使用任何 Stomp 客户端或 Spring Websocket 上的任何其他功能。我使用普通的 Spring Websocket。是否可以不使用 Future(Java 功能)(如果是的话......那就更好了) ?

最佳答案

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

装饰器“强制使用发送缓冲区一次发送一条消息,并限制每个 session 的发送时间。这在很大程度上有助于限制慢速客户端的影响”

关于java - 从 Spring websocket session 中提取远程端点对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36318483/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com