У меня проблема с получением новых сообщений от моего JS-клиента после того, как я использую первое полученное сообщение в новой теме и отменяю тему. Я использую пружинный ботинок для задней части. Интересно то, что сессия не закрыта, но я просто не могу получать больше сообщений после первого, когда прерываю поток.
Вот мой конфиг websocket:
@Configuration
@EnableWebSocket
public class WebSocketConfiguration implements WebSocketConfigurer {
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
registry.addHandler(new WebSocketHandler(), "/socket1").setAllowedOrigins("*");
}
}
Вот мой обработчик со службой executor:
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);
}
}
}
Теперь проблема заключается в следующем: я вызываю свой метод handleTextMessage из JS-клиента, и начинается выполнение, затем я нажимаю другую кнопку на своей странице, и она меняет логический флаг Test.stop на true, и таким образом я останавливаю оставшиеся темы должны быть выполнены. После этого, если я вызываю handleTextMessage из js, как в первый раз, он не вызывается. Я проверил, закрываю ли я WebSocketSession, а затем пытаюсь вызвать бэкэнд, и результат такой же, но в моем случае сессия точно не закрыта! Вопрос в том, как использовать WebSocketSession много раз и почему сеанс прерывается, когда я использую его в своей службе исполнителя и останавливаю поток? Должен ли я что-то делать с сеансом, если я закрываю потоки или это просто какая-то весенняя ошибка загрузки?