![](/img/trans.png)
[英]Java websocket: How to receive PongMessage from websocket client and respond to this message
[英]Cannot receive another websocket message after interruption of thread with websocket session
我在新线程中使用第一个收到的消息并取消线程后,从我的JS客户端接收新消息时遇到问题。 我使用弹簧靴作为后端。 有趣的是会话没有关闭,但是当我打断我的线程时,我在第一个消息之后就再也收不到消息了。
这是我的websocket配置:
@Configuration
@EnableWebSocket
public class WebSocketConfiguration implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(new WebSocketHandler(), "/socket1").setAllowedOrigins("*");
}
}
这是我的执行者服务处理程序:
public class WebSocketHandler extends AbstractWebSocketHandler {
Logger logger = LoggerFactory.getLogger(WebSocketHandler.class);
Test test = new Test();
@Override
protected void handleTextMessage(WebSocketSession session, TextMessage message) throws Exception {
logger.info("START");
List<UrlWithPageNumber> listings = new ArrayList<>();
listings.add(new UrlWithPageNumber( "www.somesite.com", 1));
listings.add(new UrlWithPageNumber( "www.anothersite.com", 1));
listings.add(new UrlWithPageNumber( "www.thirdsite.com", 1));
checkItemsAsync(listings, session);
logger.info("DONE");
session.sendMessage(new TextMessage("DONE"));
}
public void checkItemsAsync(List<UrlWithPageNumber> listings, WebSocketSession session) {
ExecutorService executorService = Executors.newFixedThreadPool(1);
final CountDownLatch latch = new CountDownLatch(listings.size());
for (UrlWithPageNumber listing : listings) {
executorService.submit(() -> {
if(Test.stop) {
return;
}
ListingInfo listingInfo = test.itemPage(listing.getLink(), 1, 1);
logger.info(listingInfo.toString());
synchronized(session) {
try {
session.sendMessage(new TextMessage(listingInfo.toString()));
} catch (IOException e) {
e.printStackTrace();
}
}
latch.countDown();
});
}
try {
latch.await();
} catch (InterruptedException ie) {
throw new RuntimeException(ie);
}
}
}
现在的问题如下:我从JS客户端调用我的handleTextMessage方法,然后执行开始然后我在我的页面中按下另一个按钮,它将Test.stop布尔标志更改为true,这样我就会停止剩余的线程执行。 之后,如果我第一次调用它时从js调用handleTextMessage。 我检查了我是否关闭了WebSocketSession,然后尝试调用后端,结果类似,但在我的情况下,会话没有关闭! 问题是如何多次使用WebSocketSession以及当我在执行程序服务中使用它并停止线程时会话被破坏的原因? 如果我关闭线程,或者这只是一些spring boot bug,我应该对会话做些什么吗?
问题是在锁存器中等待超过预期,因为我跳过一些线程..
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.