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