Spring boot 骆驼不';t使用max idle seconds属性终止Java进程(Spring引导)

Spring boot 骆驼不';t使用max idle seconds属性终止Java进程(Spring引导),spring-boot,jvm,apache-camel,integration,Spring Boot,Jvm,Apache Camel,Integration,我有一个使用ApacheCamel的Spring引导应用程序。它是一个独立的应用程序,使用Camel文件组件轮询目录,处理内容,并使用Camel-Kafka组件将其发送给Kafka。我希望应用程序是短期的,所以我希望它在给定的空闲秒后自动终止。我使用的是camel-spring启动程序依赖项,因此我可以在应用程序属性中设置最大空闲秒数: camel.springboot.duration max idle seconds=20 20秒后,我看到camel上下文和我的web服务器(用于执行器)正常

我有一个使用ApacheCamel的Spring引导应用程序。它是一个独立的应用程序,使用Camel文件组件轮询目录,处理内容,并使用Camel-Kafka组件将其发送给Kafka。我希望应用程序是短期的,所以我希望它在给定的空闲秒后自动终止。我使用的是camel-spring启动程序依赖项,因此我可以在应用程序属性中设置最大空闲秒数:

camel.springboot.duration max idle seconds=20

20秒后,我看到camel上下文和我的web服务器(用于执行器)正常关闭,但java进程没有返回退出代码0。这个过程永远都是这样

使用类似的属性,如果我这次设置了
camel.springboot.duration max seconds=20
,则camel上下文和web服务器关闭日志完全相同,并且正确关闭,Java进程返回一个退出代码0,这是我所期望的


你有没有遇到过类似的行为?为什么duration max idle seconds可以正常关闭camel,但不会终止Java进程?

我在camel 3.2.0上遇到了这个问题,更新到3.6.0解决了这个问题。

进行线程转储以查看哪些非守护进程线程正在运行。是的,我认为我们最近在即将发布的camel 3.2.0版本中解决了这个问题,同时解决了以下问题:当使用上面提到的两个不同属性运行时,我进行了两次线程转储。当我使用camel.springboot.duration max idle seconds=20达到最大空闲秒时,只有非守护进程是状态为RUNNABLE的DestroyJavaVM:“DestroyJavaVM”#72 prio=5 os_prio=0 tid=0x00000000249ad000 nid=0x7d4c等待条件[0x0000000000000000]java.lang.Thread.State:RUNNABLE Thread dump使用
camel.springboot.duration max seconds=20
,给出了不同的图片:SpringContextShutdownHook非守护进程是可运行的,而DestroyJavaVM正在等待(在对象监视器上)@ClausIbsen我可以重现该问题,但它在属性duration max seconds中有效。我的问题是当我使用duration max idle seconds时,我只希望应用程序在空闲一段时间后终止并退出。通过实现自定义ApplicationListener,如果ApplicationEvent是ContextClosedEvent,我发现了一个棘手的解决方法,在这里我自己退出系统。但是,这种方法会覆盖Camel的正常关闭,即它首先停止并关闭路由,破坏bean和CamelContext。@apangin线程转储中还有另一个非守护进程线程。池-2-线程-1,状态为定时等待(驻车)。我认为此线程是由MainDurationEventNotifier创建的,用于停止Camel。我还看到了日志(错误的日志名为MainLifecycleStrategy)“durationmax idle触发JVM关闭”。但是,我不确定它是否会导致Java进程挂起。