在新线程中使用第一条收到的消息并取消线程后,我无法从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?为什么在我的executor服务中使用该会话并停止线程时,该会话会中断?如果我关闭线程,还是应该对会话做一些事情,或者这仅仅是一些spring boot bug?
答案 0 :(得分:0)
问题出在闩锁中,它等待的时间比预期的要长,因为我跳过了一些线程。