【发布时间】:2019-08-21 07:56:47
【问题描述】:
在我使用新线程中收到的第一条消息并取消线程后,我无法从我的 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 以及为什么当我在执行程序服务中使用它并停止线程时会话会中断?如果我关闭线程或者这只是一些弹簧启动错误,我应该对会话做些什么吗?
【问题讨论】:
-
在您的示例中,您不需要
CountDownLatch。你确定你的代码在latch.await();下面有效吗? -
是的,这就是问题
标签: java spring-boot threadpool executorservice spring-websocket