我正在开发一个应用程序,在这个应用程序中,我不断地从一个Kafka主题中读取数据。这些数据是以字符串格式来的,然后我将其写入一个xml文件&;存储在硬盘上。现在,这些数据是随机来的,而且大多数情况下应该是批量来的,是快速连续的。
为了写入这些文件,我使用的是一个执行器服务。
ExecutorService executor = Executors.newFixedThreadPool(4);
/*
called multiple times in quick succession
*/
public void writeContent(String message) {
try {
executor.execute(new FileWriterTask(message));
} catch(Exception e) {
executor.shutdownNow();
e.printStackTrace();
}
}
private class FileWriterTask implements Runnable{
String data;
FileWriterTask(String content){
this.data = content;
}
@Override
public void run() {
try {
String fileName = UUID.randomUUID().toString();
File file = new File("custom path" + fileName + ".xml");
FileUtils.writeStringToFile(file, data, Charset.forName("UTF-8"));
} catch (IOException e) {
e.printStackTrace();
}
}
}
我想知道什么时候应该关闭我的执行器服务。如果我的应用程序是有时间限制的,我会在我的执行器实例上使用 awaitTermination,但我的应用程序应该是连续运行的。
如果出现任何异常,我的整个应用程序被杀死,它会自动关闭我的执行器吗?或者我应该捕获一个未选中的异常并关闭我的执行器,就像我在我的代码中做的那样?我可以选择不在我的代码中显式关闭我的执行器吗?我有什么选择?
EDIT:由于我的类是一个@RestController类,我使用了以下方式来关闭我的执行器服务。
@PreDestroy
private void destroy() {
executor.shutdownNow();
if(executor != null) {
System.out.println("executor.isShutdown() = " + executor.isShutdown());
System.out.println("executor.isTerminated() = " + executor.isTerminated());
}
}
关闭你的 ExecutorService
. 有两种类型的关机你应该注意。关机() 和 shutdownNow().
如果你的应用程序是在应用服务器上运行的Java EE,你也可以用一个 管理执行者服务,由框架管理,将自动关闭。