我有一个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);
- 〉没有成功
2条答案
按热度按时间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
im9ewurl2#
我发现了一个servlet侦听器的解决方案:
在contextDestroyed方法中,我可以检查QueueChannels是否为空,或者给予它一些时间。
我本以为优雅的关闭会为此类用例给予某种支持。