【问题标题】:how to read messages by packet with JmsTemplate of Sring如何使用 Spring 的 JmsTemplate 按数据包读取消息
【发布时间】:2020-09-11 15:12:57
【问题描述】:

我在从包含 2 M 条消息的队列中读取消息时遇到了 outOfMemoryException。 例如,我正在尝试找到一种方法来阅读 1000 条消息。 这是我的代码

List<TextMessage> messages = jmsTemplate.browse(JndiQueues.BACKOUT, (session,browser) -> {
        Enumeration<?> browserEnumeration = browser.getEnumeration().;
        List<TextMessage> messageList = new ArrayList<TextMessage>();
        while (browserEnumeration.hasMoreElements()) {
            messageList.add((TextMessage) browserEnumeration.nextElement());
        }
        return messageList;
    });

谢谢

【问题讨论】:

    标签: spring spring-jms jmstemplate


    【解决方案1】:

    在不同的线程上执行浏览,并通过BlockingQueue&lt;List&lt;TextMessage&gt;&gt; 将结果子集传递给主线程。例如容量较小的LinkedBlockingQueue

    当队列满时浏览线程会阻塞。当主线程从队列中删除一个条目时,浏览器可以添加一个新条目。

    至少有 2 个容量可能是有意义的,以便下一个列表立即可用。

    【讨论】:

    • 你好 Gary,我的问题是,如果 JmsTemplate 中有一种方法可以通过某个数字(1000)获取消息,例如。因为我不知道浏览方法是否会在内存上加载导致内存泄漏的消息。还是因为向列表中添加消息加载了两百万条消息并导致outofMemory异常
    • 与模板无关;该模板只是为您提供了一个浏览器来使用,它不进行浏览;这是因为您的代码正在将所有消息读入内存;使用我描述的技术来避免这种情况。
    猜你喜欢
    • 2013-02-27
    • 2011-08-23
    • 2015-12-08
    • 2014-01-29
    • 2016-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多