【问题标题】:Heap Space error in SimpleMessageListenerContainerSimpleMessageListenerContainer 中的堆空间错误
【发布时间】:2020-11-07 22:29:42
【问题描述】:

我们广泛使用弹簧集成框架。在我们的一个用例中,我们从第三方 api 中提取大量数据。这样做需要一些时间,例如 60 秒或更长时间才能获得 200 ok 响应和数据。但在某些情况下,数据太大了,我们开始获取

 o.s.a.r.l.SimpleMessageListenerContainer Stopping container from aborted consumer java.lang.OutOfMemoryError: Java heap space

当此错误出现时,队列使用者(线程)死亡并反映在 rabbit mq 控制台中。我想找出一种方法可以在我的应用程序中捕获此错误日志,以便引发相关错误。

@Service
public class FaiureListener implements ApplicationListener<ListenerContainerConsumerFailedEvent> {
  
    @Autowired
    HangoutAlertPoster alertSender;
    
    @Override
    public void onApplicationEvent(ListenerContainerConsumerFailedEvent event) {
       alertSender.sendHangoutAlert("[FATAL] Consumer aborted error.  Reason="+event.getReason());
        
    }
}

【问题讨论】:

    标签: spring spring-boot rabbitmq spring-integration


    【解决方案1】:

    OOM 错误通常是致命的,您必须重新启动 JVM。

    您可以添加ApplicationListener@EventListener 以接收包含原因的ListenerContainerConsumerFailedEvent

    https://docs.spring.io/spring-amqp/docs/2.2.8.RELEASE/reference/html/#consumer-events

    如果您的消息很大,您应该减少预取计数以减少内存中保存的消息,或者考虑改用DirectMessageListenerContainer

    Choosing a Container

    【讨论】:

    • Garry 我无法检测到该事件。我按照你在这里写的例子stackoverflow.com/questions/55263378/…
    • 你一定做错了什么;仔细检查你的工作。
    • Garry 用代码更新了问题。此代码适用于某些错误,例如 Consumer queue(s) not available 。当出现内存不足错误时,这不起作用
    • OOM 错误很困难——正如我提到的,它们通常是致命的——在某些情况下,它会阻止创建新对象(例如事件)。因此,正确的解决方案是完全避免 OOM。正如我所建议的,您应该减少 prefetchCount 容器属性以避免将这么多大消息加载到内存中。默认情况下,对于最新版本,prefetchCount 为 250。
    猜你喜欢
    • 2016-01-19
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-05
    • 2015-12-15
    • 2018-03-30
    相关资源
    最近更新 更多