From c8fd56202be79d5a1c4bc0c27552072fe6d0b580 Mon Sep 17 00:00:00 2001 From: Robert Godfrey Date: Tue, 27 Jan 2015 20:39:01 +0000 Subject: QPID-6331 : Allow AMQP 1.0 message content to be evicted to disk git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1655154 13f79535-47bb-0310-9956-ffa450edef68 --- .../qpid/server/protocol/v1_0/Message_1_0.java | 46 +++++++++++++++------- 1 file changed, 32 insertions(+), 14 deletions(-) (limited to 'qpid/java') diff --git a/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Message_1_0.java b/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Message_1_0.java index 36796851e0..18f5ba9e2e 100644 --- a/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Message_1_0.java +++ b/qpid/java/broker-plugins/amqp-1-0-protocol/src/main/java/org/apache/qpid/server/protocol/v1_0/Message_1_0.java @@ -21,23 +21,42 @@ package org.apache.qpid.server.protocol.v1_0; +import java.lang.ref.SoftReference; import java.nio.ByteBuffer; import java.util.ArrayList; import java.util.List; + import org.apache.qpid.server.message.AbstractServerMessageImpl; import org.apache.qpid.server.store.StoredMessage; public class Message_1_0 extends AbstractServerMessageImpl { - private List _fragments; + private volatile SoftReference> _fragmentsRef; private long _arrivalTime; + private final long _size; public Message_1_0(final StoredMessage storedMessage) { super(storedMessage, null); - _fragments = restoreFragments(storedMessage); + final List fragments = restoreFragments(getStoredMessage()); + _fragmentsRef = new SoftReference<>(fragments); + _size = calculateSize(fragments); + } + + private long calculateSize(final List fragments) + { + + long size = 0l; + if(fragments != null) + { + for(ByteBuffer buf : fragments) + { + size += buf.remaining(); + } + } + return size; } private static List restoreFragments(StoredMessage storedMessage) @@ -65,7 +84,8 @@ public class Message_1_0 extends AbstractServerMessageImpl(fragments); + _size = calculateSize(fragments); _arrivalTime = System.currentTimeMillis(); } @@ -94,16 +114,7 @@ public class Message_1_0 extends AbstractServerMessageImpl getFragments() { - return _fragments; + + List fragments = _fragmentsRef.get(); + if(fragments == null) + { + fragments = restoreFragments(getStoredMessage()); + _fragmentsRef = new SoftReference<>(fragments); + } + return fragments; } } -- cgit v1.2.1