繁体   English   中英

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

[英]Cannot receive another websocket message after interruption of thread with websocket session

我在新线程中使用第一个收到的消息并取消线程后,从我的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 boot bug,我应该对会话做些什么吗?

问题是在锁存器中等待超过预期,因为我跳过一些线程..

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM