Skip to content
Advertisement

Clean shutdown of Spring WebSockets STOMP client

A Spring WebSocket STOMP client sends a long to Spring WebSocket STOMP server that immediately returns the same value. When the client completes sending, it exits its main thread and the client terminates as expected.

If I enable STOMP heartbeats:

webSocketStompClient.setTaskScheduler(
    new DefaultManagedTaskScheduler()
    );

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

the client no longer exits the JVM when the client’s main thread finishes because the DefaultManagedTaskScheduler task-scheduler started a non-daemon thread (“pool-2-thread-1”).

I don’t want to exit via System.exit, so how can the keep-alive task-scheduler be shutdown so the client terminates when the main thread finishes?

Advertisement

Answer

TL;DR

Build and keep the JDKs executor and shut down the executor when finished.

Details:

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();
    }

}

In the appropriate context, construct and keep the new task-scheduler:

MyTaskScheduler myTaskScheduler = new MyTaskScheduler();

And use the new task-scheduler instance for heartbeats:

webSocketStompClient.setTaskScheduler(
    myTaskScheduler
    );

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

When application is finished shut down the executor:

myTaskScheduler.shutdown();
User contributions licensed under: CC BY-SA
10 People found this is helpful
Advertisement