如何检查数据是否正在 Spring 集成中处理或闲置

How to check if data is getting processed in Spring Integration or sitting idle

这是关于 Spring 集成 (SI) 应用程序,在我的例子中,存在许多端点。所以通常当数据进入这个应用程序时,大约需要 60 秒才能完成处理。 我现在正在尝试为此应用程序构建关闭机制,它将执行以下操作:-

  1. 它将首先停止摄取层端点(在我的例子中是 kafka 侦听器),这样就不会再有消息进入应用程序
  2. 然后它会等待 60 秒后关机。以便处理现有消息。

但是这个等待时间是硬编码的,我想检查应用程序是否正在处理任何数据。如果是,则等待 30 秒,然后再次检查。如果没有数据正在处理,则关闭应用程序。 请让我知道是否有任何方法可以检查任何 SI 端点中是否存在数据。

out-of-the-box 组件中没有这样的钩子。甚至可能无法实现,因为框架中的所有组件都是无状态的。

现在请告诉我,是什么让您认为需要实施自己的关闭机制。为什么常规 ApplicationContext.close() 对您来说不够?

在文档中查看有关生命周期的更多信息:https://docs.spring.io/spring-framework/docs/current/reference/html/core.html#beans-factory-nature

框架确实首先停止了入站端点,以防止外部数据在处于关闭状态时进入应用程序。然后它停止所有其他内部端点以停止处理它们的传入消息。但所有 on-the-fly 条消息仍在处理中。如果有东西正在执行,应用程序上下文不会完成。

如果这对您来说还不够,我建议您使用 AtomicInteger activeCount 作为全局 bean。当您提到的 Kafka 侦听器发出消息时,您 incrementAndGet() 它。当您在流程结束时处理完消息后,您调用它 decrementAndGet()。当您的自定义关闭功能正在进行时,您只需检查 activeCount.get() 的数量以确保它是 0 以优雅地终止您的进程。

但同样:我们不需要所有这些,因为标准 ApplicationContext.close() 涵盖了我们。