Spring boot Spring批处理线程和非守护进程线程

Spring boot Spring批处理线程和非守护进程线程,spring-boot,spring-batch,Spring Boot,Spring Batch,如果Spring批处理应用程序中存在非守护进程线程,则当批处理终止时,应用程序从不关闭,即关闭信号永远不会到达JVM 这是预期的行为,还是由于故障导致Spring Batch无法发送信号 我附上一个非常简单的应用程序,用于复制该案例: 版本: 弹簧靴2.4.5 弹簧批次4.3.2 Java 11这与Spring批处理无关。Spring批处理不会阻止JVM关闭。一旦您的工作完成,您的JVM就应该终止,否则会有其他东西阻止它关闭。在您的情况下,您将执行器服务配置为非守护进程线程 我以您为例,删除了与

如果Spring批处理应用程序中存在非守护进程线程,则当批处理终止时,应用程序从不关闭,即关闭信号永远不会到达JVM

这是预期的行为,还是由于故障导致Spring Batch无法发送信号

我附上一个非常简单的应用程序,用于复制该案例:

版本: 弹簧靴2.4.5 弹簧批次4.3.2
Java 11这与Spring批处理无关。Spring批处理不会阻止JVM关闭。一旦您的工作完成,您的JVM就应该终止,否则会有其他东西阻止它关闭。在您的情况下,您将执行器服务配置为非守护进程线程

我以您为例,删除了与Spring Batch相关的所有内容,同样的情况也发生了:

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

import javax.annotation.PostConstruct;

import org.apache.commons.lang3.concurrent.BasicThreadFactory;

import org.springframework.boot.WebApplicationType;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;

@SpringBootApplication
public class DemoBatchApplication {

    public static void main(String[] args) {
        new SpringApplicationBuilder().sources(com.example.demo.batch.DemoBatchApplication.class)
            .web(WebApplicationType.NONE)
            .run(args);
    }

    private final ScheduledExecutorService scheduledExecutorService = Executors
            .newSingleThreadScheduledExecutor(new BasicThreadFactory.Builder()
                    .namingPattern("task-non-daemon-%d")
                    .daemon(false)
                    .build());

    @PostConstruct
    public void init() {
        this.scheduledExecutorService.scheduleAtFixedRate(() -> {
            System.out.println("Scheduled task non-daemon!!!!");
        }, 1L, 1000L, TimeUnit.MILLISECONDS);
    }
    
}
如果运行此应用程序,您将看到相同的行为:
scheduledExecutorService
将继续运行,因为您将其设置为非守护进程线程。如果将daemon标志更改为true,则JVM将在作业完成后立即停止。请查收