java - 彻底关闭 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 任务调度程序以便客户端在主线程完成时终止?
解决方案
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();
推荐阅读
- git - 关于 git commit error: pathspec 'A' did not match any file(s) known to git
- ajax - 如何在数据表中使用 ajax 发送参数?
- angularjs - 未捕获的语法错误:使用“@babel/preset-env”时,无法在模块外使用 import 语句
- python - PyYaml 文档中的错误或遗漏(如何构造类)
- c# - 如何将字典结果绑定到类对象c#linq
- c# - MailKit.Net.Smtp.SmtpClient SMTP 服务器不支持身份验证
- c# - 是否可以选择将文件添加到 Visual Studio 中的项目?
- babeljs - 找不到模块'babel-plugin-r'
- c - C while 循环正在打印额外的数字
- python - 如何在不修改其他变量的情况下从 netcdf 文件中删除/删除维度?