在与 websocket 会话中断线程后,无法接收另一个 websocket 消息



在新线程中使用收到的第一条消息并取消线程后,我在从 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 启动错误?

问题出在闩锁中,它等待的时间比预期的要长,因为我跳过了一些线程。

最新更新