我如何延迟关机,直到所有通道(Spring积分)为空?

dbf7pr2w  于 2023-03-18  发布在  Spring
关注(0)|答案(2)|浏览(116)

我有一个Sping Boot 应用程序,它将文件加载到QueueChannel中,然后由一个异步ServiceActivator处理文件消息。
在应用程序停止时,应等到所有排队的消息处理完毕后再关闭。
application.properties:服务器关闭:优美
Spring集成版本:6.0.2
我尝试了以下解决方案:

MessageChannels.queue("inputChannel", 20)
            .gracefulShutdownTimeout(Duration.ofSeconds(60)) // wait up to 60 seconds for in-flight messages to be processed on this channel
            .get();
  • 〉Spring集成6不支持
IntegrationFlowContextInitializer initializer = new IntegrationFlowContextInitializer();
    initializer.setShutdownTimeout(30000); // default timeout for all channels is 30 seconds
    return initializer;
  • 〉Spring集成6不支持
@Bean
public GracefulShutdownStrategy gracefulShutdownStrategy() {
    return new DefaultGracefulShutdownStrategy()
            .shutdownTimeout(Duration.ofSeconds(30)); // default timeout for all channels is 30 seconds
}
  • 〉Spring集成6不支持
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10);
        executor.setMaxPoolSize(10);
        executor.setQueueCapacity(40);
        executor.setWaitForTasksToCompleteOnShutdown(true);
        executor.setAwaitTerminationSeconds(60);
  • 〉没有成功
bmp9r5qi

bmp9r5qi1#

Spring Integration中还没有这样的特性:https://github.com/spring-projects/spring-integration/issues/7095 .
我建议对QueueChannel使用一个持久性存储,这样在重启之间就不会丢失消息,尽管还不清楚为什么要将文件加载到队列中,如果你可以在加载后立即处理它们的话。
更多信息请参见文档:https://docs.spring.io/spring-integration/docs/current/reference/html/system-management.html#message-store

im9ewurl

im9ewurl2#

我发现了一个servlet侦听器的解决方案:

@Bean
public ServletListenerRegistrationBean<ServletContextListener> myServletListener() {
    ServletListenerRegistrationBean<ServletContextListener> srb = new ServletListenerRegistrationBean<>();
    srb.setListener(new ExampleServletContextListener());
    return srb;
}

在contextDestroyed方法中,我可以检查QueueChannels是否为空,或者给予它一些时间。
我本以为优雅的关闭会为此类用例给予某种支持。

相关问题