【问题标题】:Cannot receive another websocket message after interruption of thread with websocket session使用 websocket 会话中断线程后无法接收另一条 websocket 消息
【发布时间】: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


【解决方案1】:

问题出在锁存器中,因为我跳过了一些线程,所以它等待的时间比预期的要长..

【讨论】:

    猜你喜欢
    • 2023-03-06
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 2022-10-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多