Websocket会话中断线程后,无法再接收其他Websocket消息

时间:2019-03-30 16:06:14

标签: java spring-boot threadpool executorservice spring-websocket

在新线程中使用第一条收到的消息并取消线程后,我无法从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?为什么在我的executor服务中使用该会话并停止线程时,该会话会中断?如果我关闭线程,还是应该对会话做一些事情,或者这仅仅是一些spring boot bug?

1 个答案:

答案 0 :(得分:0)

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