正常关闭包含连接的 Java 任务
Gracefully shutting down a Java task which contains a connection
我有许多由执行程序服务管理的可运行任务。
这些任务本质上是 JMS 队列轮询器并包含它们自己的连接。
例如:
ExecutorService executor = Executors.newFixedThreadPool(...);
executor.submit(new MyListener());
我的听众:
public class MyListener implements Runnable {
@Override
public void run() {
// Create my JMS connection here
}
}
如何优雅地关闭每个任务中的 JMS 连接,然后继续关闭每个线程?
我在使用 shutdown()
关闭执行程序服务时遇到问题。
我需要用 shutdownNow()
强制中断,但是,如果我没有显式调用 .close()
,我如何确定我的 JMS 连接已经关闭?
是否有一个我缺少的接口允许在我尝试停止任务时执行关闭挂钩?
最简单的方法是使用 class 共享的原子布尔值,它表示关闭和可运行。这告诉他们停止。另一种选择是自己找到线程并中断它们。您需要捕获中断的异常并关闭连接。您可以在runnable启动时设置线程名称以便于识别。
这是我使用原子布尔值的建议从容关闭保持连接的线程的解决方案:
MyRunnable implements Runnable {
private volatile boolean isActive = true;
public void run() {
while(isActive && !Thread.currentThread().isInterrupted()) {
...
}
}
public void stop() {
isActive = false;
}
}
主线程:
private void myShutdownHook() {
myRunnableInstance.stop();
// Can safely shutdown executor now...
}
我有许多由执行程序服务管理的可运行任务。
这些任务本质上是 JMS 队列轮询器并包含它们自己的连接。
例如:
ExecutorService executor = Executors.newFixedThreadPool(...);
executor.submit(new MyListener());
我的听众:
public class MyListener implements Runnable {
@Override
public void run() {
// Create my JMS connection here
}
}
如何优雅地关闭每个任务中的 JMS 连接,然后继续关闭每个线程?
我在使用 shutdown()
关闭执行程序服务时遇到问题。
我需要用 shutdownNow()
强制中断,但是,如果我没有显式调用 .close()
,我如何确定我的 JMS 连接已经关闭?
是否有一个我缺少的接口允许在我尝试停止任务时执行关闭挂钩?
最简单的方法是使用 class 共享的原子布尔值,它表示关闭和可运行。这告诉他们停止。另一种选择是自己找到线程并中断它们。您需要捕获中断的异常并关闭连接。您可以在runnable启动时设置线程名称以便于识别。
这是我使用原子布尔值的建议从容关闭保持连接的线程的解决方案:
MyRunnable implements Runnable {
private volatile boolean isActive = true;
public void run() {
while(isActive && !Thread.currentThread().isInterrupted()) {
...
}
}
public void stop() {
isActive = false;
}
}
主线程:
private void myShutdownHook() {
myRunnableInstance.stop();
// Can safely shutdown executor now...
}