diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/LargeBodyEncoder.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/LargeBodyEncoder.java index 8b962828d2..7a248b4b97 100644 --- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/LargeBodyEncoder.java +++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/LargeBodyEncoder.java @@ -51,5 +51,5 @@ public interface LargeBodyEncoder { /** * This method must not be called directly by ActiveMQ Artemis clients. */ - long getLargeBodySize(); + long getLargeBodySize() throws ActiveMQException; } diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/LargeServerMessageImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/LargeServerMessageImpl.java index 297328d90e..940f8b0352 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/LargeServerMessageImpl.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/LargeServerMessageImpl.java @@ -22,6 +22,7 @@ import java.util.concurrent.atomic.AtomicInteger; import org.apache.activemq.artemis.api.core.ActiveMQBuffer; import org.apache.activemq.artemis.api.core.ActiveMQException; import org.apache.activemq.artemis.api.core.ActiveMQExceptionType; +import org.apache.activemq.artemis.api.core.ActiveMQIOErrorException; import org.apache.activemq.artemis.api.core.ActiveMQInternalErrorException; import org.apache.activemq.artemis.api.core.Message; import org.apache.activemq.artemis.core.buffers.impl.ChannelBufferWrapper; @@ -238,10 +239,7 @@ public final class LargeServerMessageImpl extends CoreMessage implements LargeSe public synchronized int getMemoryEstimate() { if (memoryEstimate == -1) { // The body won't be on memory (aways on-file), so we don't consider this for paging - memoryEstimate = getHeadersAndPropertiesEncodeSize() + DataConstants.SIZE_INT + - getEncodeSize() + - (16 + 4) * 2 + - 1; + memoryEstimate = getHeadersAndPropertiesEncodeSize() + DataConstants.SIZE_INT + getEncodeSize() + (16 + 4) * 2 + 1; } return memoryEstimate; @@ -345,13 +343,35 @@ public final class LargeServerMessageImpl extends CoreMessage implements LargeSe return file; } + private long getBodySize() throws ActiveMQException { + + try { + if (bodySize < 0) { + if (file != null) { + bodySize = file.size(); + } else { + SequentialFile tmpFile = createFile(); + bodySize = tmpFile.size(); + tmpFile.close(); + } + } + return bodySize; + } catch (Exception e) { + ActiveMQIOErrorException errorException = new ActiveMQIOErrorException(); + errorException.initCause(e); + throw errorException; + } + } + @Override public long getPersistentSize() throws ActiveMQException { long size = super.getPersistentSize(); - size += getBodyEncoder().getLargeBodySize(); + size += getBodySize(); return size; + } + @Override public String toString() { try { @@ -463,15 +483,8 @@ public final class LargeServerMessageImpl extends CoreMessage implements LargeSe * @see org.apache.activemq.artemis.core.message.LargeBodyEncoder#getLargeBodySize() */ @Override - public long getLargeBodySize() { - if (bodySize < 0) { - try { - bodySize = file.size(); - } catch (Exception e) { - ActiveMQServerLogger.LOGGER.unableToCalculateFileSize(e); - } - } - return bodySize; + public long getLargeBodySize() throws ActiveMQException { + return getBodySize(); } } } diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerConsumerImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerConsumerImpl.java index 95d613ea00..8ef0fa1c9f 100644 --- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerConsumerImpl.java +++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerConsumerImpl.java @@ -1305,6 +1305,7 @@ public class ServerConsumerImpl implements ServerConsumer, ReadyListener { } if (context != null) { context.close(); + context = null; } largeMessage.releaseResources();