Завершение работы службы исполнителя - PullRequest
0 голосов
/ 09 мая 2020

Я работаю над приложением, в котором я постоянно читаю данные из топи 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());
        }
    }

1 Ответ

2 голосов
/ 09 мая 2020

Это хорошая практика - выключить ExecutorService. Вы должны знать два типа завершения работы: shutdown () и shutdownNow () .

Если вы запускаете приложение на сервере приложений с Java EE, вы также можете использовать ManagedExecutorService , который управляется фреймворком и будет отключен автоматически.

...