Я работаю над приложением, в котором я постоянно читаю данные из топи Kafka c. Эти данные поступают в формате String, которые я затем записываю в файл xml и сохраняю на жестком диске. Теперь эти данные поступают случайным образом, и в основном они должны поступать в большом количестве, в быстрой последовательности.
Для записи этих файлов я использую службу Executor.
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 на моем экземпляре исполнителя, но мое приложение должно работать непрерывно.
Если в случае какого-либо исключения все мое приложение будет убито, будет ли оно автоматически отключать моего исполнителя ? Или мне следует поймать непроверенное исключение и выключить свой исполнитель, как я сделал выше в моем коде? Могу ли я отказаться от явного отключения моего исполнителя в моем коде? Какие у меня варианты?
РЕДАКТИРОВАТЬ: Поскольку мой класс был классом @RestController, я использовал следующий способ выключения моей службы исполнителя
@PreDestroy
private void destroy() {
executor.shutdownNow();
if(executor != null) {
System.out.println("executor.isShutdown() = " + executor.isShutdown());
System.out.println("executor.isTerminated() = " + executor.isTerminated());
}
}