Не удается получить другое сообщение веб-сокета после прерывания потока с сеансом веб-сокета - PullRequest
0 голосов
/ 30 марта 2019

У меня проблема с получением новых сообщений от моего 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 много раз и почему сеанс прерывается, когда я использую его в своей службе исполнителя и останавливаю поток? Должен ли я что-то делать с сеансом, если я закрываю потоки или это просто какая-то весенняя ошибка загрузки?

1 Ответ

0 голосов
/ 30 марта 2019

Проблема в защелке, она ждет больше, чем ожидалось, потому что я пропускаю некоторые темы ..

...