Spring batch 添加Splunk日志记录步骤后,Spring批处理作业未终止

Spring batch 添加Splunk日志记录步骤后,Spring批处理作业未终止,spring-batch,log4j2,splunk,Spring Batch,Log4j2,Splunk,我正在运行一个Spring批处理,但出于日志记录的目的,我将所有日志重定向到Splunk。日志会按预期在Splunk上更新,但现在我的作业不会终止。即使在处理完所有内容后,它仍在运行 启用Splunk日志记录后,如何终止作业 log4j2.xml: <?xml version="1.0" encoding="UTF-8"?> <Configuration status="info" name="cspprov

我正在运行一个Spring批处理,但出于日志记录的目的,我将所有日志重定向到Splunk。日志会按预期在Splunk上更新,但现在我的作业不会终止。即使在处理完所有内容后,它仍在运行

启用Splunk日志记录后,如何终止作业

log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="info" name="cspprovmi"
               packages="com.prov">

    <Appenders>
        <SplunkHttp name="http" url="${env:SPLUNK_URL}"
                    token="${env:SPLUNK_TOKEN}"  host="${env:SPLUNK_NAMESPACE}"
                    index="cba_facts_cs" source="${env:SPLUNK_SOURCE}"
                    sourcetype="facts_cs:http:log" messageFormat="json"
                    disableCertificateValidation="true">
            <PatternLayout pattern="%msg" />
        </SplunkHttp>
        <Console name="Console" target="SYSTEM_OUT">
            <PatternLayout
                    pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />
        </Console>
    </Appenders>
    <Loggers>
        <Root level="info" additivity="false">
            <AppenderRef ref="http" level="info" />
        </Root>
    </Loggers>
</Configuration>
<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-batch</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-logging</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
我正在考虑的一个解决方法是在代码本身中包括
jobstener
和调用
system.exit(0)
。这似乎很好,因为即使启用了Splunk日志,它也会终止作业,但不确定是否有更好的方法来实现这一点(即优雅地退出流程)


您是如何运行作业的(在单个JVM中、在webapp中等)?根据您分享的内容,您的工作应在完成第7步后完成。如果它没有停止,这可能意味着step7仍在运行(如果它是面向块的步骤,您确定它的项读取器在某个点返回null吗?),或者有一个资源正在后台运行,阻止JVM退出(例如线程池)。请共享一个复制该问题的文件,以便能够以有效的方式帮助您。是的,后台进程是log4j,我添加了它以将日志从本地路由到Splunk。配置文件位于log4j2.xml中。在我的本地应用程序中很好,但我添加了log4j配置之后。进程没有终止,我必须强制发送退出信号。但是现在,由于它没有正常完成,状态被捕获为未知,而不是在批处理表中完成。因此,我想知道如何将log4j关机信号与spring batch集成,以便删除system.exit代码,并在完成作业后正常关机。您所说的“log4j关机信号”是什么意思?我不确定日志记录是否是阻止JVM停止的原因。同样,请分享一个简单的例子,再现问题,以便能够以有效的方式帮助您。
  //  Job
    @Bean
    public Job job(){
        return jobBuilderFactory.get("jobCSProvMI4275")
                .start(step1())
                .next(step2())
                .next(step3())
                .next(step4())
                .next(step5())
                .next(step6())
                .next(step7())
                .incrementer(new RunIdIncrementer())
                .build();
    }
}
   @Bean
    public JobExecutionListener jobMi4275ExecutionListener() {
        JobExecutionListener jobExecutionListener = new JobExecutionListener() {
            @Override
            public void beforeJob(JobExecution jobExecution) {
                LOGGER.info("jobCSP4275 Started executing..");
            }
            @Override
            public void afterJob(JobExecution jobExecution) {
                LOGGER.info("jobCSP4275 finished successfully..Exiting job !!");
              
                System.exit(0);
            }
        };
        return jobExecutionListener;
    }