如何使用Sring的JmsTemplate按数据包读取消息

问题描述

我从具有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;
    });

谢谢

解决方法

在其他线程上执行浏览,然后将结果子集通过BlockingQueue<List<TextMessage>>传递到主线程。例如LinkedBlockingQueue,容量较小。

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

至少要有2个容量,这样才能使下一个列表立即可用。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...