关闭执行器服务

问题描述 投票:0回答:1

我正在开发一个应用程序,在这个应用程序中,我不断地从一个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());
        }
    }
java executorservice executor
1个回答
2
投票

关闭你的 ExecutorService. 有两种类型的关机你应该注意。关机()shutdownNow().

如果你的应用程序是在应用服务器上运行的Java EE,你也可以用一个 管理执行者服务,由框架管理,将自动关闭。

© www.soinside.com 2019 - 2024. All rights reserved.