【问题标题】:spring boot application does not exit after all tasks are completed所有任务完成后spring boot应用程序不退出
【发布时间】:2016-08-14 23:20:33
【问题描述】:

这是我的应用程序类 -

@EnableAutoConfiguration
@SpringBootApplication
@Configuration
public class Application implements CommandLineRunner {
private static final Logger log = LoggerFactory.getLogger(Application.class);

@Autowired
private ITestService3 testService3;

public static void main(String[] args) {
    System.exit(SpringApplication.exit(SpringApplication.run(Application.class, args)));

    @Override
    public void run(String... strings) throws Exception {
        testService3.multiThreadTest();
    }
}

方法——

public void multiThreadTest() {
    ThreadPoolExecutor readExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool(10);
    List<String> files = listFiles(new File("/Users/admin/filesList"), new ArrayList<>());
    for (String file : files) {
        readExecutor.execute(new FileParser(file));
    }
}

即使在读取所有文件后,应用程序也不会终止 但是当我使用

System.exit(SpringApplication.exit(SpringApplication.run(Application.class, args)));

应用程序终止,所有线程都被杀死。

当我使用 -

SpringApplication.run(Application.class, args).close();

即使应用程序这样说,线程仍继续运行 -

org.springframework.context.annotation.AnnotationConfigApplicationContext@6eda5c9:启动日期 [Mon Aug 15 04:42:02 IST 2016];上下文层次的根 2016-08-15 04:42:05.390 INFO 36600 --- [main] o.s.j.e.a.AnnotationMBeanExporter:在关机时注销 JMX 公开的 bean

然后我必须手动终止应用程序。应用程序以代码 130 退出

有人可以帮助我优雅地关闭应用程序吗?

谢谢

【问题讨论】:

    标签: java spring multithreading spring-boot


    【解决方案1】:

    首先,您没有正确关闭ExecutorService,您的multiThreadTest 应该如下所示:

    public void multiThreadTest() throws InterruptedException {
        ThreadPoolExecutor readExecutor = (ThreadPoolExecutor) Executors.newFixedThreadPool(10);
        List<String> files = listFiles(new File("/Users/admin/filesList"), new ArrayList<>());
        for (String file : files) {
            readExecutor.execute(new FileParser(file));
        }
    
        readExecutor.shutdown();
        readExecutor.awaitTermination(5, TimeUnit.MINUTES); // wait for tasks to complete
        readExecutor.shutdownNow();
    }
    

    【讨论】:

    • 我的应用程序运行了很长时间。也可能是几天。在这种情况下如何设置 - readExecutor.awaitTermination(5, TimeUnit.MINUTES);
    • 你可以使用DAYS时间单位-readExecutor.awaitTermination(5, TimeUnit.DAYS)
    • 您实际上并不需要最后两行 - awaitTerminationshutdownNow,但最好设置一个任务可以运行多长时间的阈值。
    猜你喜欢
    • 2017-10-07
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 2011-01-25
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 2018-12-07
    相关资源
    最近更新 更多