问题描述
我从具有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个容量,这样才能使下一个列表立即可用。