首页 > 解决方案 > 彻底关闭 Spring WebSockets STOMP 客户端

问题描述

Spring WebSocket STOMP 客户端向 Spring WebSocket STOMP 服务器发送一个long立即返回相同值的消息。当客户端完成发送时,它退出其主线程,客户端按预期终止。

如果我启用 STOMP 心跳

webSocketStompClient.setTaskScheduler(
    new DefaultManagedTaskScheduler()
    );

webSocketStompClient.setDefaultHeartbeat(
    new long[] {10_000, 10_000}
    );

当客户端的主线程完成时,客户端不再退出 JVM,因为DefaultManagedTaskScheduler任务调度程序启动了一个非守护线程(“pool-2-thread-1”)。

我不想退出 via System.exit,那么如何关闭 keep-alive 任​​务调度程序以便客户端在主线程完成时终止?

标签: javaspringwebsocket

解决方案


TL;博士

构建并保留 JDK 执行程序,完成后关闭执行程序。

详情

public class MyTaskScheduler {
    private final ScheduledExecutorService executor;
    private final ConcurrentTaskScheduler scheduler;

    public MyTaskScheduler() {
        executor = Executors.newScheduledThreadPool(1);
        scheduler = new ConcurrentTaskScheduler(executor);
    }

    public TaskScheduler taskScheduler() {
        return scheduler;
    }

    public void shutdown() {
        executor.shutdown();
    }

}

在适当的上下文中,构造并保留新的任务调度器:

MyTaskScheduler myTaskScheduler = new MyTaskScheduler();

并将新的任务调度程序实例用于心跳:

webSocketStompClient.setTaskScheduler(
    myTaskScheduler
    );

webSocketStompClient.setDefaultHeartbeat(
    new long[] {10_000, 10_000}
    );

应用程序完成后关闭执行程序:

myTaskScheduler.shutdown();

推荐阅读