rejectedConsumers;
+ protected DeliveryAnnotations deliveryAnnotationsForSendBuffer;
// These are properties set at the broker level and carried only internally by broker storage.
- private volatile TypedProperties extraProperties;
+ protected volatile TypedProperties extraProperties;
/**
* Creates a new {@link AMQPMessage} instance from binary encoded message data.
*
* @param messageFormat
* The Message format tag given the in Transfer that carried this message
- * @param data
- * The encoded AMQP message
* @param extraProperties
* Broker specific extra properties that should be carried with this message
*/
- public AMQPMessage(long messageFormat, byte[] data, TypedProperties extraProperties) {
- this(messageFormat, data, extraProperties, null);
- }
-
- /**
- * Creates a new {@link AMQPMessage} instance from binary encoded message data.
- *
- * @param messageFormat
- * The Message format tag given the in Transfer that carried this message
- * @param data
- * The encoded AMQP message
- * @param extraProperties
- * Broker specific extra properties that should be carried with this message
- * @param coreMessageObjectPools
- * Object pool used to accelerate some String operations.
- */
- public AMQPMessage(long messageFormat, byte[] data, TypedProperties extraProperties, CoreMessageObjectPools coreMessageObjectPools) {
- this(messageFormat, ReadableBuffer.ByteBufferReader.wrap(data), extraProperties, coreMessageObjectPools);
- }
-
- /**
- * Creates a new {@link AMQPMessage} instance from binary encoded message data.
- *
- * @param messageFormat
- * The Message format tag given the in Transfer that carried this message
- * @param data
- * The encoded AMQP message in an {@link ReadableBuffer} wrapper.
- * @param extraProperties
- * Broker specific extra properties that should be carried with this message
- * @param coreMessageObjectPools
- * Object pool used to accelerate some String operations.
- */
- public AMQPMessage(long messageFormat, ReadableBuffer data, TypedProperties extraProperties, CoreMessageObjectPools coreMessageObjectPools) {
- this.data = data;
+ public AMQPMessage(long messageFormat, TypedProperties extraProperties, CoreMessageObjectPools coreMessageObjectPools) {
this.messageFormat = messageFormat;
this.coreMessageObjectPools = coreMessageObjectPools;
this.extraProperties = extraProperties == null ? null : new TypedProperties(extraProperties);
- ensureMessageDataScanned();
}
- /**
- * Internal constructor used for persistence reload of the message.
- *
- * The message will not be usable until the persistence mechanism populates the message
- * data and triggers a parse of the message contents to fill in the message state.
- *
- * @param messageFormat
- * The Message format tag given the in Transfer that carried this message
- */
- AMQPMessage(long messageFormat) {
+ protected AMQPMessage(AMQPMessage copy) {
+ this(copy.messageFormat, copy.extraProperties, copy.coreMessageObjectPools);
+ }
+
+ protected AMQPMessage(long messageFormat) {
this.messageFormat = messageFormat;
- this.modified = true; // No buffer yet so this indicates invalid state.
this.coreMessageObjectPools = null;
}
@@ -245,6 +198,8 @@ public class AMQPMessage extends RefCountMessage {
return applicationProperties;
}
+ protected abstract ReadableBuffer getData();
+
// Access to the AMQP message data using safe copies freshly decoded from the current
// AMQP message data stored in this message wrapper. Changes to these values cannot
// be used to influence the underlying AMQP message data, the standard AMQPMessage API
@@ -256,17 +211,18 @@ public class AMQPMessage extends RefCountMessage {
*
* @return a MessageImpl that wraps the AMQP message data in this {@link AMQPMessage}
*/
- public MessageImpl getProtonMessage() {
- if (data == null) {
+ public final MessageImpl getProtonMessage() {
+
+ if (getData() == null) {
throw new NullPointerException("Data is not initialized");
}
ensureScanning();
MessageImpl protonMessage = null;
- if (data != null) {
+ if (getData() != null) {
protonMessage = (MessageImpl) Message.Factory.create();
- data.rewind();
- protonMessage.decode(data.duplicate());
+ getData().rewind();
+ protonMessage.decode(getData().duplicate());
}
return protonMessage;
@@ -278,12 +234,12 @@ public class AMQPMessage extends RefCountMessage {
*
* @return a copy of the Message Header if one exists or null if none present.
*/
- public Header getHeader() {
+ public final Header getHeader() {
ensureScanning();
return scanForMessageSection(headerPosition, Header.class);
}
- private void ensureScanning() {
+ protected void ensureScanning() {
ensureDataIsValid();
ensureMessageDataScanned();
}
@@ -294,7 +250,7 @@ public class AMQPMessage extends RefCountMessage {
*
* @return a copy of the {@link DeliveryAnnotations} present in the message or null if non present.
*/
- public DeliveryAnnotations getDeliveryAnnotations() {
+ public final DeliveryAnnotations getDeliveryAnnotations() {
ensureScanning();
return scanForMessageSection(deliveryAnnotationsPosition, DeliveryAnnotations.class);
}
@@ -310,7 +266,7 @@ public class AMQPMessage extends RefCountMessage {
*
* @param deliveryAnnotations delivery annotations used in the sendBuffer() method
*/
- public void setDeliveryAnnotationsForSendBuffer(DeliveryAnnotations deliveryAnnotations) {
+ public final void setDeliveryAnnotationsForSendBuffer(DeliveryAnnotations deliveryAnnotations) {
this.deliveryAnnotationsForSendBuffer = deliveryAnnotations;
}
@@ -320,7 +276,7 @@ public class AMQPMessage extends RefCountMessage {
*
* @return a copy of the {@link MessageAnnotations} present in the message or null if non present.
*/
- public MessageAnnotations getMessageAnnotations() {
+ public final MessageAnnotations getMessageAnnotations() {
ensureScanning();
return scanForMessageSection(messageAnnotationsPosition, MessageAnnotations.class);
}
@@ -331,7 +287,7 @@ public class AMQPMessage extends RefCountMessage {
*
* @return a copy of the Message Properties if one exists or null if none present.
*/
- public Properties getProperties() {
+ public final Properties getProperties() {
ensureScanning();
return scanForMessageSection(propertiesPosition, Properties.class);
}
@@ -342,15 +298,15 @@ public class AMQPMessage extends RefCountMessage {
*
* @return a copy of the {@link ApplicationProperties} present in the message or null if non present.
*/
- public ApplicationProperties getApplicationProperties() {
+ public final ApplicationProperties getApplicationProperties() {
ensureScanning();
return scanForMessageSection(applicationPropertiesPosition, ApplicationProperties.class);
}
/** This is different from toString, as this will print an expanded version of the buffer
* in Hex and programmers's readable format */
- public String toDebugString() {
- return ByteUtil.debugByteArray(data.array());
+ public final String toDebugString() {
+ return ByteUtil.debugByteArray(getData().array());
}
/**
@@ -360,7 +316,7 @@ public class AMQPMessage extends RefCountMessage {
*
* @return the Section that makes up the body of this message.
*/
- public Section getBody() {
+ public final Section getBody() {
ensureScanning();
// We only handle Sections of AmqpSequence, AmqpValue and Data types so we filter on those.
@@ -376,13 +332,13 @@ public class AMQPMessage extends RefCountMessage {
*
* @return the Footer that was encoded into this AMQP Message.
*/
- public Footer getFooter() {
+ public final Footer getFooter() {
ensureScanning();
return scanForMessageSection(Math.max(0, remainingBodyPosition), Footer.class);
}
@SuppressWarnings({ "unchecked", "rawtypes" })
- private T scanForMessageSection(int scanStartPosition, Class...targetTypes) {
+ protected T scanForMessageSection(int scanStartPosition, Class...targetTypes) {
ensureMessageDataScanned();
// In cases where we parsed out enough to know the value is not encoded in the message
@@ -391,7 +347,7 @@ public class AMQPMessage extends RefCountMessage {
return null;
}
- ReadableBuffer buffer = data.duplicate().position(0);
+ ReadableBuffer buffer = getData().duplicate().position(0);
final DecoderImpl decoder = TLSEncode.getDecoder();
buffer.position(scanStartPosition);
@@ -418,7 +374,7 @@ public class AMQPMessage extends RefCountMessage {
return section;
}
- private ApplicationProperties lazyDecodeApplicationProperties() {
+ protected ApplicationProperties lazyDecodeApplicationProperties() {
if (applicationProperties == null && applicationPropertiesPosition != VALUE_NOT_PRESENT) {
applicationProperties = scanForMessageSection(applicationPropertiesPosition, ApplicationProperties.class);
}
@@ -427,7 +383,7 @@ public class AMQPMessage extends RefCountMessage {
}
@SuppressWarnings("unchecked")
- private Map getApplicationPropertiesMap(boolean createIfAbsent) {
+ protected Map getApplicationPropertiesMap(boolean createIfAbsent) {
ApplicationProperties appMap = lazyDecodeApplicationProperties();
Map map = null;
@@ -448,7 +404,7 @@ public class AMQPMessage extends RefCountMessage {
}
@SuppressWarnings("unchecked")
- private Map getMessageAnnotationsMap(boolean createIfAbsent) {
+ protected Map getMessageAnnotationsMap(boolean createIfAbsent) {
Map map = null;
if (messageAnnotations != null) {
@@ -467,23 +423,23 @@ public class AMQPMessage extends RefCountMessage {
return map;
}
- private Object getMessageAnnotation(String annotation) {
+ protected Object getMessageAnnotation(String annotation) {
return getMessageAnnotation(Symbol.getSymbol(annotation));
}
- private Object getMessageAnnotation(Symbol annotation) {
+ protected Object getMessageAnnotation(Symbol annotation) {
return getMessageAnnotationsMap(false).get(annotation);
}
- private Object removeMessageAnnotation(Symbol annotation) {
+ protected Object removeMessageAnnotation(Symbol annotation) {
return getMessageAnnotationsMap(false).remove(annotation);
}
- private void setMessageAnnotation(String annotation, Object value) {
+ protected void setMessageAnnotation(String annotation, Object value) {
setMessageAnnotation(Symbol.getSymbol(annotation), value);
}
- private void setMessageAnnotation(Symbol annotation, Object value) {
+ protected void setMessageAnnotation(Symbol annotation, Object value) {
getMessageAnnotationsMap(true).put(annotation, value);
}
@@ -491,7 +447,7 @@ public class AMQPMessage extends RefCountMessage {
// state tracking information is kept up to data. When the message is manually changed a forced
// re-encode should be done to update the backing data with the in memory elements.
- private synchronized void ensureMessageDataScanned() {
+ protected synchronized void ensureMessageDataScanned() {
final byte state = messageDataScanned;
switch (state) {
case NOT_SCANNED:
@@ -510,7 +466,76 @@ public class AMQPMessage extends RefCountMessage {
}
}
- private synchronized void resetMessageData() {
+
+ protected int getEstimateSavedEncode() {
+ return remainingBodyPosition > 0 ? remainingBodyPosition : 1024;
+ }
+
+ protected void saveEncoding(ByteBuf buf) {
+
+ WritableBuffer oldBuffer = TLSEncode.getEncoder().getBuffer();
+
+ TLSEncode.getEncoder().setByteBuffer(new NettyWritable(buf));
+
+ try {
+ buf.writeInt(headerPosition);
+ buf.writeInt(encodedHeaderSize);
+ TLSEncode.getEncoder().writeObject(header);
+
+ buf.writeInt(deliveryAnnotationsPosition);
+ buf.writeInt(encodedDeliveryAnnotationsSize);
+
+ buf.writeInt(messageAnnotationsPosition);
+ TLSEncode.getEncoder().writeObject(messageAnnotations);
+
+
+ buf.writeInt(propertiesPosition);
+ TLSEncode.getEncoder().writeObject(properties);
+
+ buf.writeInt(applicationPropertiesPosition);
+ buf.writeInt(remainingBodyPosition);
+
+ TLSEncode.getEncoder().writeObject(applicationProperties);
+
+ } finally {
+ TLSEncode.getEncoder().setByteBuffer(oldBuffer);
+ }
+ }
+
+
+ protected void readSavedEncoding(ByteBuf buf) {
+ ReadableBuffer oldBuffer = TLSEncode.getDecoder().getBuffer();
+
+ TLSEncode.getDecoder().setBuffer(new NettyReadable(buf));
+
+ try {
+ messageDataScanned = SCANNED;
+
+ headerPosition = buf.readInt();
+ encodedHeaderSize = buf.readInt();
+ header = (Header)TLSEncode.getDecoder().readObject();
+
+ deliveryAnnotationsPosition = buf.readInt();
+ encodedDeliveryAnnotationsSize = buf.readInt();
+
+ messageAnnotationsPosition = buf.readInt();
+ messageAnnotations = (MessageAnnotations)TLSEncode.getDecoder().readObject();
+
+ propertiesPosition = buf.readInt();
+ properties = (Properties)TLSEncode.getDecoder().readObject();
+
+ applicationPropertiesPosition = buf.readInt();
+ remainingBodyPosition = buf.readInt();
+
+ applicationProperties = (ApplicationProperties)TLSEncode.getDecoder().readObject();
+ } finally {
+ TLSEncode.getDecoder().setBuffer(oldBuffer);
+ }
+ }
+
+
+
+ protected synchronized void resetMessageData() {
header = null;
messageAnnotations = null;
properties = null;
@@ -527,13 +552,15 @@ public class AMQPMessage extends RefCountMessage {
remainingBodyPosition = VALUE_NOT_PRESENT;
}
- private synchronized void scanMessageData() {
+ protected synchronized void scanMessageData() {
this.messageDataScanned = SCANNED;
DecoderImpl decoder = TLSEncode.getDecoder();
- decoder.setBuffer(data.rewind());
+ decoder.setBuffer(getData().rewind());
resetMessageData();
+ ReadableBuffer data = getData();
+
try {
while (data.hasRemaining()) {
int constructorPos = data.position();
@@ -582,25 +609,7 @@ public class AMQPMessage extends RefCountMessage {
}
@Override
- public org.apache.activemq.artemis.api.core.Message copy() {
- ensureDataIsValid();
-
- ReadableBuffer view = data.duplicate().rewind();
- byte[] newData = new byte[view.remaining()];
-
- // Copy the full message contents with delivery annotations as they will
- // be trimmed on send and may become useful on the broker at a later time.
- view.get(newData);
-
- AMQPMessage newEncode = new AMQPMessage(this.messageFormat, newData, extraProperties, coreMessageObjectPools);
- newEncode.setMessageID(this.getMessageID());
- return newEncode;
- }
-
- @Override
- public org.apache.activemq.artemis.api.core.Message copy(long newID) {
- return copy().setMessageID(newID);
- }
+ public abstract org.apache.activemq.artemis.api.core.Message copy();
// Core Message APIs for persisting and encoding of message data along with
// utilities for checking memory usage and encoded size characteristics.
@@ -614,7 +623,7 @@ public class AMQPMessage extends RefCountMessage {
* @see #getSendBuffer(int) for the actual method used for message sends.
*/
@Override
- public void sendBuffer(ByteBuf buffer, int deliveryCount) {
+ public final void sendBuffer(ByteBuf buffer, int deliveryCount) {
ensureDataIsValid();
NettyWritable writable = new NettyWritable(buffer);
writable.put(getSendBuffer(deliveryCount));
@@ -644,15 +653,15 @@ public class AMQPMessage extends RefCountMessage {
} else {
// Common case message has no delivery annotations, no delivery annotations for the send buffer were set
// and this is the first delivery so no re-encoding or section skipping needed.
- return data.duplicate();
+ return getData().duplicate();
}
}
- private ReadableBuffer createCopyWithSkippedOrExplicitlySetDeliveryAnnotations() {
+ protected ReadableBuffer createCopyWithSkippedOrExplicitlySetDeliveryAnnotations() {
// The original message had delivery annotations, or delivery annotations for the send buffer are set.
// That means we must copy into a new buffer skipping the original delivery annotations section
// (not meant to survive beyond this hop) and including the delivery annotations for the send buffer if set.
- ReadableBuffer duplicate = data.duplicate();
+ ReadableBuffer duplicate = getData().duplicate();
final ByteBuf result = PooledByteBufAllocator.DEFAULT.heapBuffer(getEncodeSize());
result.writeBytes(duplicate.limit(encodedHeaderSize).byteBuffer());
@@ -665,7 +674,7 @@ public class AMQPMessage extends RefCountMessage {
return new NettyReadable(result);
}
- private ReadableBuffer createCopyWithNewDeliveryCount(int deliveryCount) {
+ protected ReadableBuffer createCopyWithNewDeliveryCount(int deliveryCount) {
assert deliveryCount > 1;
final int amqpDeliveryCount = deliveryCount - 1;
@@ -690,14 +699,14 @@ public class AMQPMessage extends RefCountMessage {
writeDeliveryAnnotationsForSendBuffer(result);
// skip existing delivery annotations of the original message
- data.position(encodedHeaderSize + encodedDeliveryAnnotationsSize);
- result.writeBytes(data.byteBuffer());
- data.position(0);
+ getData().position(encodedHeaderSize + encodedDeliveryAnnotationsSize);
+ result.writeBytes(getData().byteBuffer());
+ getData().position(0);
return new NettyReadable(result);
}
- private void writeDeliveryAnnotationsForSendBuffer(ByteBuf result) {
+ protected void writeDeliveryAnnotationsForSendBuffer(ByteBuf result) {
if (deliveryAnnotationsForSendBuffer != null && !deliveryAnnotationsForSendBuffer.getValue().isEmpty()) {
TLSEncode.getEncoder().setByteBuffer(new NettyWritable(result));
TLSEncode.getEncoder().writeObject(deliveryAnnotationsForSendBuffer);
@@ -705,7 +714,7 @@ public class AMQPMessage extends RefCountMessage {
}
}
- private int getDeliveryAnnotationsForSendBufferSize() {
+ protected int getDeliveryAnnotationsForSendBufferSize() {
if (deliveryAnnotationsForSendBuffer == null || deliveryAnnotationsForSendBuffer.getValue().isEmpty()) {
return 0;
}
@@ -722,45 +731,35 @@ public class AMQPMessage extends RefCountMessage {
}
@Override
- public ByteBuf getBuffer() {
- if (data == null) {
+ public final ByteBuf getBuffer() {
+ if (getData() == null) {
return null;
} else {
- if (data instanceof NettyReadable) {
- return ((NettyReadable) data).getByteBuf();
+ if (getData() instanceof NettyReadable) {
+ return ((NettyReadable) getData()).getByteBuf();
} else {
- return Unpooled.wrappedBuffer(data.byteBuffer());
+ return Unpooled.wrappedBuffer(getData().byteBuffer());
}
}
}
@Override
- public AMQPMessage setBuffer(ByteBuf buffer) {
+ public final AMQPMessage setBuffer(ByteBuf buffer) {
// If this is ever called we would be in a highly unfortunate state
- this.data = null;
+ //this.data = null;
return this;
}
@Override
- public int getEncodeSize() {
- ensureDataIsValid();
- // The encoded size will exclude any delivery annotations that are present as we will clip them.
- return data.remaining() - encodedDeliveryAnnotationsSize + getDeliveryAnnotationsForSendBufferSize();
- }
+ public abstract int getEncodeSize();
@Override
- public void receiveBuffer(ByteBuf buffer) {
+ public final void receiveBuffer(ByteBuf buffer) {
// Not used for AMQP messages.
}
@Override
- public int getMemoryEstimate() {
- if (memoryEstimate == -1) {
- memoryEstimate = memoryOffset + (data != null ? data.capacity() : 0);
- }
-
- return memoryEstimate;
- }
+ public abstract int getMemoryEstimate();
@Override
public ICoreMessage toCore(CoreMessageObjectPools coreMessageObjectPools) {
@@ -779,40 +778,19 @@ public class AMQPMessage extends RefCountMessage {
}
@Override
- public void persist(ActiveMQBuffer targetRecord) {
- ensureDataIsValid();
- targetRecord.writeInt(internalPersistSize());
- if (data.hasArray()) {
- targetRecord.writeBytes(data.array(), data.arrayOffset(), data.remaining());
- } else {
- targetRecord.writeBytes(data.byteBuffer());
- }
+ public abstract void persist(ActiveMQBuffer targetRecord);
+
+ @Override
+ public abstract int getPersistSize();
+
+ protected int internalPersistSize() {
+ return getData().remaining();
}
@Override
- public int getPersistSize() {
- ensureDataIsValid();
- return DataConstants.SIZE_INT + internalPersistSize();
- }
+ public abstract void reloadPersistence(ActiveMQBuffer record, CoreMessageObjectPools pools);
- private int internalPersistSize() {
- return data.remaining();
- }
-
- @Override
- public void reloadPersistence(ActiveMQBuffer record, CoreMessageObjectPools pools) {
- int size = record.readInt();
- byte[] recordArray = new byte[size];
- record.readBytes(recordArray);
- data = ReadableBuffer.ByteBufferReader.wrap(ByteBuffer.wrap(recordArray));
-
- // Message state is now that the underlying buffer is loaded, but the contents not yet scanned
- resetMessageData();
- modified = false;
- messageDataScanned = RELOAD_PERSISTENCE;
- }
-
- private synchronized void lazyScanAfterReloadPersistence() {
+ protected synchronized void lazyScanAfterReloadPersistence() {
assert messageDataScanned == RELOAD_PERSISTENCE;
scanMessageData();
messageDataScanned = SCANNED;
@@ -829,118 +807,46 @@ public class AMQPMessage extends RefCountMessage {
}
@Override
- public long getPersistentSize() throws ActiveMQException {
- return getEncodeSize();
- }
+ public abstract long getPersistentSize() throws ActiveMQException;
@Override
- public Persister getPersister() {
- return AMQPMessagePersisterV2.getInstance();
- }
+ public abstract Persister getPersister();
@Override
- public void reencode() {
- ensureMessageDataScanned();
+ public abstract void reencode();
- // The address was updated on a message with Properties so we update them
- // for cases where there are no properties we aren't adding a properties
- // section which seems wrong but this preserves previous behavior.
- if (properties != null && address != null) {
- properties.setTo(address.toString());
- }
+ protected abstract void ensureDataIsValid();
- encodeMessage();
- scanMessageData();
- }
-
- private synchronized void ensureDataIsValid() {
- if (modified) {
- encodeMessage();
- }
- }
-
- private synchronized void encodeMessage() {
- this.modified = false;
- this.messageDataScanned = NOT_SCANNED;
- int estimated = Math.max(1500, data != null ? data.capacity() + 1000 : 0);
- ByteBuf buffer = PooledByteBufAllocator.DEFAULT.heapBuffer(estimated);
- EncoderImpl encoder = TLSEncode.getEncoder();
-
- try {
- NettyWritable writable = new NettyWritable(buffer);
-
- encoder.setByteBuffer(writable);
- if (header != null) {
- encoder.writeObject(header);
- }
-
- // We currently do not encode any delivery annotations but it is conceivable
- // that at some point they may need to be preserved, this is where that needs
- // to happen.
-
- if (messageAnnotations != null) {
- encoder.writeObject(messageAnnotations);
- }
- if (properties != null) {
- encoder.writeObject(properties);
- }
-
- // Whenever possible avoid encoding sections we don't need to by
- // checking if application properties where loaded or added and
- // encoding only in that case.
- if (applicationProperties != null) {
- encoder.writeObject(applicationProperties);
-
- // Now raw write the remainder body and footer if present.
- if (data != null && remainingBodyPosition != VALUE_NOT_PRESENT) {
- writable.put(data.position(remainingBodyPosition));
- }
- } else if (data != null && applicationPropertiesPosition != VALUE_NOT_PRESENT) {
- // Writes out ApplicationProperties, Body and Footer in one go if present.
- writable.put(data.position(applicationPropertiesPosition));
- } else if (data != null && remainingBodyPosition != VALUE_NOT_PRESENT) {
- // No Application properties at all so raw write Body and Footer sections
- writable.put(data.position(remainingBodyPosition));
- }
-
- byte[] bytes = new byte[buffer.writerIndex()];
-
- buffer.readBytes(bytes);
- data = ReadableBuffer.ByteBufferReader.wrap(ByteBuffer.wrap(bytes));
- } finally {
- encoder.setByteBuffer((WritableBuffer) null);
- buffer.release();
- }
- }
+ protected abstract void encodeMessage();
// These methods interact with the Extra Properties that can accompany the message but
// because these are not sent on the wire, update to these does not force a re-encode on
// send of the message.
- public TypedProperties createExtraProperties() {
+ public final TypedProperties createExtraProperties() {
if (extraProperties == null) {
extraProperties = new TypedProperties(INTERNAL_PROPERTY_NAMES_PREDICATE);
}
return extraProperties;
}
- public TypedProperties getExtraProperties() {
+ public final TypedProperties getExtraProperties() {
return extraProperties;
}
- public AMQPMessage setExtraProperties(TypedProperties extraProperties) {
+ public final AMQPMessage setExtraProperties(TypedProperties extraProperties) {
this.extraProperties = extraProperties;
return this;
}
@Override
- public org.apache.activemq.artemis.api.core.Message putExtraBytesProperty(SimpleString key, byte[] value) {
+ public final org.apache.activemq.artemis.api.core.Message putExtraBytesProperty(SimpleString key, byte[] value) {
createExtraProperties().putBytesProperty(key, value);
return this;
}
@Override
- public byte[] getExtraBytesProperty(SimpleString key) throws ActiveMQPropertyConversionException {
+ public final byte[] getExtraBytesProperty(SimpleString key) throws ActiveMQPropertyConversionException {
if (extraProperties == null) {
return null;
} else {
@@ -956,7 +862,7 @@ public class AMQPMessage extends RefCountMessage {
}
@Override
- public byte[] removeExtraBytesProperty(SimpleString key) throws ActiveMQPropertyConversionException {
+ public final byte[] removeExtraBytesProperty(SimpleString key) throws ActiveMQPropertyConversionException {
if (extraProperties == null) {
return null;
} else {
@@ -967,38 +873,38 @@ public class AMQPMessage extends RefCountMessage {
// Message meta data access for Core and AMQP usage.
@Override
- public org.apache.activemq.artemis.api.core.Message setConnectionID(String connectionID) {
+ public final org.apache.activemq.artemis.api.core.Message setConnectionID(String connectionID) {
this.connectionID = connectionID;
return this;
}
@Override
- public String getConnectionID() {
+ public final String getConnectionID() {
return connectionID;
}
- public long getMessageFormat() {
+ public final long getMessageFormat() {
return messageFormat;
}
@Override
- public long getMessageID() {
+ public final long getMessageID() {
return messageID;
}
@Override
- public org.apache.activemq.artemis.api.core.Message setMessageID(long id) {
+ public final org.apache.activemq.artemis.api.core.Message setMessageID(long id) {
this.messageID = id;
return this;
}
@Override
- public long getExpiration() {
+ public final long getExpiration() {
return expiration;
}
@Override
- public AMQPMessage setExpiration(long expiration) {
+ public final AMQPMessage setExpiration(long expiration) {
if (properties != null) {
if (expiration <= 0) {
properties.setAbsoluteExpiryTime(null);
@@ -1022,7 +928,7 @@ public class AMQPMessage extends RefCountMessage {
}
@Override
- public Object getUserID() {
+ public final Object getUserID() {
// User ID in Artemis API means Message ID
if (properties != null && properties.getMessageId() != null) {
return properties.getMessageId();
@@ -1039,7 +945,7 @@ public class AMQPMessage extends RefCountMessage {
*
* @return the UserID value in the AMQP Properties if one is present.
*/
- public Object getAMQPUserID() {
+ public final Object getAMQPUserID() {
if (properties != null && properties.getUserId() != null) {
Binary binary = properties.getUserId();
return new String(binary.getArray(), binary.getArrayOffset(), binary.getLength(), StandardCharsets.UTF_8);
@@ -1049,18 +955,18 @@ public class AMQPMessage extends RefCountMessage {
}
@Override
- public org.apache.activemq.artemis.api.core.Message setUserID(Object userID) {
+ public final org.apache.activemq.artemis.api.core.Message setUserID(Object userID) {
return this;
}
@Override
- public Object getDuplicateProperty() {
+ public final Object getDuplicateProperty() {
return getObjectProperty(org.apache.activemq.artemis.api.core.Message.HDR_DUPLICATE_DETECTION_ID);
}
@Override
public boolean isDurable() {
- if (header != null && header.getDurable() != null) {
+ if (header != null && header .getDurable() != null) {
return header.getDurable();
} else {
return false;
@@ -1068,7 +974,7 @@ public class AMQPMessage extends RefCountMessage {
}
@Override
- public org.apache.activemq.artemis.api.core.Message setDurable(boolean durable) {
+ public final org.apache.activemq.artemis.api.core.Message setDurable(boolean durable) {
if (header == null) {
header = new Header();
}
@@ -1079,26 +985,26 @@ public class AMQPMessage extends RefCountMessage {
}
@Override
- public String getAddress() {
+ public final String getAddress() {
SimpleString addressSimpleString = getAddressSimpleString();
return addressSimpleString == null ? null : addressSimpleString.toString();
}
@Override
- public AMQPMessage setAddress(String address) {
+ public final AMQPMessage setAddress(String address) {
setAddress(cachedAddressSimpleString(address));
return this;
}
@Override
- public AMQPMessage setAddress(SimpleString address) {
+ public final AMQPMessage setAddress(SimpleString address) {
this.address = address;
createExtraProperties().putSimpleStringProperty(ADDRESS_PROPERTY, address);
return this;
}
@Override
- public SimpleString getAddressSimpleString() {
+ public final SimpleString getAddressSimpleString() {
if (address == null) {
TypedProperties extraProperties = getExtraProperties();
@@ -1117,12 +1023,12 @@ public class AMQPMessage extends RefCountMessage {
return address;
}
- private SimpleString cachedAddressSimpleString(String address) {
+ protected SimpleString cachedAddressSimpleString(String address) {
return CoreMessageObjectPools.cachedAddressSimpleString(address, coreMessageObjectPools);
}
@Override
- public long getTimestamp() {
+ public final long getTimestamp() {
if (properties != null && properties.getCreationTime() != null) {
return properties.getCreationTime().getTime();
} else {
@@ -1131,7 +1037,7 @@ public class AMQPMessage extends RefCountMessage {
}
@Override
- public org.apache.activemq.artemis.api.core.Message setTimestamp(long timestamp) {
+ public final org.apache.activemq.artemis.api.core.Message setTimestamp(long timestamp) {
if (properties == null) {
properties = new Properties();
}
@@ -1140,7 +1046,7 @@ public class AMQPMessage extends RefCountMessage {
}
@Override
- public byte getPriority() {
+ public final byte getPriority() {
if (header != null && header.getPriority() != null) {
return (byte) Math.min(header.getPriority().intValue(), MAX_MESSAGE_PRIORITY);
} else {
@@ -1149,7 +1055,7 @@ public class AMQPMessage extends RefCountMessage {
}
@Override
- public org.apache.activemq.artemis.api.core.Message setPriority(byte priority) {
+ public final org.apache.activemq.artemis.api.core.Message setPriority(byte priority) {
if (header == null) {
header = new Header();
}
@@ -1158,7 +1064,7 @@ public class AMQPMessage extends RefCountMessage {
}
@Override
- public SimpleString getReplyTo() {
+ public final SimpleString getReplyTo() {
if (properties != null) {
return SimpleString.toSimpleString(properties.getReplyTo());
} else {
@@ -1167,7 +1073,7 @@ public class AMQPMessage extends RefCountMessage {
}
@Override
- public AMQPMessage setReplyTo(SimpleString address) {
+ public final AMQPMessage setReplyTo(SimpleString address) {
if (properties == null) {
properties = new Properties();
}
@@ -1177,7 +1083,7 @@ public class AMQPMessage extends RefCountMessage {
}
@Override
- public RoutingType getRoutingType() {
+ public final RoutingType getRoutingType() {
ensureMessageDataScanned();
Object routingType = getMessageAnnotation(AMQPMessageSupport.ROUTING_TYPE);
@@ -1200,7 +1106,7 @@ public class AMQPMessage extends RefCountMessage {
}
@Override
- public org.apache.activemq.artemis.api.core.Message setRoutingType(RoutingType routingType) {
+ public final org.apache.activemq.artemis.api.core.Message setRoutingType(RoutingType routingType) {
if (routingType == null) {
removeMessageAnnotation(AMQPMessageSupport.ROUTING_TYPE);
} else {
@@ -1210,7 +1116,7 @@ public class AMQPMessage extends RefCountMessage {
}
@Override
- public SimpleString getGroupID() {
+ public final SimpleString getGroupID() {
ensureMessageDataScanned();
if (properties != null && properties.getGroupId() != null) {
@@ -1222,7 +1128,7 @@ public class AMQPMessage extends RefCountMessage {
}
@Override
- public int getGroupSequence() {
+ public final int getGroupSequence() {
ensureMessageDataScanned();
if (properties != null && properties.getGroupSequence() != null) {
@@ -1233,12 +1139,12 @@ public class AMQPMessage extends RefCountMessage {
}
@Override
- public Object getCorrelationID() {
+ public final Object getCorrelationID() {
return properties != null ? properties.getCorrelationId() : null;
}
@Override
- public org.apache.activemq.artemis.api.core.Message setCorrelationID(final Object correlationID) {
+ public final org.apache.activemq.artemis.api.core.Message setCorrelationID(final Object correlationID) {
if (properties == null) {
properties = new Properties();
}
@@ -1274,11 +1180,11 @@ public class AMQPMessage extends RefCountMessage {
}
return false;
}
- return AMQPMessageSymbolSearch.anyMessageAnnotations(data, symbolNeedles);
+ return AMQPMessageSymbolSearch.anyMessageAnnotations(getData(), symbolNeedles);
}
@Override
- public Long getScheduledDeliveryTime() {
+ public final Long getScheduledDeliveryTime() {
ensureMessageDataScanned();
if (scheduledTime < 0) {
Object objscheduledTime = getMessageAnnotation(AMQPMessageSupport.SCHEDULED_DELIVERY_TIME);
@@ -1297,7 +1203,7 @@ public class AMQPMessage extends RefCountMessage {
}
@Override
- public AMQPMessage setScheduledDeliveryTime(Long time) {
+ public final AMQPMessage setScheduledDeliveryTime(Long time) {
if (time != null && time.longValue() > 0) {
setMessageAnnotation(AMQPMessageSupport.SCHEDULED_DELIVERY_TIME, time);
removeMessageAnnotation(AMQPMessageSupport.SCHEDULED_DELIVERY_DELAY);
@@ -1312,17 +1218,17 @@ public class AMQPMessage extends RefCountMessage {
}
@Override
- public Object removeAnnotation(SimpleString key) {
+ public final Object removeAnnotation(SimpleString key) {
return removeMessageAnnotation(Symbol.getSymbol(key.toString()));
}
@Override
- public Object getAnnotation(SimpleString key) {
+ public final Object getAnnotation(SimpleString key) {
return getMessageAnnotation(key.toString());
}
@Override
- public AMQPMessage setAnnotation(SimpleString key, Object value) {
+ public final AMQPMessage setAnnotation(SimpleString key, Object value) {
setMessageAnnotation(key.toString(), value);
return this;
}
@@ -1333,52 +1239,52 @@ public class AMQPMessage extends RefCountMessage {
// the next send of the Message will not include changes made here.
@Override
- public Object removeProperty(SimpleString key) {
+ public final Object removeProperty(SimpleString key) {
return removeProperty(key.toString());
}
@Override
- public Object removeProperty(String key) {
+ public final Object removeProperty(String key) {
return getApplicationPropertiesMap(false).remove(key);
}
@Override
- public boolean containsProperty(SimpleString key) {
+ public final boolean containsProperty(SimpleString key) {
return containsProperty(key.toString());
}
@Override
- public boolean containsProperty(String key) {
+ public final boolean containsProperty(String key) {
return getApplicationPropertiesMap(false).containsKey(key);
}
@Override
- public Boolean getBooleanProperty(String key) throws ActiveMQPropertyConversionException {
+ public final Boolean getBooleanProperty(String key) throws ActiveMQPropertyConversionException {
return (Boolean) getApplicationPropertiesMap(false).get(key);
}
@Override
- public Byte getByteProperty(String key) throws ActiveMQPropertyConversionException {
+ public final Byte getByteProperty(String key) throws ActiveMQPropertyConversionException {
return (Byte) getApplicationPropertiesMap(false).get(key);
}
@Override
- public Double getDoubleProperty(String key) throws ActiveMQPropertyConversionException {
+ public final Double getDoubleProperty(String key) throws ActiveMQPropertyConversionException {
return (Double) getApplicationPropertiesMap(false).get(key);
}
@Override
- public Integer getIntProperty(String key) throws ActiveMQPropertyConversionException {
+ public final Integer getIntProperty(String key) throws ActiveMQPropertyConversionException {
return (Integer) getApplicationPropertiesMap(false).get(key);
}
@Override
- public Long getLongProperty(String key) throws ActiveMQPropertyConversionException {
+ public final Long getLongProperty(String key) throws ActiveMQPropertyConversionException {
return (Long) getApplicationPropertiesMap(false).get(key);
}
@Override
- public Object getObjectProperty(String key) {
+ public final Object getObjectProperty(String key) {
if (key.equals(MessageUtil.TYPE_HEADER_NAME.toString())) {
if (properties != null) {
return properties.getSubject();
@@ -1411,17 +1317,17 @@ public class AMQPMessage extends RefCountMessage {
}
@Override
- public Short getShortProperty(String key) throws ActiveMQPropertyConversionException {
+ public final Short getShortProperty(String key) throws ActiveMQPropertyConversionException {
return (Short) getApplicationPropertiesMap(false).get(key);
}
@Override
- public Float getFloatProperty(String key) throws ActiveMQPropertyConversionException {
+ public final Float getFloatProperty(String key) throws ActiveMQPropertyConversionException {
return (Float) getApplicationPropertiesMap(false).get(key);
}
@Override
- public String getStringProperty(String key) throws ActiveMQPropertyConversionException {
+ public final String getStringProperty(String key) throws ActiveMQPropertyConversionException {
if (key.equals(MessageUtil.TYPE_HEADER_NAME.toString())) {
return properties.getSubject();
} else if (key.equals(MessageUtil.CONNECTION_ID_PROPERTY_NAME.toString())) {
@@ -1432,7 +1338,7 @@ public class AMQPMessage extends RefCountMessage {
}
@Override
- public Set getPropertyNames() {
+ public final Set getPropertyNames() {
HashSet values = new HashSet<>();
for (Object k : getApplicationPropertiesMap(false).keySet()) {
values.add(SimpleString.toSimpleString(k.toString(), getPropertyKeysPool()));
@@ -1441,66 +1347,66 @@ public class AMQPMessage extends RefCountMessage {
}
@Override
- public Boolean getBooleanProperty(SimpleString key) throws ActiveMQPropertyConversionException {
+ public final Boolean getBooleanProperty(SimpleString key) throws ActiveMQPropertyConversionException {
return getBooleanProperty(key.toString());
}
@Override
- public Byte getByteProperty(SimpleString key) throws ActiveMQPropertyConversionException {
+ public final Byte getByteProperty(SimpleString key) throws ActiveMQPropertyConversionException {
return getByteProperty(key.toString());
}
@Override
- public byte[] getBytesProperty(String key) throws ActiveMQPropertyConversionException {
+ public final byte[] getBytesProperty(String key) throws ActiveMQPropertyConversionException {
return (byte[]) getApplicationPropertiesMap(false).get(key);
}
@Override
- public Double getDoubleProperty(SimpleString key) throws ActiveMQPropertyConversionException {
+ public final Double getDoubleProperty(SimpleString key) throws ActiveMQPropertyConversionException {
return getDoubleProperty(key.toString());
}
@Override
- public Integer getIntProperty(SimpleString key) throws ActiveMQPropertyConversionException {
+ public final Integer getIntProperty(SimpleString key) throws ActiveMQPropertyConversionException {
return getIntProperty(key.toString());
}
@Override
- public Long getLongProperty(SimpleString key) throws ActiveMQPropertyConversionException {
+ public final Long getLongProperty(SimpleString key) throws ActiveMQPropertyConversionException {
return getLongProperty(key.toString());
}
@Override
- public Object getObjectProperty(SimpleString key) {
+ public final Object getObjectProperty(SimpleString key) {
return getObjectProperty(key.toString());
}
@Override
- public Short getShortProperty(SimpleString key) throws ActiveMQPropertyConversionException {
+ public final Short getShortProperty(SimpleString key) throws ActiveMQPropertyConversionException {
return getShortProperty(key.toString());
}
@Override
- public Float getFloatProperty(SimpleString key) throws ActiveMQPropertyConversionException {
+ public final Float getFloatProperty(SimpleString key) throws ActiveMQPropertyConversionException {
return getFloatProperty(key.toString());
}
@Override
- public String getStringProperty(SimpleString key) throws ActiveMQPropertyConversionException {
+ public final String getStringProperty(SimpleString key) throws ActiveMQPropertyConversionException {
return getStringProperty(key.toString());
}
@Override
- public SimpleString getSimpleStringProperty(SimpleString key) throws ActiveMQPropertyConversionException {
+ public final SimpleString getSimpleStringProperty(SimpleString key) throws ActiveMQPropertyConversionException {
return getSimpleStringProperty(key.toString());
}
@Override
- public byte[] getBytesProperty(SimpleString key) throws ActiveMQPropertyConversionException {
+ public final byte[] getBytesProperty(SimpleString key) throws ActiveMQPropertyConversionException {
return getBytesProperty(key.toString());
}
@Override
- public SimpleString getSimpleStringProperty(String key) throws ActiveMQPropertyConversionException {
+ public final SimpleString getSimpleStringProperty(String key) throws ActiveMQPropertyConversionException {
return SimpleString.toSimpleString((String) getApplicationPropertiesMap(false).get(key), getPropertyValuesPool());
}
@@ -1509,139 +1415,139 @@ public class AMQPMessage extends RefCountMessage {
// is done prior to the next dispatch the old view of the message will be sent.
@Override
- public org.apache.activemq.artemis.api.core.Message putBooleanProperty(String key, boolean value) {
+ public final org.apache.activemq.artemis.api.core.Message putBooleanProperty(String key, boolean value) {
getApplicationPropertiesMap(true).put(key, Boolean.valueOf(value));
return this;
}
@Override
- public org.apache.activemq.artemis.api.core.Message putByteProperty(String key, byte value) {
+ public final org.apache.activemq.artemis.api.core.Message putByteProperty(String key, byte value) {
getApplicationPropertiesMap(true).put(key, Byte.valueOf(value));
return this;
}
@Override
- public org.apache.activemq.artemis.api.core.Message putBytesProperty(String key, byte[] value) {
+ public final org.apache.activemq.artemis.api.core.Message putBytesProperty(String key, byte[] value) {
getApplicationPropertiesMap(true).put(key, value);
return this;
}
@Override
- public org.apache.activemq.artemis.api.core.Message putShortProperty(String key, short value) {
+ public final org.apache.activemq.artemis.api.core.Message putShortProperty(String key, short value) {
getApplicationPropertiesMap(true).put(key, Short.valueOf(value));
return this;
}
@Override
- public org.apache.activemq.artemis.api.core.Message putCharProperty(String key, char value) {
+ public final org.apache.activemq.artemis.api.core.Message putCharProperty(String key, char value) {
getApplicationPropertiesMap(true).put(key, Character.valueOf(value));
return this;
}
@Override
- public org.apache.activemq.artemis.api.core.Message putIntProperty(String key, int value) {
+ public final org.apache.activemq.artemis.api.core.Message putIntProperty(String key, int value) {
getApplicationPropertiesMap(true).put(key, Integer.valueOf(value));
return this;
}
@Override
- public org.apache.activemq.artemis.api.core.Message putLongProperty(String key, long value) {
+ public final org.apache.activemq.artemis.api.core.Message putLongProperty(String key, long value) {
getApplicationPropertiesMap(true).put(key, Long.valueOf(value));
return this;
}
@Override
- public org.apache.activemq.artemis.api.core.Message putFloatProperty(String key, float value) {
+ public final org.apache.activemq.artemis.api.core.Message putFloatProperty(String key, float value) {
getApplicationPropertiesMap(true).put(key, Float.valueOf(value));
return this;
}
@Override
- public org.apache.activemq.artemis.api.core.Message putDoubleProperty(String key, double value) {
+ public final org.apache.activemq.artemis.api.core.Message putDoubleProperty(String key, double value) {
getApplicationPropertiesMap(true).put(key, Double.valueOf(value));
return this;
}
@Override
- public org.apache.activemq.artemis.api.core.Message putBooleanProperty(SimpleString key, boolean value) {
+ public final org.apache.activemq.artemis.api.core.Message putBooleanProperty(SimpleString key, boolean value) {
getApplicationPropertiesMap(true).put(key.toString(), Boolean.valueOf(value));
return this;
}
@Override
- public org.apache.activemq.artemis.api.core.Message putByteProperty(SimpleString key, byte value) {
+ public final org.apache.activemq.artemis.api.core.Message putByteProperty(SimpleString key, byte value) {
return putByteProperty(key.toString(), value);
}
@Override
- public org.apache.activemq.artemis.api.core.Message putBytesProperty(SimpleString key, byte[] value) {
+ public final org.apache.activemq.artemis.api.core.Message putBytesProperty(SimpleString key, byte[] value) {
return putBytesProperty(key.toString(), value);
}
@Override
- public org.apache.activemq.artemis.api.core.Message putShortProperty(SimpleString key, short value) {
+ public final org.apache.activemq.artemis.api.core.Message putShortProperty(SimpleString key, short value) {
return putShortProperty(key.toString(), value);
}
@Override
- public org.apache.activemq.artemis.api.core.Message putCharProperty(SimpleString key, char value) {
+ public final org.apache.activemq.artemis.api.core.Message putCharProperty(SimpleString key, char value) {
return putCharProperty(key.toString(), value);
}
@Override
- public org.apache.activemq.artemis.api.core.Message putIntProperty(SimpleString key, int value) {
+ public final org.apache.activemq.artemis.api.core.Message putIntProperty(SimpleString key, int value) {
return putIntProperty(key.toString(), value);
}
@Override
- public org.apache.activemq.artemis.api.core.Message putLongProperty(SimpleString key, long value) {
+ public final org.apache.activemq.artemis.api.core.Message putLongProperty(SimpleString key, long value) {
return putLongProperty(key.toString(), value);
}
@Override
- public org.apache.activemq.artemis.api.core.Message putFloatProperty(SimpleString key, float value) {
+ public final org.apache.activemq.artemis.api.core.Message putFloatProperty(SimpleString key, float value) {
return putFloatProperty(key.toString(), value);
}
@Override
- public org.apache.activemq.artemis.api.core.Message putDoubleProperty(SimpleString key, double value) {
+ public final org.apache.activemq.artemis.api.core.Message putDoubleProperty(SimpleString key, double value) {
return putDoubleProperty(key.toString(), value);
}
@Override
- public org.apache.activemq.artemis.api.core.Message putStringProperty(String key, String value) {
+ public final org.apache.activemq.artemis.api.core.Message putStringProperty(String key, String value) {
getApplicationPropertiesMap(true).put(key, value);
return this;
}
@Override
- public org.apache.activemq.artemis.api.core.Message putObjectProperty(String key, Object value) throws ActiveMQPropertyConversionException {
+ public final org.apache.activemq.artemis.api.core.Message putObjectProperty(String key, Object value) throws ActiveMQPropertyConversionException {
getApplicationPropertiesMap(true).put(key, value);
return this;
}
@Override
- public org.apache.activemq.artemis.api.core.Message putObjectProperty(SimpleString key, Object value) throws ActiveMQPropertyConversionException {
+ public final org.apache.activemq.artemis.api.core.Message putObjectProperty(SimpleString key, Object value) throws ActiveMQPropertyConversionException {
return putObjectProperty(key.toString(), value);
}
@Override
- public org.apache.activemq.artemis.api.core.Message putStringProperty(SimpleString key, SimpleString value) {
+ public final org.apache.activemq.artemis.api.core.Message putStringProperty(SimpleString key, SimpleString value) {
return putStringProperty(key.toString(), value.toString());
}
@Override
- public org.apache.activemq.artemis.api.core.Message putStringProperty(SimpleString key, String value) {
+ public final org.apache.activemq.artemis.api.core.Message putStringProperty(SimpleString key, String value) {
return putStringProperty(key.toString(), value);
}
@Override
- public SimpleString getLastValueProperty() {
+ public final SimpleString getLastValueProperty() {
return getSimpleStringProperty(HDR_LAST_VALUE_NAME);
}
@Override
- public org.apache.activemq.artemis.api.core.Message setLastValueProperty(SimpleString lastValueName) {
+ public final org.apache.activemq.artemis.api.core.Message setLastValueProperty(SimpleString lastValueName) {
return putStringProperty(HDR_LAST_VALUE_NAME, lastValueName);
}
@@ -1659,7 +1565,7 @@ public class AMQPMessage extends RefCountMessage {
}
@Override
- public synchronized boolean acceptsConsumer(long consumer) {
+ public final synchronized boolean acceptsConsumer(long consumer) {
if (rejectedConsumers == null) {
return true;
} else {
@@ -1668,7 +1574,7 @@ public class AMQPMessage extends RefCountMessage {
}
@Override
- public synchronized void rejectConsumer(long consumer) {
+ public final synchronized void rejectConsumer(long consumer) {
if (rejectedConsumers == null) {
rejectedConsumers = new HashSet<>();
}
@@ -1676,11 +1582,11 @@ public class AMQPMessage extends RefCountMessage {
rejectedConsumers.add(consumer);
}
- private SimpleString.StringSimpleStringPool getPropertyKeysPool() {
+ protected SimpleString.StringSimpleStringPool getPropertyKeysPool() {
return coreMessageObjectPools == null ? null : coreMessageObjectPools.getPropertiesStringSimpleStringPools().getPropertyKeysPool();
}
- private SimpleString.StringSimpleStringPool getPropertyValuesPool() {
+ protected SimpleString.StringSimpleStringPool getPropertyValuesPool() {
return coreMessageObjectPools == null ? null : coreMessageObjectPools.getPropertiesStringSimpleStringPools().getPropertyValuesPool();
}
}
\ No newline at end of file
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPMessagePersister.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPMessagePersister.java
index 9ab084278b..e98abcb967 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPMessagePersister.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPMessagePersister.java
@@ -20,13 +20,14 @@ package org.apache.activemq.artemis.protocol.amqp.broker;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
-import org.apache.activemq.artemis.core.message.impl.CoreMessageObjectPools;
+import org.apache.activemq.artemis.core.persistence.CoreMessageObjectPools;
import org.apache.activemq.artemis.spi.core.protocol.MessagePersister;
import org.apache.activemq.artemis.utils.DataConstants;
+import static org.apache.activemq.artemis.core.persistence.PersisterIDs.AMQPMessagePersister_ID;
public class AMQPMessagePersister extends MessagePersister {
- public static final byte ID = 2;
+ public static final byte ID = AMQPMessagePersister_ID;
public static AMQPMessagePersister theInstance;
@@ -63,7 +64,7 @@ public class AMQPMessagePersister extends MessagePersister {
}
@Override
- public Message decode(ActiveMQBuffer buffer, CoreMessageObjectPools pool) {
+ public Message decode(ActiveMQBuffer buffer, Message record, CoreMessageObjectPools pool) {
long id = buffer.readLong();
long format = buffer.readLong();
final SimpleString address;
@@ -72,7 +73,7 @@ public class AMQPMessagePersister extends MessagePersister {
} else {
address = SimpleString.readNullableSimpleString(buffer.byteBuf(), pool.getAddressDecoderPool());
}
- AMQPMessage record = new AMQPMessage(format);
+ record = new AMQPStandardMessage(format);
record.reloadPersistence(buffer, pool);
record.setMessageID(id);
if (address != null) {
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPMessagePersisterV2.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPMessagePersisterV2.java
index d263fe9a4f..1438f76ca5 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPMessagePersisterV2.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPMessagePersisterV2.java
@@ -19,12 +19,14 @@ package org.apache.activemq.artemis.protocol.amqp.broker;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
import org.apache.activemq.artemis.api.core.Message;
-import org.apache.activemq.artemis.core.message.impl.CoreMessageObjectPools;
+import org.apache.activemq.artemis.core.persistence.CoreMessageObjectPools;
import org.apache.activemq.artemis.utils.DataConstants;
import org.apache.activemq.artemis.utils.collections.TypedProperties;
+import static org.apache.activemq.artemis.core.persistence.PersisterIDs.AMQPMessagePersisterV2_ID;
public class AMQPMessagePersisterV2 extends AMQPMessagePersister {
- public static final byte ID = 3;
+
+ public static final byte ID = AMQPMessagePersisterV2_ID;
public static AMQPMessagePersisterV2 theInstance;
@@ -70,8 +72,8 @@ public class AMQPMessagePersisterV2 extends AMQPMessagePersister {
}
@Override
- public Message decode(ActiveMQBuffer buffer, CoreMessageObjectPools pool) {
- AMQPMessage message = (AMQPMessage) super.decode(buffer, pool);
+ public Message decode(ActiveMQBuffer buffer, Message record, CoreMessageObjectPools pool) {
+ AMQPMessage message = (AMQPMessage) super.decode(buffer, record, pool);
int size = buffer.readInt();
if (size != 0) {
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPSessionCallback.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPSessionCallback.java
index dad5d54572..a5d793006e 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPSessionCallback.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPSessionCallback.java
@@ -29,7 +29,7 @@ import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.api.core.client.ActiveMQClient;
import org.apache.activemq.artemis.core.io.IOCallback;
-import org.apache.activemq.artemis.core.message.impl.CoreMessageObjectPools;
+import org.apache.activemq.artemis.core.persistence.CoreMessageObjectPools;
import org.apache.activemq.artemis.core.paging.PagingManager;
import org.apache.activemq.artemis.core.paging.PagingStore;
import org.apache.activemq.artemis.core.persistence.OperationContext;
@@ -106,8 +106,7 @@ public class AMQPSessionCallback implements SessionCallback {
private final boolean directDeliver;
-
- private CoreMessageObjectPools coreMessageObjectPools = new CoreMessageObjectPools();
+ private final CoreMessageObjectPools coreMessageObjectPools = new CoreMessageObjectPools();
private final AddressQueryCache addressQueryCache = new AddressQueryCache<>();
@@ -129,6 +128,14 @@ public class AMQPSessionCallback implements SessionCallback {
this.directDeliver = manager.isDirectDeliver();
}
+ public StorageManager getStorageManager() {
+ return storageManager;
+ }
+
+ public CoreMessageObjectPools getCoreMessageObjectPools() {
+ return coreMessageObjectPools;
+ }
+
@Override
public boolean isWritable(ReadyListener callback, Object protocolContext) {
ProtonServerSenderContext senderContext = (ProtonServerSenderContext) protocolContext;
@@ -425,6 +432,10 @@ public class AMQPSessionCallback implements SessionCallback {
((ServerConsumer) consumer).receiveCredits(-1);
}
+ public AMQPStandardMessage createStandardMessage(Delivery delivery, ReadableBuffer data) {
+ return new AMQPStandardMessage(delivery.getMessageFormat(), data, null, coreMessageObjectPools);
+ }
+
public void serverSend(final ProtonServerReceiverContext context,
final Transaction transaction,
final Receiver receiver,
@@ -433,7 +444,17 @@ public class AMQPSessionCallback implements SessionCallback {
int messageFormat,
ReadableBuffer data,
RoutingContext routingContext) throws Exception {
- AMQPMessage message = new AMQPMessage(messageFormat, data, null, coreMessageObjectPools);
+ AMQPStandardMessage message = new AMQPStandardMessage(messageFormat, data, null, coreMessageObjectPools);
+ serverSend(context, transaction, receiver, delivery, address, routingContext, message);
+ }
+
+ public void serverSend(ProtonServerReceiverContext context,
+ Transaction transaction,
+ Receiver receiver,
+ Delivery delivery,
+ SimpleString address,
+ RoutingContext routingContext,
+ AMQPMessage message) throws Exception {
if (address != null) {
message.setAddress(address);
} else {
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPStandardMessage.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPStandardMessage.java
new file mode 100644
index 0000000000..99d3be35c0
--- /dev/null
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPStandardMessage.java
@@ -0,0 +1,262 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.activemq.artemis.protocol.amqp.broker;
+
+import java.nio.ByteBuffer;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.PooledByteBufAllocator;
+import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
+import org.apache.activemq.artemis.api.core.ActiveMQException;
+import org.apache.activemq.artemis.core.persistence.CoreMessageObjectPools;
+import org.apache.activemq.artemis.core.persistence.Persister;
+import org.apache.activemq.artemis.protocol.amqp.util.NettyWritable;
+import org.apache.activemq.artemis.protocol.amqp.util.TLSEncode;
+import org.apache.activemq.artemis.utils.DataConstants;
+import org.apache.activemq.artemis.utils.collections.TypedProperties;
+import org.apache.qpid.proton.codec.EncoderImpl;
+import org.apache.qpid.proton.codec.ReadableBuffer;
+import org.apache.qpid.proton.codec.WritableBuffer;
+
+// see https://docs.oasis-open.org/amqp/core/v1.0/os/amqp-core-messaging-v1.0-os.html#section-message-format
+public class AMQPStandardMessage extends AMQPMessage {
+
+ // Buffer and state for the data backing this message.
+ protected ReadableBuffer data;
+
+ /**
+ * Creates a new {@link AMQPStandardMessage} instance from binary encoded message data.
+ *
+ * @param messageFormat The Message format tag given the in Transfer that carried this message
+ * @param data The encoded AMQP message
+ * @param extraProperties Broker specific extra properties that should be carried with this message
+ */
+ public AMQPStandardMessage(long messageFormat, byte[] data, TypedProperties extraProperties) {
+ this(messageFormat, data, extraProperties, null);
+ }
+
+ /**
+ * Creates a new {@link AMQPStandardMessage} instance from binary encoded message data.
+ *
+ * @param messageFormat The Message format tag given the in Transfer that carried this message
+ * @param data The encoded AMQP message
+ * @param extraProperties Broker specific extra properties that should be carried with this message
+ * @param coreMessageObjectPools Object pool used to accelerate some String operations.
+ */
+ public AMQPStandardMessage(long messageFormat,
+ byte[] data,
+ TypedProperties extraProperties,
+ CoreMessageObjectPools coreMessageObjectPools) {
+ this(messageFormat, ReadableBuffer.ByteBufferReader.wrap(data), extraProperties, coreMessageObjectPools);
+ }
+
+ /**
+ * Creates a new {@link AMQPStandardMessage} instance from binary encoded message data.
+ *
+ * @param messageFormat The Message format tag given the in Transfer that carried this message
+ * @param data The encoded AMQP message in an {@link ReadableBuffer} wrapper.
+ * @param extraProperties Broker specific extra properties that should be carried with this message
+ * @param coreMessageObjectPools Object pool used to accelerate some String operations.
+ */
+ public AMQPStandardMessage(long messageFormat,
+ ReadableBuffer data,
+ TypedProperties extraProperties,
+ CoreMessageObjectPools coreMessageObjectPools) {
+ super(messageFormat, extraProperties, coreMessageObjectPools);
+ this.data = data;
+ ensureMessageDataScanned();
+ }
+
+ /**
+ * Internal constructor used for persistence reload of the message.
+ *
+ * The message will not be usable until the persistence mechanism populates the message
+ * data and triggers a parse of the message contents to fill in the message state.
+ *
+ * @param messageFormat The Message format tag given the in Transfer that carried this message
+ */
+ AMQPStandardMessage(long messageFormat) {
+ super(messageFormat);
+ }
+
+ @Override
+ public org.apache.activemq.artemis.api.core.Message copy() {
+ ensureDataIsValid();
+
+ ReadableBuffer view = data.duplicate().rewind();
+ byte[] newData = new byte[view.remaining()];
+
+ // Copy the full message contents with delivery annotations as they will
+ // be trimmed on send and may become useful on the broker at a later time.
+ view.get(newData);
+
+ AMQPStandardMessage newEncode = new AMQPStandardMessage(this.messageFormat, newData, extraProperties, coreMessageObjectPools);
+ newEncode.setMessageID(this.getMessageID());
+ return newEncode;
+ }
+
+ @Override
+ public int getEncodeSize() {
+ ensureDataIsValid();
+ // The encoded size will exclude any delivery annotations that are present as we will clip them.
+ return data.remaining() - encodedDeliveryAnnotationsSize + getDeliveryAnnotationsForSendBufferSize();
+ }
+
+ @Override
+ protected ReadableBuffer getData() {
+ return data;
+ }
+
+ @Override
+ public int getMemoryEstimate() {
+ if (memoryEstimate == -1) {
+ memoryEstimate = memoryOffset + (data != null ? data.capacity() : 0);
+ }
+
+ return memoryEstimate;
+ }
+
+ @Override
+ public void persist(ActiveMQBuffer targetRecord) {
+ ensureDataIsValid();
+ targetRecord.writeInt(internalPersistSize());
+ if (data.hasArray()) {
+ targetRecord.writeBytes(data.array(), data.arrayOffset(), data.remaining());
+ } else {
+ targetRecord.writeBytes(data.byteBuffer());
+ }
+ }
+
+ @Override
+ public final org.apache.activemq.artemis.api.core.Message copy(long newID) {
+ return copy().setMessageID(newID);
+ }
+
+ @Override
+ public int getPersistSize() {
+ ensureDataIsValid();
+ return DataConstants.SIZE_INT + internalPersistSize();
+ }
+
+ @Override
+ public void reloadPersistence(ActiveMQBuffer record, CoreMessageObjectPools pools) {
+ int size = record.readInt();
+ byte[] recordArray = new byte[size];
+ record.readBytes(recordArray);
+ data = ReadableBuffer.ByteBufferReader.wrap(ByteBuffer.wrap(recordArray));
+
+ // Message state is now that the underlying buffer is loaded, but the contents not yet scanned
+ resetMessageData();
+ modified = false;
+ messageDataScanned = RELOAD_PERSISTENCE;
+ // can happen when moved to a durable location. We must re-encode here to
+ // avoid a subsequent redelivery from suddenly appearing with a durable header
+ // tag when the initial delivery did not.
+ if (!isDurable()) {
+ setDurable(true);
+ reencode();
+ }
+ }
+
+ @Override
+ public long getPersistentSize() throws ActiveMQException {
+ return getEncodeSize();
+ }
+
+ @Override
+ public Persister getPersister() {
+ return AMQPMessagePersisterV2.getInstance();
+ }
+
+ @Override
+ public void reencode() {
+ ensureMessageDataScanned();
+
+ // The address was updated on a message with Properties so we update them
+ // for cases where there are no properties we aren't adding a properties
+ // section which seems wrong but this preserves previous behavior.
+ if (properties != null && address != null) {
+ properties.setTo(address.toString());
+ }
+
+ encodeMessage();
+ scanMessageData();
+ }
+
+ @Override
+ protected synchronized void ensureDataIsValid() {
+ if (modified) {
+ encodeMessage();
+ }
+ }
+
+ @Override
+ protected synchronized void encodeMessage() {
+ this.modified = false;
+ this.messageDataScanned = NOT_SCANNED;
+ int estimated = Math.max(1500, data != null ? data.capacity() + 1000 : 0);
+ ByteBuf buffer = PooledByteBufAllocator.DEFAULT.heapBuffer(estimated);
+ EncoderImpl encoder = TLSEncode.getEncoder();
+
+ try {
+ NettyWritable writable = new NettyWritable(buffer);
+
+ encoder.setByteBuffer(writable);
+ if (header != null) {
+ encoder.writeObject(header);
+ }
+
+ // We currently do not encode any delivery annotations but it is conceivable
+ // that at some point they may need to be preserved, this is where that needs
+ // to happen.
+
+ if (messageAnnotations != null) {
+ encoder.writeObject(messageAnnotations);
+ }
+ if (properties != null) {
+ encoder.writeObject(properties);
+ }
+
+ // Whenever possible avoid encoding sections we don't need to by
+ // checking if application properties where loaded or added and
+ // encoding only in that case.
+ if (applicationProperties != null) {
+ encoder.writeObject(applicationProperties);
+
+ // Now raw write the remainder body and footer if present.
+ if (data != null && remainingBodyPosition != VALUE_NOT_PRESENT) {
+ writable.put(data.position(remainingBodyPosition));
+ }
+ } else if (data != null && applicationPropertiesPosition != VALUE_NOT_PRESENT) {
+ // Writes out ApplicationProperties, Body and Footer in one go if present.
+ writable.put(data.position(applicationPropertiesPosition));
+ } else if (data != null && remainingBodyPosition != VALUE_NOT_PRESENT) {
+ // No Application properties at all so raw write Body and Footer sections
+ writable.put(data.position(remainingBodyPosition));
+ }
+
+ byte[] bytes = new byte[buffer.writerIndex()];
+
+ buffer.readBytes(bytes);
+ data = ReadableBuffer.ByteBufferReader.wrap(ByteBuffer.wrap(bytes));
+ } finally {
+ encoder.setByteBuffer((WritableBuffer) null);
+ buffer.release();
+ }
+ }
+}
+
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AmqpReadableBuffer.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AmqpReadableBuffer.java
new file mode 100644
index 0000000000..0cdae0f920
--- /dev/null
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AmqpReadableBuffer.java
@@ -0,0 +1,227 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.activemq.artemis.protocol.amqp.broker;
+
+import java.nio.ByteBuffer;
+import java.nio.charset.CharacterCodingException;
+import java.nio.charset.CharsetDecoder;
+import java.nio.charset.StandardCharsets;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import io.netty.util.internal.PlatformDependent;
+import org.apache.qpid.proton.codec.ReadableBuffer;
+import org.apache.qpid.proton.codec.WritableBuffer;
+
+public class AmqpReadableBuffer implements ReadableBuffer {
+ private ByteBuffer buffer;
+
+ public AmqpReadableBuffer(ByteBuffer buffer) {
+ this.buffer = buffer;
+ }
+
+ public ByteBuffer getBuffer() {
+ return this.buffer;
+ }
+
+ @Override
+ public int capacity() {
+ return this.buffer.capacity();
+ }
+
+ @Override
+ public boolean hasArray() {
+ return this.buffer.hasArray();
+ }
+
+ @Override
+ public byte[] array() {
+ if (this.buffer.hasArray()) {
+ return this.buffer.array();
+ } else {
+ byte[] bytes = new byte[buffer.remaining()];
+ buffer.get(bytes);
+ return bytes;
+ }
+ }
+
+ public void freeDirectBuffer() {
+ // releasing direct buffer created from mmap
+ PlatformDependent.freeDirectBuffer(buffer);
+ }
+
+ @Override
+ public int arrayOffset() {
+ return this.buffer.arrayOffset();
+ }
+
+ @Override
+ public ReadableBuffer reclaimRead() {
+ return this;
+ }
+
+ @Override
+ public byte get() {
+ return this.buffer.get();
+ }
+
+ @Override
+ public byte get(int index) {
+ return this.buffer.get(index);
+ }
+
+ @Override
+ public int getInt() {
+ return this.buffer.getInt();
+ }
+
+ @Override
+ public long getLong() {
+ return this.buffer.getLong();
+ }
+
+ @Override
+ public short getShort() {
+ return this.buffer.getShort();
+ }
+
+ @Override
+ public float getFloat() {
+ return this.buffer.getFloat();
+ }
+
+ @Override
+ public double getDouble() {
+ return this.buffer.getDouble();
+ }
+
+ @Override
+ public ReadableBuffer get(byte[] target, int offset, int length) {
+ this.buffer.get(target, offset, length);
+ return this;
+ }
+
+ @Override
+ public ReadableBuffer get(byte[] target) {
+ this.buffer.get(target);
+ return this;
+ }
+
+ @Override
+ public ReadableBuffer get(WritableBuffer target) {
+ int start = target.position();
+ if (this.buffer.hasArray()) {
+ target.put(this.buffer.array(), this.buffer.arrayOffset() + this.buffer.position(), this.buffer.remaining());
+ } else {
+ target.put(this.buffer);
+ }
+
+ int written = target.position() - start;
+ this.buffer.position(this.buffer.position() + written);
+ return this;
+ }
+
+ @Override
+ public ReadableBuffer slice() {
+ return new AmqpReadableBuffer(this.buffer.slice());
+ }
+
+ @Override
+ public ReadableBuffer flip() {
+ this.buffer.flip();
+ return this;
+ }
+
+ @Override
+ public ReadableBuffer limit(int limit) {
+ this.buffer.limit(limit);
+ return this;
+ }
+
+ @Override
+ public int limit() {
+ return this.buffer.limit();
+ }
+
+ @Override
+ public ReadableBuffer position(int position) {
+ this.buffer.position(position);
+ return this;
+ }
+
+ @Override
+ public int position() {
+ return this.buffer.position();
+ }
+
+ @Override
+ public ReadableBuffer mark() {
+ this.buffer.mark();
+ return this;
+ }
+
+ @Override
+ public ReadableBuffer reset() {
+ this.buffer.reset();
+ return this;
+ }
+
+ @Override
+ public ReadableBuffer rewind() {
+ this.buffer.rewind();
+ return this;
+ }
+
+ @Override
+ public ReadableBuffer clear() {
+ this.buffer.clear();
+ return this;
+ }
+
+ @Override
+ public int remaining() {
+ return this.buffer.remaining();
+ }
+
+ @Override
+ public boolean hasRemaining() {
+ return this.buffer.hasRemaining();
+ }
+
+ @Override
+ public ReadableBuffer duplicate() {
+ return new AmqpReadableBuffer(this.buffer.duplicate());
+ }
+
+ @Override
+ public ByteBuffer byteBuffer() {
+ return this.buffer;
+ }
+
+ @Override
+ public String readUTF8() throws CharacterCodingException {
+ ByteBuf wrappedNetty = Unpooled.wrappedBuffer(buffer);
+ return wrappedNetty.toString(StandardCharsets.UTF_8);
+ }
+
+ @Override
+ public String readString(CharsetDecoder decoder) throws CharacterCodingException {
+ ByteBuf wrappedNetty = Unpooled.wrappedBuffer(buffer);
+ return wrappedNetty.toString(StandardCharsets.UTF_8);
+ }
+}
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/ProtonProtocolManager.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/ProtonProtocolManager.java
index e0af481645..f76a4d5b59 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/ProtonProtocolManager.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/ProtonProtocolManager.java
@@ -65,6 +65,11 @@ public class ProtonProtocolManager extends AbstractProtocolManager prefixes = new HashMap<>();
+ /** minLargeMessageSize determines when a message should be considered as large.
+ * minLargeMessageSize = -1 basically disables large message control over AMQP.
+ */
+ private int amqpMinLargeMessageSize = 100 * 1024;
+
private int amqpCredits = AmqpSupport.AMQP_CREDITS_DEFAULT;
private int amqpLowCredits = AmqpSupport.AMQP_LOW_CREDITS_DEFAULT;
@@ -112,6 +117,15 @@ public class ProtonProtocolManager extends AbstractProtocolManager[] getPersister() {
+ public Persister[] getPersister() {
- Persister[] persisters = new Persister[]{AMQPMessagePersister.getInstance(), AMQPMessagePersisterV2.getInstance()};
+ Persister[] persisters = new Persister[]{AMQPMessagePersister.getInstance(), AMQPMessagePersisterV2.getInstance(), AMQPLargeMessagePersister.getInstance()};
return persisters;
}
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/AMQPConverter.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/AMQPConverter.java
index e67fc67fbf..09b4ce3d27 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/AMQPConverter.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/AMQPConverter.java
@@ -17,7 +17,8 @@
package org.apache.activemq.artemis.protocol.amqp.converter;
import org.apache.activemq.artemis.api.core.ICoreMessage;
-import org.apache.activemq.artemis.core.message.impl.CoreMessageObjectPools;
+import org.apache.activemq.artemis.core.persistence.CoreMessageObjectPools;
+import org.apache.activemq.artemis.core.persistence.StorageManager;
import org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessage;
import org.apache.activemq.artemis.spi.core.protocol.MessageConverter;
@@ -34,8 +35,8 @@ public class AMQPConverter implements MessageConverter {
}
@Override
- public AMQPMessage fromCore(ICoreMessage coreMessage) throws Exception {
- return CoreAmqpConverter.fromCore(coreMessage);
+ public AMQPMessage fromCore(ICoreMessage coreMessage, StorageManager storageManager) throws Exception {
+ return CoreAmqpConverter.fromCore(coreMessage, storageManager);
}
@Override
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/AMQPMessageSupport.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/AMQPMessageSupport.java
index 21116a6c65..dd81c4c34c 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/AMQPMessageSupport.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/AMQPMessageSupport.java
@@ -36,7 +36,7 @@ import javax.jms.TemporaryTopic;
import javax.jms.Topic;
import org.apache.activemq.artemis.core.message.impl.CoreMessage;
-import org.apache.activemq.artemis.core.message.impl.CoreMessageObjectPools;
+import org.apache.activemq.artemis.core.persistence.CoreMessageObjectPools;
import org.apache.activemq.artemis.jms.client.ActiveMQDestination;
import org.apache.activemq.artemis.jms.client.ActiveMQQueue;
import org.apache.activemq.artemis.jms.client.ActiveMQTemporaryQueue;
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/AmqpCoreConverter.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/AmqpCoreConverter.java
index 3c21e08fae..ad079e9fbc 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/AmqpCoreConverter.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/AmqpCoreConverter.java
@@ -64,7 +64,7 @@ import javax.jms.JMSException;
import org.apache.activemq.artemis.api.core.ActiveMQPropertyConversionException;
import org.apache.activemq.artemis.api.core.ICoreMessage;
-import org.apache.activemq.artemis.core.message.impl.CoreMessageObjectPools;
+import org.apache.activemq.artemis.core.persistence.CoreMessageObjectPools;
import org.apache.activemq.artemis.jms.client.ActiveMQDestination;
import org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessage;
import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSMessage;
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/CoreAmqpConverter.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/CoreAmqpConverter.java
index dcb054afcc..b9375ce165 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/CoreAmqpConverter.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/CoreAmqpConverter.java
@@ -68,7 +68,9 @@ import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
import org.apache.activemq.artemis.api.core.ICoreMessage;
import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
+import org.apache.activemq.artemis.core.persistence.StorageManager;
import org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessage;
+import org.apache.activemq.artemis.protocol.amqp.broker.AMQPStandardMessage;
import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSBytesMessage;
import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSMapMessage;
import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSMessage;
@@ -107,22 +109,22 @@ public class CoreAmqpConverter {
private static Logger logger = Logger.getLogger(CoreAmqpConverter.class);
- public static AMQPMessage checkAMQP(Message message) throws Exception {
+ public static AMQPMessage checkAMQP(Message message, StorageManager storageManager) throws Exception {
if (message instanceof AMQPMessage) {
return (AMQPMessage)message;
} else {
// It will first convert to Core, then to AMQP
- return fromCore(message.toCore());
+ return fromCore(message.toCore(), storageManager);
}
}
- public static AMQPMessage fromCore(ICoreMessage coreMessage) throws Exception {
+ public static AMQPMessage fromCore(ICoreMessage coreMessage, StorageManager storageManager) throws Exception {
if (coreMessage == null) {
return null;
}
if (coreMessage.isServerMessage() && coreMessage.isLargeMessage() && coreMessage.getType() == EMBEDDED_TYPE) {
//large AMQP messages received across cluster nodes
- final Message message = EmbedMessageUtil.extractEmbedded(coreMessage);
+ final Message message = EmbedMessageUtil.extractEmbedded(coreMessage, storageManager);
if (message instanceof AMQPMessage) {
return (AMQPMessage) message;
}
@@ -363,7 +365,7 @@ public class CoreAmqpConverter {
byte[] data = new byte[buffer.writerIndex()];
buffer.readBytes(data);
- AMQPMessage amqpMessage = new AMQPMessage(messageFormat, data, null);
+ AMQPMessage amqpMessage = new AMQPStandardMessage(messageFormat, data, null);
amqpMessage.setMessageID(message.getInnerMessage().getMessageID());
amqpMessage.setReplyTo(coreMessage.getReplyTo());
return amqpMessage;
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/AMQPConnectionContext.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/AMQPConnectionContext.java
index e6ec486a07..63e18a7529 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/AMQPConnectionContext.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/AMQPConnectionContext.java
@@ -188,6 +188,9 @@ public class AMQPConnectionContext extends ProtonInitializable implements EventH
return false;
}
+ public void instantFlush() {
+ handler.instantFlush();
+ }
public void flush() {
handler.flush();
}
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/ProtonServerReceiverContext.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/ProtonServerReceiverContext.java
index 8a412bcc1b..a6cfb5e01c 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/ProtonServerReceiverContext.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/ProtonServerReceiverContext.java
@@ -25,12 +25,15 @@ import org.apache.activemq.artemis.api.core.ActiveMQExceptionType;
import org.apache.activemq.artemis.api.core.ActiveMQSecurityException;
import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.api.core.SimpleString;
+import org.apache.activemq.artemis.core.persistence.impl.nullpm.NullStorageManager;
import org.apache.activemq.artemis.core.security.CheckType;
import org.apache.activemq.artemis.core.security.SecurityAuth;
import org.apache.activemq.artemis.core.server.RoutingContext;
import org.apache.activemq.artemis.core.server.impl.AddressInfo;
import org.apache.activemq.artemis.core.server.impl.RoutingContextImpl;
import org.apache.activemq.artemis.core.transaction.Transaction;
+import org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessage;
+import org.apache.activemq.artemis.protocol.amqp.broker.AMQPLargeMessage;
import org.apache.activemq.artemis.protocol.amqp.broker.AMQPSessionCallback;
import org.apache.activemq.artemis.protocol.amqp.exceptions.ActiveMQAMQPException;
import org.apache.activemq.artemis.protocol.amqp.exceptions.ActiveMQAMQPInternalErrorException;
@@ -121,6 +124,8 @@ public class ProtonServerReceiverContext extends ProtonInitializable implements
// Used by the broker to decide when to refresh clients credit. This is not used when client requests credit.
private final int minCreditRefresh;
+ private final int minLargeMessageSize;
+
public ProtonServerReceiverContext(AMQPSessionCallback sessionSPI,
AMQPConnectionContext connection,
AMQPSessionContext protonSession,
@@ -134,6 +139,7 @@ public class ProtonServerReceiverContext extends ProtonInitializable implements
this.minCreditRefresh = connection.getAmqpLowCredits();
this.creditRunnable = createCreditRunnable(amqpCredits, minCreditRefresh, receiver, connection).setRan();
useModified = this.connection.getProtocolManager().isUseModifiedForTransientDeliveryErrors();
+ this.minLargeMessageSize = connection.getProtocolManager().getAmqpMinLargeMessageSize();
}
@Override
@@ -264,6 +270,8 @@ public class ProtonServerReceiverContext extends ProtonInitializable implements
return defaultRoutingType;
}
+ volatile AMQPLargeMessage currentLargeMessage;
+
/*
* called when Proton receives a message to be delivered via a Delivery.
*
@@ -278,39 +286,78 @@ public class ProtonServerReceiverContext extends ProtonInitializable implements
return;
}
- if (delivery.isAborted()) {
- // Aborting implicitly remotely settles, so advance
- // receiver to the next delivery and settle locally.
- receiver.advance();
- delivery.settle();
+ try {
+ if (delivery.isAborted()) {
+ // Aborting implicitly remotely settles, so advance
+ // receiver to the next delivery and settle locally.
+ receiver.advance();
+ delivery.settle();
- // Replenish the credit if not doing a drain
- if (!receiver.getDrain()) {
- receiver.flow(1);
+ // Replenish the credit if not doing a drain
+ if (!receiver.getDrain()) {
+ receiver.flow(1);
+ }
+
+ return;
+ } else if (delivery.isPartial()) {
+ if (sessionSPI.getStorageManager() instanceof NullStorageManager) {
+ // if we are dealing with the NullStorageManager we should just make it a regular message anyways
+ return;
+ }
+
+ if (currentLargeMessage == null) {
+ // minLargeMessageSize < 0 means no large message treatment, make it disabled
+ if (minLargeMessageSize > 0 && delivery.available() >= minLargeMessageSize) {
+ initializeCurrentLargeMessage(delivery, receiver);
+ }
+ } else {
+ currentLargeMessage.addBytes(receiver.recv());
+ }
+
+ return;
}
- return;
- } else if (delivery.isPartial()) {
- return;
+ AMQPMessage message;
+
+ // this is treating the case where the frameSize > minLargeMessage and the message is still large enough
+ if (!(sessionSPI.getStorageManager() instanceof NullStorageManager) && currentLargeMessage == null && minLargeMessageSize > 0 && delivery.available() >= minLargeMessageSize) {
+ initializeCurrentLargeMessage(delivery, receiver);
+ }
+
+ if (currentLargeMessage != null) {
+ currentLargeMessage.addBytes(receiver.recv());
+ receiver.advance();
+ currentLargeMessage.finishParse();
+ message = currentLargeMessage;
+ currentLargeMessage = null;
+ } else {
+ ReadableBuffer data = receiver.recv();
+ receiver.advance();
+ message = sessionSPI.createStandardMessage(delivery, data);
+ }
+
+ Transaction tx = null;
+ if (delivery.getRemoteState() instanceof TransactionalState) {
+ TransactionalState txState = (TransactionalState) delivery.getRemoteState();
+ tx = this.sessionSPI.getTransaction(txState.getTxnId(), false);
+ }
+
+ actualDelivery(message, delivery, receiver, tx);
+ } catch (Exception e) {
+ throw new ActiveMQAMQPInternalErrorException(e.getMessage(), e);
}
- ReadableBuffer data = receiver.recv();
- receiver.advance();
- Transaction tx = null;
-
- if (delivery.getRemoteState() instanceof TransactionalState) {
- TransactionalState txState = (TransactionalState) delivery.getRemoteState();
- tx = this.sessionSPI.getTransaction(txState.getTxnId(), false);
- }
-
- final Transaction txUsed = tx;
-
- actualDelivery(delivery, receiver, data, txUsed);
}
- private void actualDelivery(Delivery delivery, Receiver receiver, ReadableBuffer data, Transaction tx) {
+ private void initializeCurrentLargeMessage(Delivery delivery, Receiver receiver) throws Exception {
+ long id = sessionSPI.getStorageManager().generateID();
+ currentLargeMessage = new AMQPLargeMessage(id, delivery.getMessageFormat(), null, sessionSPI.getCoreMessageObjectPools(), sessionSPI.getStorageManager());
+ currentLargeMessage.addBytes(receiver.recv());
+ }
+
+ private void actualDelivery(AMQPMessage message, Delivery delivery, Receiver receiver, Transaction tx) {
try {
- sessionSPI.serverSend(this, tx, receiver, delivery, address, delivery.getMessageFormat(), data, routingContext);
+ sessionSPI.serverSend(this, tx, receiver, delivery, address, routingContext, message);
} catch (Exception e) {
log.warn(e.getMessage(), e);
DeliveryState deliveryState = determineDeliveryState(((Source) receiver.getSource()),
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/ProtonServerSenderContext.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/ProtonServerSenderContext.java
index 3ab2699ae4..eac0f10a54 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/ProtonServerSenderContext.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/ProtonServerSenderContext.java
@@ -16,6 +16,7 @@
*/
package org.apache.activemq.artemis.protocol.amqp.proton;
+import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
@@ -29,6 +30,7 @@ import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.io.IOCallback;
+import org.apache.activemq.artemis.core.message.LargeBodyReader;
import org.apache.activemq.artemis.core.persistence.OperationContext;
import org.apache.activemq.artemis.core.server.AddressQueryResult;
import org.apache.activemq.artemis.core.server.Consumer;
@@ -37,6 +39,7 @@ import org.apache.activemq.artemis.core.server.QueueQueryResult;
import org.apache.activemq.artemis.core.server.ServerConsumer;
import org.apache.activemq.artemis.core.server.impl.ServerConsumerImpl;
import org.apache.activemq.artemis.jms.client.ActiveMQDestination;
+import org.apache.activemq.artemis.protocol.amqp.broker.AMQPLargeMessage;
import org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessage;
import org.apache.activemq.artemis.protocol.amqp.broker.AMQPSessionCallback;
import org.apache.activemq.artemis.protocol.amqp.broker.ActiveMQProtonRemotingConnection;
@@ -110,6 +113,12 @@ public class ProtonServerSenderContext extends ProtonInitializable implements Pr
private SimpleString tempQueueName;
private final AtomicBoolean draining = new AtomicBoolean(false);
+ // once a large message is accepted, we shouldn't accept any further messages
+ // as large message could be interrupted due to flow control and resumed at the same message
+ volatile boolean hasLarge = false;
+ volatile LargeMessageDeliveryContext pendingLargeMessage = null;
+
+
private int credits = 0;
private AtomicInteger pending = new AtomicInteger(0);
@@ -170,6 +179,11 @@ public class ProtonServerSenderContext extends ProtonInitializable implements Pr
}
public boolean hasCredits() {
+ if (hasLarge) {
+ // we will resume accepting once the large message is finished
+ return false;
+ }
+
if (!connection.flowControl(onflowControlReady)) {
return false;
}
@@ -764,9 +778,13 @@ public class ProtonServerSenderContext extends ProtonInitializable implements Pr
credits--;
}
+ if (messageReference.getMessage() instanceof AMQPLargeMessage) {
+ hasLarge = true;
+ }
+
if (messageReference instanceof Runnable && consumer.allowReferenceCallback()) {
messageReference.onDelivery(executeDelivery);
- connection.runNow((Runnable)messageReference);
+ connection.runNow((Runnable) messageReference);
} else {
connection.runNow(() -> executeDelivery(messageReference));
}
@@ -785,39 +803,78 @@ public class ProtonServerSenderContext extends ProtonInitializable implements Pr
log.debug("Not delivering message " + messageReference + " as the sender is closed and credits were available, if you see too many of these it means clients are issuing credits and closing the connection with pending credits a lot of times");
return;
}
- AMQPMessage message = CoreAmqpConverter.checkAMQP(messageReference.getMessage());
+ AMQPMessage message = CoreAmqpConverter.checkAMQP(messageReference.getMessage(), sessionSPI.getStorageManager());
if (sessionSPI.invokeOutgoing(message, (ActiveMQProtonRemotingConnection) sessionSPI.getTransportConnection().getProtocolConnection()) != null) {
return;
}
+ if (message instanceof AMQPLargeMessage) {
+ deliverLarge(messageReference, (AMQPLargeMessage) message);
+ } else {
+ deliverStandard(messageReference, message);
+ }
+ } catch (Exception e) {
+ log.warn(e.getMessage(), e);
+ brokerConsumer.errorProcessing(e, messageReference);
+ }
+ }
+
+ private class LargeMessageDeliveryContext {
+
+ LargeMessageDeliveryContext(MessageReference reference, AMQPLargeMessage message, Delivery delivery) {
+ this.position = 0L;
+ this.reference = reference;
+ this.message = message;
+ this.delivery = delivery;
+ }
+
+ long position;
+ final MessageReference reference;
+ final AMQPLargeMessage message;
+ final Delivery delivery;
+
+ void resume() {
+ connection.runNow(this::deliver);
+ }
+ private static final int BUFFER_LENGTH = 1024;
+
+ void deliver() {
// Let the Message decide how to present the message bytes
- ReadableBuffer sendBuffer = message.getSendBuffer(messageReference.getDeliveryCount());
- // we only need a tag if we are going to settle later
- byte[] tag = preSettle ? new byte[0] : protonSession.getTag();
-
- boolean releaseRequired = sendBuffer instanceof NettyReadable;
- final Delivery delivery;
- delivery = sender.delivery(tag, 0, tag.length);
- delivery.setMessageFormat((int) message.getMessageFormat());
- delivery.setContext(messageReference);
-
+ LargeBodyReader context = message.getLargeBodyReader();
try {
- if (releaseRequired) {
- sender.send(sendBuffer);
- // Above send copied, so release now if needed
- releaseRequired = false;
- ((NettyReadable) sendBuffer).getByteBuf().release();
- } else {
- // Don't have pooled content, no need to release or copy.
- sender.sendNoCopy(sendBuffer);
+ context.open();
+ try {
+ context.position(position);
+ long bodySize = context.getSize();
+
+ // TODO: it would be nice to use pooled buffer here,
+ // however I would need a version of ReadableBuffer for Netty
+ ByteBuffer buf = ByteBuffer.allocate(BUFFER_LENGTH);
+
+ for (; position < bodySize; ) {
+ if (!connection.flowControl(this::resume)) {
+ context.close();
+ return;
+ }
+ buf.clear();
+ int size = context.readInto(buf);
+
+ sender.send(buf.array(), 0, size);
+
+ connection.instantFlush();
+
+ position += size;
+ }
+ } finally {
+ context.close();
}
if (preSettle) {
// Presettled means the client implicitly accepts any delivery we send it.
try {
- sessionSPI.ack(null, brokerConsumer, messageReference.getMessage());
+ sessionSPI.ack(null, brokerConsumer, reference.getMessage());
} catch (Exception e) {
log.debug(e.getMessage(), e);
}
@@ -827,17 +884,84 @@ public class ProtonServerSenderContext extends ProtonInitializable implements Pr
}
connection.flush();
- } finally {
+
synchronized (creditsLock) {
pending.decrementAndGet();
}
- if (releaseRequired) {
- ((NettyReadable) sendBuffer).getByteBuf().release();
- }
+
+ finishLargeMessage();
+ } catch (Exception e) {
+ log.warn(e.getMessage(), e);
+ brokerConsumer.errorProcessing(e, reference);
+ }
+ }
+ }
+
+ private void finishLargeMessage() {
+ pendingLargeMessage = null;
+ hasLarge = false;
+ brokerConsumer.promptDelivery();
+ }
+
+ private void deliverLarge(MessageReference messageReference, AMQPLargeMessage message) {
+
+ // we only need a tag if we are going to settle later
+ byte[] tag = preSettle ? new byte[0] : protonSession.getTag();
+
+ final Delivery delivery;
+ delivery = sender.delivery(tag, 0, tag.length);
+ delivery.setMessageFormat((int) message.getMessageFormat());
+ delivery.setContext(messageReference);
+
+ pendingLargeMessage = new LargeMessageDeliveryContext(messageReference, message, delivery);
+ pendingLargeMessage.deliver();
+
+ }
+
+ private void deliverStandard(MessageReference messageReference, AMQPMessage message) {
+ // Let the Message decide how to present the message bytes
+ ReadableBuffer sendBuffer = message.getSendBuffer(messageReference.getDeliveryCount());
+ // we only need a tag if we are going to settle later
+ byte[] tag = preSettle ? new byte[0] : protonSession.getTag();
+
+ boolean releaseRequired = sendBuffer instanceof NettyReadable;
+ final Delivery delivery;
+ delivery = sender.delivery(tag, 0, tag.length);
+ delivery.setMessageFormat((int) message.getMessageFormat());
+ delivery.setContext(messageReference);
+
+ try {
+
+ if (releaseRequired) {
+ sender.send(sendBuffer);
+ // Above send copied, so release now if needed
+ releaseRequired = false;
+ ((NettyReadable) sendBuffer).getByteBuf().release();
+ } else {
+ // Don't have pooled content, no need to release or copy.
+ sender.sendNoCopy(sendBuffer);
+ }
+
+ if (preSettle) {
+ // Presettled means the client implicitly accepts any delivery we send it.
+ try {
+ sessionSPI.ack(null, brokerConsumer, messageReference.getMessage());
+ } catch (Exception e) {
+ log.debug(e.getMessage(), e);
+ }
+ delivery.settle();
+ } else {
+ sender.advance();
+ }
+
+ connection.flush();
+ } finally {
+ synchronized (creditsLock) {
+ pending.decrementAndGet();
+ }
+ if (releaseRequired) {
+ ((NettyReadable) sendBuffer).getByteBuf().release();
}
- } catch (Exception e) {
- log.warn(e.getMessage(), e);
- brokerConsumer.errorProcessing(e, messageReference);
}
}
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/handler/ProtonHandler.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/handler/ProtonHandler.java
index 00dfd00d59..62667ddce3 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/handler/ProtonHandler.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/handler/ProtonHandler.java
@@ -88,6 +88,8 @@ public class ProtonHandler extends ProtonInitializable implements SaslListener {
boolean scheduledFlush = false;
+ boolean flushInstantly = false;
+
public ProtonHandler(EventLoop workerExecutor, ArtemisExecutor poolExecutor, boolean isServer) {
this.workerExecutor = workerExecutor;
this.poolExecutor = poolExecutor;
@@ -174,12 +176,29 @@ public class ProtonHandler extends ProtonInitializable implements SaslListener {
+ /** When processing large messages, we require to flush bytes every processing */
+ public void instantFlush() {
+ this.flushInstantly = true;
+ // This will perform event handling, and at some point the flushBytes will be called
+ this.flush();
+ }
+
public void flushBytes() {
requireHandler();
- if (!scheduledFlush) {
- scheduledFlush = true;
- workerExecutor.execute(this::actualFlush);
+ if (flushInstantly) {
+ flushInstantly = false;
+ scheduledFlush = false;
+ actualFlush();
+ } else {
+ // Under regular circunstances, it would be too costly to flush every time,
+ // so we flush only once at the end of processing.
+
+ // this decision was made after extensive performance testing.
+ if (!scheduledFlush) {
+ scheduledFlush = true;
+ workerExecutor.execute(this::actualFlush);
+ }
}
}
diff --git a/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPMessageTest.java b/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPMessageTest.java
index 0f68edfbdb..882248188d 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPMessageTest.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPMessageTest.java
@@ -104,13 +104,13 @@ public class AMQPMessageTest {
@Test
public void testCreateMessageFromEncodedByteArrayData() {
// Constructor 1
- AMQPMessage decoded = new AMQPMessage(0, encodedProtonMessage, null);
+ AMQPStandardMessage decoded = new AMQPStandardMessage(0, encodedProtonMessage, null);
assertTrue(decoded.isDurable());
assertEquals(TEST_TO_ADDRESS, decoded.getAddress());
// Constructor 2
- decoded = new AMQPMessage(0, encodedProtonMessage, null, null);
+ decoded = new AMQPStandardMessage(0, encodedProtonMessage, null, null);
assertTrue(decoded.isDurable());
assertEquals(TEST_TO_ADDRESS, decoded.getAddress());
@@ -118,7 +118,7 @@ public class AMQPMessageTest {
@Test
public void testCreateMessageFromEncodedReadableBuffer() {
- AMQPMessage decoded = new AMQPMessage(0, ReadableBuffer.ByteBufferReader.wrap(encodedProtonMessage), null, null);
+ AMQPStandardMessage decoded = new AMQPStandardMessage(0, ReadableBuffer.ByteBufferReader.wrap(encodedProtonMessage), null, null);
assertEquals(true, decoded.getHeader().getDurable());
assertEquals(TEST_TO_ADDRESS, decoded.getAddress());
@@ -126,7 +126,7 @@ public class AMQPMessageTest {
@Test
public void testCreateMessageFromEncodedByteArrayDataWithExtraProperties() {
- AMQPMessage decoded = new AMQPMessage(0, encodedProtonMessage, new TypedProperties(), null);
+ AMQPStandardMessage decoded = new AMQPStandardMessage(0, encodedProtonMessage, new TypedProperties(), null);
assertEquals(true, decoded.getHeader().getDurable());
assertEquals(TEST_TO_ADDRESS, decoded.getAddress());
@@ -138,7 +138,7 @@ public class AMQPMessageTest {
MessageImpl protonMessage = createProtonMessage();
ActiveMQBuffer encoded = encodeMessageAsPersistedBuffer(protonMessage);
- AMQPMessage message = new AMQPMessage(0);
+ AMQPStandardMessage message = new AMQPStandardMessage(0);
try {
message.getProtonMessage();
fail("Should throw NPE due to not being initialized yet");
@@ -165,7 +165,7 @@ public class AMQPMessageTest {
annotations.getValue().put(AMQPMessageSupport.SCHEDULED_DELIVERY_TIME, scheduledTime);
ActiveMQBuffer encoded = encodeMessageAsPersistedBuffer(protonMessage);
- AMQPMessage message = new AMQPMessage(0);
+ AMQPMessage message = new AMQPStandardMessage(0);
try {
message.getProtonMessage();
fail("Should throw NPE due to not being initialized yet");
@@ -188,7 +188,7 @@ public class AMQPMessageTest {
annotations.getValue().put(AMQPMessageSupport.SCHEDULED_DELIVERY_DELAY, scheduledDelay);
ActiveMQBuffer encoded = encodeMessageAsPersistedBuffer(protonMessage);
- AMQPMessage message = new AMQPMessage(0);
+ AMQPMessage message = new AMQPStandardMessage(0);
try {
message.getProtonMessage();
fail("Should throw NPE due to not being initialized yet");
@@ -208,7 +208,7 @@ public class AMQPMessageTest {
MessageImpl protonMessage = createProtonMessage();
ActiveMQBuffer encoded = encodeMessageAsPersistedBuffer(protonMessage);
- AMQPMessage message = new AMQPMessage(0);
+ AMQPMessage message = new AMQPStandardMessage(0);
try {
message.getProtonMessage();
fail("Should throw NPE due to not being initialized yet");
@@ -227,7 +227,7 @@ public class AMQPMessageTest {
@Test
public void testGetMemoryEstimate() {
- AMQPMessage decoded = new AMQPMessage(0, encodedProtonMessage, new TypedProperties(), null);
+ AMQPStandardMessage decoded = new AMQPStandardMessage(0, encodedProtonMessage, new TypedProperties(), null);
int estimate = decoded.getMemoryEstimate();
assertTrue(encodedProtonMessage.length < decoded.getMemoryEstimate());
@@ -257,7 +257,7 @@ public class AMQPMessageTest {
for (int testTry = 0; testTry < 100; testTry++) {
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
Thread[] threads = new Thread[100];
CountDownLatch latchAlign = new CountDownLatch(threads.length);
@@ -304,7 +304,7 @@ public class AMQPMessageTest {
@Test
public void testGetConnectionID() {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(null, decoded.getConnectionID());
}
@@ -312,7 +312,7 @@ public class AMQPMessageTest {
@Test
public void testSetConnectionID() {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
final String ID = UUID.randomUUID().toString();
@@ -324,7 +324,7 @@ public class AMQPMessageTest {
@Test
public void testGetConnectionIDFromProperties() {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
final String ID = UUID.randomUUID().toString();
@@ -339,7 +339,7 @@ public class AMQPMessageTest {
@Test
public void testGetLastValueFromMessageWithNone() {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertNull(decoded.getLastValueProperty());
}
@@ -349,7 +349,7 @@ public class AMQPMessageTest {
SimpleString lastValue = new SimpleString("last-address");
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertNull(decoded.getLastValueProperty());
decoded.setLastValueProperty(lastValue);
@@ -361,7 +361,7 @@ public class AMQPMessageTest {
@Test
public void getUserIDWhenNoPropertiesExists() {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertNull(decoded.getUserID());
decoded.setUserID(UUID.randomUUID().toString());
@@ -373,7 +373,7 @@ public class AMQPMessageTest {
final String ID = UUID.randomUUID().toString();
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertNull(decoded.getUserID());
assertNull(decoded.getProperties());
@@ -391,7 +391,7 @@ public class AMQPMessageTest {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
protonMessage.setProperties(new Properties());
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertNull(decoded.getUserID());
assertNotNull(decoded.getProperties());
@@ -412,7 +412,7 @@ public class AMQPMessageTest {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
protonMessage.setProperties(new Properties());
protonMessage.setMessageId(ID);
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertNotNull(decoded.getUserID());
assertNotNull(decoded.getProperties());
@@ -433,7 +433,7 @@ public class AMQPMessageTest {
@Test
public void testGetDuplicateProperty() {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(null, decoded.getDuplicateProperty());
}
@@ -448,7 +448,7 @@ public class AMQPMessageTest {
protonMessage.setHeader(new Header());
protonMessage.setAddress(ADDRESS);
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(ADDRESS, decoded.getAddress());
}
@@ -461,7 +461,7 @@ public class AMQPMessageTest {
protonMessage.setHeader(new Header());
protonMessage.setAddress(ADDRESS);
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(ADDRESS, decoded.getAddressSimpleString().toString());
}
@@ -469,7 +469,7 @@ public class AMQPMessageTest {
@Test
public void testGetAddressFromMessageWithNoValueSet() {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertNull(decoded.getAddress());
assertNull(decoded.getAddressSimpleString());
@@ -483,7 +483,7 @@ public class AMQPMessageTest {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
protonMessage.setAddress(ADDRESS);
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(ADDRESS, decoded.getAddress());
decoded.setAddress(NEW_ADDRESS);
@@ -498,7 +498,7 @@ public class AMQPMessageTest {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
protonMessage.setAddress(ADDRESS);
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(ADDRESS, decoded.getAddress());
decoded.setAddress(NEW_ADDRESS);
@@ -516,7 +516,7 @@ public class AMQPMessageTest {
protonMessage.setHeader(new Header());
protonMessage.setDurable(true);
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertTrue(decoded.isDurable());
}
@@ -526,21 +526,21 @@ public class AMQPMessageTest {
protonMessage.setHeader(new Header());
protonMessage.setDurable(false);
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertFalse(decoded.isDurable());
}
@Test
public void testIsDurableFromMessageWithNoValueSet() {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertFalse(decoded.isDurable());
}
@Test
public void testIsDuranleReturnsTrueOnceUpdated() {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertFalse(decoded.isDurable());
decoded.setDurable(true);
assertTrue(decoded.isDurable());
@@ -550,7 +550,7 @@ public class AMQPMessageTest {
public void testNonDurableMessageReencodedToDurable() {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
protonMessage.setHeader(new Header());
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertFalse(decoded.isDurable());
// Underlying message data not updated yet
@@ -567,7 +567,7 @@ public class AMQPMessageTest {
@Test
public void testMessageWithNoHeaderGetsOneWhenDurableSetAndReencoded() {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertFalse(decoded.isDurable());
// Underlying message data not updated yet
@@ -588,7 +588,7 @@ public class AMQPMessageTest {
@Test
public void testGetRoutingTypeFromMessageWithoutIt() {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertNull(decoded.getRoutingType());
}
@@ -598,7 +598,7 @@ public class AMQPMessageTest {
RoutingType type = RoutingType.ANYCAST;
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertNull(decoded.getRoutingType());
decoded.setRoutingType(type);
@@ -610,7 +610,7 @@ public class AMQPMessageTest {
RoutingType type = RoutingType.ANYCAST;
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertNull(decoded.getRoutingType());
decoded.setRoutingType(type);
@@ -625,7 +625,7 @@ public class AMQPMessageTest {
MessageAnnotations annotations = new MessageAnnotations(new HashMap<>());
annotations.getValue().put(AMQPMessageSupport.ROUTING_TYPE, RoutingType.ANYCAST.getType());
protonMessage.setMessageAnnotations(annotations);
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(RoutingType.ANYCAST, decoded.getRoutingType());
decoded.setRoutingType(null);
@@ -641,7 +641,7 @@ public class AMQPMessageTest {
MessageAnnotations annotations = new MessageAnnotations(new HashMap<>());
annotations.getValue().put(AMQPMessageSupport.ROUTING_TYPE, RoutingType.ANYCAST.getType());
protonMessage.setMessageAnnotations(annotations);
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(RoutingType.ANYCAST, decoded.getRoutingType());
}
@@ -652,7 +652,7 @@ public class AMQPMessageTest {
MessageAnnotations annotations = new MessageAnnotations(new HashMap<>());
annotations.getValue().put(AMQPMessageSupport.ROUTING_TYPE, RoutingType.MULTICAST.getType());
protonMessage.setMessageAnnotations(annotations);
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(RoutingType.MULTICAST, decoded.getRoutingType());
}
@@ -663,7 +663,7 @@ public class AMQPMessageTest {
MessageAnnotations annotations = new MessageAnnotations(new HashMap<>());
annotations.getValue().put(AMQPMessageSupport.JMS_DEST_TYPE_MSG_ANNOTATION, AMQPMessageSupport.QUEUE_TYPE);
protonMessage.setMessageAnnotations(annotations);
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(RoutingType.ANYCAST, decoded.getRoutingType());
}
@@ -674,7 +674,7 @@ public class AMQPMessageTest {
MessageAnnotations annotations = new MessageAnnotations(new HashMap<>());
annotations.getValue().put(AMQPMessageSupport.JMS_DEST_TYPE_MSG_ANNOTATION, AMQPMessageSupport.TEMP_QUEUE_TYPE);
protonMessage.setMessageAnnotations(annotations);
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(RoutingType.ANYCAST, decoded.getRoutingType());
}
@@ -685,7 +685,7 @@ public class AMQPMessageTest {
MessageAnnotations annotations = new MessageAnnotations(new HashMap<>());
annotations.getValue().put(AMQPMessageSupport.JMS_DEST_TYPE_MSG_ANNOTATION, AMQPMessageSupport.TOPIC_TYPE);
protonMessage.setMessageAnnotations(annotations);
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(RoutingType.MULTICAST, decoded.getRoutingType());
}
@@ -696,7 +696,7 @@ public class AMQPMessageTest {
MessageAnnotations annotations = new MessageAnnotations(new HashMap<>());
annotations.getValue().put(AMQPMessageSupport.JMS_DEST_TYPE_MSG_ANNOTATION, AMQPMessageSupport.TEMP_TOPIC_TYPE);
protonMessage.setMessageAnnotations(annotations);
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(RoutingType.MULTICAST, decoded.getRoutingType());
}
@@ -707,7 +707,7 @@ public class AMQPMessageTest {
MessageAnnotations annotations = new MessageAnnotations(new HashMap<>());
annotations.getValue().put(AMQPMessageSupport.JMS_DEST_TYPE_MSG_ANNOTATION, (byte) 32);
protonMessage.setMessageAnnotations(annotations);
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertNull(decoded.getRoutingType());
}
@@ -721,7 +721,7 @@ public class AMQPMessageTest {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
protonMessage.setHeader(new Header());
protonMessage.setGroupId(GROUP_ID);
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(GROUP_ID, decoded.getGroupID().toString());
}
@@ -730,14 +730,14 @@ public class AMQPMessageTest {
public void testGetGroupIDFromMessageWithNoGroupId() {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
protonMessage.setProperties(new Properties());
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertNull(decoded.getGroupID());
}
@Test
public void testGetGroupIDFromMessageWithNoProperties() {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertNull(decoded.getGroupID());
}
@@ -750,7 +750,7 @@ public class AMQPMessageTest {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
protonMessage.setHeader(new Header());
protonMessage.setReplyTo(REPLY_TO);
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(REPLY_TO, decoded.getReplyTo().toString());
}
@@ -759,14 +759,14 @@ public class AMQPMessageTest {
public void testGetReplyToFromMessageWithNoReplyTo() {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
protonMessage.setProperties(new Properties());
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertNull(decoded.getReplyTo());
}
@Test
public void testGetReplyToFromMessageWithNoProperties() {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertNull(decoded.getReplyTo());
}
@@ -776,7 +776,7 @@ public class AMQPMessageTest {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
protonMessage.setProperties(new Properties());
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertNull(decoded.getReplyTo());
decoded.setReplyTo(new SimpleString(REPLY_TO));
@@ -791,7 +791,7 @@ public class AMQPMessageTest {
final String REPLY_TO = "address-1";
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertNull(decoded.getReplyTo());
decoded.setReplyTo(new SimpleString(REPLY_TO));
@@ -808,7 +808,7 @@ public class AMQPMessageTest {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
protonMessage.setProperties(new Properties());
protonMessage.setReplyTo(REPLY_TO);
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(REPLY_TO, decoded.getReplyTo().toString());
decoded.setReplyTo(null);
@@ -826,7 +826,7 @@ public class AMQPMessageTest {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
protonMessage.setUserId(USER_NAME.getBytes(StandardCharsets.UTF_8));
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(USER_NAME, decoded.getAMQPUserID());
}
@@ -834,7 +834,7 @@ public class AMQPMessageTest {
@Test
public void testGetUserIDFromMessageWithNoProperties() {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertNull(decoded.getAMQPUserID());
}
@@ -843,7 +843,7 @@ public class AMQPMessageTest {
public void testGetUserIDFromMessageWithNoUserID() {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
protonMessage.setProperties(new Properties());
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertNull(decoded.getAMQPUserID());
}
@@ -857,7 +857,7 @@ public class AMQPMessageTest {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
protonMessage.setHeader(new Header());
protonMessage.setPriority(PRIORITY);
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(PRIORITY, decoded.getPriority());
}
@@ -865,27 +865,27 @@ public class AMQPMessageTest {
@Test
public void testGetPriorityFromMessageWithNoHeader() {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
- assertEquals(AMQPMessage.DEFAULT_MESSAGE_PRIORITY, decoded.getPriority());
+ assertEquals(AMQPStandardMessage.DEFAULT_MESSAGE_PRIORITY, decoded.getPriority());
}
@Test
public void testGetPriorityFromMessageWithNoPrioritySet() {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
protonMessage.setHeader(new Header());
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
- assertEquals(AMQPMessage.DEFAULT_MESSAGE_PRIORITY, decoded.getPriority());
+ assertEquals(AMQPStandardMessage.DEFAULT_MESSAGE_PRIORITY, decoded.getPriority());
}
@Test
public void testSetPriorityOnMessageWithHeader() {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
protonMessage.setHeader(new Header());
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
- assertEquals(AMQPMessage.DEFAULT_MESSAGE_PRIORITY, decoded.getPriority());
+ assertEquals(AMQPStandardMessage.DEFAULT_MESSAGE_PRIORITY, decoded.getPriority());
decoded.setPriority((byte) 9);
decoded.reencode();
@@ -897,9 +897,9 @@ public class AMQPMessageTest {
@Test
public void testSetPriorityOnMessageWithoutHeader() {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
- assertEquals(AMQPMessage.DEFAULT_MESSAGE_PRIORITY, decoded.getPriority());
+ assertEquals(AMQPStandardMessage.DEFAULT_MESSAGE_PRIORITY, decoded.getPriority());
decoded.setPriority((byte) 9);
decoded.reencode();
@@ -913,7 +913,7 @@ public class AMQPMessageTest {
@Test
public void testGetExpirationFromMessageWithNoHeader() {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(0, decoded.getExpiration());
}
@@ -922,7 +922,7 @@ public class AMQPMessageTest {
public void testGetExpirationFromMessageWithNoTTLInHeader() {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
protonMessage.setHeader(new Header());
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(0, decoded.getExpiration());
}
@@ -932,7 +932,7 @@ public class AMQPMessageTest {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
protonMessage.setHeader(new Header());
protonMessage.setProperties(new Properties());
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(0, decoded.getExpiration());
}
@@ -944,7 +944,7 @@ public class AMQPMessageTest {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
protonMessage.setHeader(new Header());
protonMessage.setTtl(ttl);
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertTrue(decoded.getExpiration() > System.currentTimeMillis());
}
@@ -957,7 +957,7 @@ public class AMQPMessageTest {
Properties properties = new Properties();
properties.setAbsoluteExpiryTime(expirationTime);
protonMessage.setProperties(properties);
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(expirationTime.getTime(), decoded.getExpiration());
}
@@ -970,7 +970,7 @@ public class AMQPMessageTest {
Properties properties = new Properties();
properties.setAbsoluteExpiryTime(expirationTime);
protonMessage.setProperties(properties);
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(0, decoded.getExpiration());
}
@@ -986,7 +986,7 @@ public class AMQPMessageTest {
Properties properties = new Properties();
properties.setAbsoluteExpiryTime(expirationTime);
protonMessage.setProperties(properties);
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(expirationTime.getTime(), decoded.getExpiration());
}
@@ -996,7 +996,7 @@ public class AMQPMessageTest {
final Date expirationTime = new Date(System.currentTimeMillis());
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(0, decoded.getExpiration());
decoded.setExpiration(expirationTime.getTime());
@@ -1011,7 +1011,7 @@ public class AMQPMessageTest {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
protonMessage.setProperties(new Properties());
protonMessage.setExpiryTime(originalExpirationTime.getTime());
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(originalExpirationTime.getTime(), decoded.getExpiration());
decoded.setExpiration(expirationTime.getTime());
@@ -1026,7 +1026,7 @@ public class AMQPMessageTest {
final Date expirationTime = new Date(System.currentTimeMillis());
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(0, decoded.getExpiration());
decoded.setExpiration(expirationTime.getTime());
@@ -1043,7 +1043,7 @@ public class AMQPMessageTest {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
protonMessage.setProperties(new Properties());
protonMessage.setExpiryTime(expirationTime.getTime());
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(expirationTime.getTime(), decoded.getExpiration());
decoded.setExpiration(-1);
@@ -1057,7 +1057,7 @@ public class AMQPMessageTest {
@Test
public void testSetExpirationToClearDoesNotAddPropertiesWhenNonePresent() {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(0, decoded.getExpiration());
decoded.setExpiration(-1);
@@ -1075,7 +1075,7 @@ public class AMQPMessageTest {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
protonMessage.setHeader(new Header());
protonMessage.setTtl(ttl);
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertTrue(decoded.getExpiration() > System.currentTimeMillis());
@@ -1097,7 +1097,7 @@ public class AMQPMessageTest {
Properties properties = new Properties();
properties.setCreationTime(timestamp);
protonMessage.setProperties(properties);
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(timestamp.getTime(), decoded.getTimestamp());
}
@@ -1106,7 +1106,7 @@ public class AMQPMessageTest {
public void testGetTimestampFromMessageWithNoCreateTimeSet() {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
protonMessage.setHeader(new Header());
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(0L, decoded.getTimestamp());
}
@@ -1114,7 +1114,7 @@ public class AMQPMessageTest {
@Test
public void testGetTimestampFromMessageWithNoHeader() {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(0L, decoded.getTimestamp());
}
@@ -1123,7 +1123,7 @@ public class AMQPMessageTest {
public void testSetTimestampOnMessage() {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
protonMessage.setProperties(new Properties());
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(0L, decoded.getTimestamp());
@@ -1139,7 +1139,7 @@ public class AMQPMessageTest {
@Test
public void testSetTimestampOnMessageWithNoPropertiesSection() {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(0L, decoded.getTimestamp());
@@ -1163,7 +1163,7 @@ public class AMQPMessageTest {
MessageAnnotations annotations = new MessageAnnotations(new HashMap<>());
annotations.getValue().put(AMQPMessageSupport.SCHEDULED_DELIVERY_TIME, scheduledTime);
protonMessage.setMessageAnnotations(annotations);
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(scheduledTime, decoded.getScheduledDeliveryTime().longValue());
}
@@ -1178,7 +1178,7 @@ public class AMQPMessageTest {
annotations.getValue().put(AMQPMessageSupport.SCHEDULED_DELIVERY_DELAY, scheduledDelay);
annotations.getValue().put(AMQPMessageSupport.SCHEDULED_DELIVERY_TIME, scheduledTime);
protonMessage.setMessageAnnotations(annotations);
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(scheduledTime, decoded.getScheduledDeliveryTime().longValue());
}
@@ -1191,7 +1191,7 @@ public class AMQPMessageTest {
MessageAnnotations annotations = new MessageAnnotations(new HashMap<>());
annotations.getValue().put(AMQPMessageSupport.SCHEDULED_DELIVERY_DELAY, scheduledDelay);
protonMessage.setMessageAnnotations(annotations);
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertTrue(decoded.getScheduledDeliveryTime().longValue() > System.currentTimeMillis());
}
@@ -1199,7 +1199,7 @@ public class AMQPMessageTest {
@Test
public void testGetScheduledDeliveryTimeWhenMessageHasNoSetValue() {
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(0, decoded.getScheduledDeliveryTime().longValue());
}
@@ -1208,7 +1208,7 @@ public class AMQPMessageTest {
final long scheduledTime = System.currentTimeMillis() + 5000;
MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(0, decoded.getScheduledDeliveryTime().longValue());
decoded.setScheduledDeliveryTime(scheduledTime);
@@ -1228,7 +1228,7 @@ public class AMQPMessageTest {
MessageAnnotations annotations = new MessageAnnotations(new HashMap<>());
annotations.getValue().put(AMQPMessageSupport.SCHEDULED_DELIVERY_TIME, scheduledTime);
protonMessage.setMessageAnnotations(annotations);
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(scheduledTime, decoded.getScheduledDeliveryTime().longValue());
@@ -1247,7 +1247,7 @@ public class AMQPMessageTest {
MessageAnnotations annotations = new MessageAnnotations(new HashMap<>());
annotations.getValue().put(AMQPMessageSupport.SCHEDULED_DELIVERY_DELAY, scheduledDelay);
protonMessage.setMessageAnnotations(annotations);
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertTrue(decoded.getScheduledDeliveryTime().longValue() > System.currentTimeMillis());
@@ -1267,7 +1267,7 @@ public class AMQPMessageTest {
annotations.getValue().put(AMQPMessageSupport.SCHEDULED_DELIVERY_DELAY, scheduledDelay);
annotations.getValue().put(AMQPMessageSupport.SCHEDULED_DELIVERY_TIME, scheduledTime);
protonMessage.setMessageAnnotations(annotations);
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertEquals(scheduledTime, decoded.getScheduledDeliveryTime().longValue());
@@ -1281,7 +1281,7 @@ public class AMQPMessageTest {
@Test
public void testGetAnnotation() {
- AMQPMessage message = new AMQPMessage(0, encodedProtonMessage, null);
+ AMQPStandardMessage message = new AMQPStandardMessage(0, encodedProtonMessage, null);
Object result = message.getAnnotation(new SimpleString(TEST_MESSAGE_ANNOTATION_KEY));
String stringResult = message.getAnnotationString(new SimpleString(TEST_MESSAGE_ANNOTATION_KEY));
@@ -1291,7 +1291,7 @@ public class AMQPMessageTest {
@Test
public void testRemoveAnnotation() {
- AMQPMessage message = new AMQPMessage(0, encodedProtonMessage, null);
+ AMQPStandardMessage message = new AMQPStandardMessage(0, encodedProtonMessage, null);
assertNotNull(message.getAnnotation(new SimpleString(TEST_MESSAGE_ANNOTATION_KEY)));
message.removeAnnotation(new SimpleString(TEST_MESSAGE_ANNOTATION_KEY));
@@ -1304,7 +1304,7 @@ public class AMQPMessageTest {
@Test
public void testSetAnnotation() {
- AMQPMessage message = new AMQPMessage(0, encodedProtonMessage, null);
+ AMQPStandardMessage message = new AMQPStandardMessage(0, encodedProtonMessage, null);
final SimpleString newAnnotation = new SimpleString("testSetAnnotation");
final String newValue = "newValue";
@@ -1322,7 +1322,7 @@ public class AMQPMessageTest {
@Test
public void testGetProtonMessage() {
MessageImpl protonMessage = createProtonMessage();
- AMQPMessage message = new AMQPMessage(0, encodeMessage(protonMessage), null, null);
+ AMQPStandardMessage message = new AMQPStandardMessage(0, encodeMessage(protonMessage), null, null);
assertProtonMessageEquals(protonMessage, message.getProtonMessage());
@@ -1335,7 +1335,7 @@ public class AMQPMessageTest {
@Test
public void testGetHeader() {
MessageImpl protonMessage = createProtonMessage();
- AMQPMessage message = new AMQPMessage(0, encodeMessage(protonMessage), null, null);
+ AMQPStandardMessage message = new AMQPStandardMessage(0, encodeMessage(protonMessage), null, null);
Header decoded = message.getHeader();
assertNotSame(decoded, protonMessage.getHeader());
@@ -1353,7 +1353,7 @@ public class AMQPMessageTest {
@Test
public void testGetProperties() {
MessageImpl protonMessage = createProtonMessage();
- AMQPMessage message = new AMQPMessage(0, encodeMessage(protonMessage), null, null);
+ AMQPStandardMessage message = new AMQPStandardMessage(0, encodeMessage(protonMessage), null, null);
Properties decoded = message.getProperties();
assertNotSame(decoded, protonMessage.getProperties());
@@ -1375,7 +1375,7 @@ public class AMQPMessageTest {
deliveryAnnotations.getValue().put(Symbol.valueOf(UUID.randomUUID().toString()), "test-1");
protonMessage.setDeliveryAnnotations(deliveryAnnotations);
- AMQPMessage message = new AMQPMessage(0, encodeMessage(protonMessage), null, null);
+ AMQPStandardMessage message = new AMQPStandardMessage(0, encodeMessage(protonMessage), null, null);
DeliveryAnnotations decoded = message.getDeliveryAnnotations();
assertNotSame(decoded, protonMessage.getDeliveryAnnotations());
@@ -1391,7 +1391,7 @@ public class AMQPMessageTest {
@Test
public void testGetMessageAnnotations() {
MessageImpl protonMessage = createProtonMessage();
- AMQPMessage message = new AMQPMessage(0, encodeMessage(protonMessage), null, null);
+ AMQPStandardMessage message = new AMQPStandardMessage(0, encodeMessage(protonMessage), null, null);
MessageAnnotations decoded = message.getMessageAnnotations();
assertNotSame(decoded, protonMessage.getMessageAnnotations());
@@ -1407,7 +1407,7 @@ public class AMQPMessageTest {
@Test
public void testGetApplicationProperties() {
MessageImpl protonMessage = createProtonMessage();
- AMQPMessage message = new AMQPMessage(0, encodeMessage(protonMessage), null, null);
+ AMQPStandardMessage message = new AMQPStandardMessage(0, encodeMessage(protonMessage), null, null);
ApplicationProperties decoded = message.getApplicationProperties();
assertNotSame(decoded, protonMessage.getApplicationProperties());
@@ -1423,7 +1423,7 @@ public class AMQPMessageTest {
@Test
public void testGetBody() {
MessageImpl protonMessage = createProtonMessage();
- AMQPMessage message = new AMQPMessage(0, encodeMessage(protonMessage), null, null);
+ AMQPStandardMessage message = new AMQPStandardMessage(0, encodeMessage(protonMessage), null, null);
Object body = message.getBody();
assertTrue(body instanceof AmqpValue);
@@ -1442,7 +1442,7 @@ public class AMQPMessageTest {
footer.getValue().put(Symbol.valueOf(UUID.randomUUID().toString()), "test-1");
protonMessage.setFooter(footer);
- AMQPMessage message = new AMQPMessage(0, encodeMessage(protonMessage), null, null);
+ AMQPStandardMessage message = new AMQPStandardMessage(0, encodeMessage(protonMessage), null, null);
Footer decoded = message.getFooter();
assertNotSame(decoded, protonMessage.getFooter());
@@ -1460,7 +1460,7 @@ public class AMQPMessageTest {
@Test
public void testApplicationPropertiesReencodeAfterUpdate() {
MessageImpl protonMessage = createProtonMessage();
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertProtonMessageEquals(protonMessage, decoded.getProtonMessage());
@@ -1478,7 +1478,7 @@ public class AMQPMessageTest {
final SimpleString TEST_ANNOTATION = new SimpleString("testMessageAnnotationsReencodeAfterUpdate");
MessageImpl protonMessage = createProtonMessage();
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertProtonMessageEquals(protonMessage, decoded.getProtonMessage());
@@ -1499,7 +1499,7 @@ public class AMQPMessageTest {
byte[] value = RandomUtil.randomBytes();
SimpleString name = SimpleString.toSimpleString("myProperty");
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
assertNull(decoded.getExtraProperties());
assertNull(decoded.getExtraBytesProperty(name));
@@ -1518,7 +1518,7 @@ public class AMQPMessageTest {
byte[] original = RandomUtil.randomBytes();
SimpleString name = SimpleString.toSimpleString("myProperty");
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
decoded.setAddress("someAddress");
decoded.setMessageID(33);
decoded.putExtraBytesProperty(name, original);
@@ -1530,7 +1530,7 @@ public class AMQPMessageTest {
try {
decoded.getPersister().encode(buffer, decoded);
Assert.assertEquals(AMQPMessagePersisterV2.getInstance().getID(), buffer.readByte()); // the journal reader will read 1 byte to find the persister
- AMQPMessage readMessage = (AMQPMessage)decoded.getPersister().decode(buffer, null);
+ AMQPStandardMessage readMessage = (AMQPStandardMessage)decoded.getPersister().decode(buffer, null, null);
Assert.assertEquals(33, readMessage.getMessageID());
Assert.assertEquals("someAddress", readMessage.getAddress());
assertArrayEquals(original, readMessage.getExtraBytesProperty(name));
@@ -1540,7 +1540,7 @@ public class AMQPMessageTest {
{
ICoreMessage embeddedMessage = EmbedMessageUtil.embedAsCoreMessage(decoded);
- AMQPMessage readMessage = (AMQPMessage) EmbedMessageUtil.extractEmbedded(embeddedMessage);
+ AMQPStandardMessage readMessage = (AMQPStandardMessage) EmbedMessageUtil.extractEmbedded(embeddedMessage, null);
Assert.assertEquals(33, readMessage.getMessageID());
Assert.assertEquals("someAddress", readMessage.getAddress());
assertArrayEquals(original, readMessage.getExtraBytesProperty(name));
@@ -1578,9 +1578,9 @@ public class AMQPMessageTest {
ReadableBuffer readable = new NettyReadable(encodedBytes);
- AMQPMessage message = null;
+ AMQPStandardMessage message = null;
try {
- message = new AMQPMessage(0, readable, null, null);
+ message = new AMQPStandardMessage(0, readable, null, null);
} catch (Exception decodeError) {
fail("Should not have encountered an exception on partial decode: " + decodeError.getMessage());
}
@@ -1619,9 +1619,9 @@ public class AMQPMessageTest {
ReadableBuffer readable = new NettyReadable(encodedBytes);
- AMQPMessage message = null;
+ AMQPStandardMessage message = null;
try {
- message = new AMQPMessage(0, readable, null, null);
+ message = new AMQPStandardMessage(0, readable, null, null);
} catch (Exception decodeError) {
fail("Should not have encountered an exception on partial decode: " + decodeError.getMessage());
}
@@ -1659,9 +1659,9 @@ public class AMQPMessageTest {
ReadableBuffer readable = new NettyReadable(encodedBytes);
- AMQPMessage message = null;
+ AMQPStandardMessage message = null;
try {
- message = new AMQPMessage(0, readable, null, null);
+ message = new AMQPStandardMessage(0, readable, null, null);
} catch (Exception decodeError) {
fail("Should not have encountered an exception on partial decode: " + decodeError.getMessage());
}
@@ -1681,9 +1681,9 @@ public class AMQPMessageTest {
@Test
public void testCopyMessage() {
- AMQPMessage message = new AMQPMessage(0, encodedProtonMessage, null, null);
+ AMQPStandardMessage message = new AMQPStandardMessage(0, encodedProtonMessage, null, null);
message.setMessageID(127);
- AMQPMessage copy = (AMQPMessage) message.copy();
+ AMQPStandardMessage copy = (AMQPStandardMessage) message.copy();
assertEquals(message.getMessageID(), copy.getMessageID());
assertProtonMessageEquals(message.getProtonMessage(), copy.getProtonMessage());
@@ -1691,9 +1691,9 @@ public class AMQPMessageTest {
@Test
public void testCopyMessageWithNewArtemisMessageID() {
- AMQPMessage message = new AMQPMessage(0, encodedProtonMessage, null, null);
+ AMQPStandardMessage message = new AMQPStandardMessage(0, encodedProtonMessage, null, null);
message.setMessageID(127);
- AMQPMessage copy = (AMQPMessage) message.copy(255);
+ AMQPStandardMessage copy = (AMQPStandardMessage) message.copy(255);
assertNotEquals(message.getMessageID(), copy.getMessageID());
assertProtonMessageEquals(message.getProtonMessage(), copy.getProtonMessage());
@@ -1706,9 +1706,9 @@ public class AMQPMessageTest {
deliveryAnnotations.getValue().put(Symbol.valueOf("testCopyMessageRemovesMessageAnnotations"), "1");
protonMessage.setDeliveryAnnotations(deliveryAnnotations);
- AMQPMessage message = new AMQPMessage(0, encodeMessage(protonMessage), null, null);
+ AMQPStandardMessage message = new AMQPStandardMessage(0, encodeMessage(protonMessage), null, null);
message.setMessageID(127);
- AMQPMessage copy = (AMQPMessage) message.copy();
+ AMQPStandardMessage copy = (AMQPStandardMessage) message.copy();
assertEquals(message.getMessageID(), copy.getMessageID());
assertProtonMessageEquals(message.getProtonMessage(), copy.getProtonMessage());
@@ -1717,14 +1717,14 @@ public class AMQPMessageTest {
@Test
public void testDecodeCopyUpdateReencodeAndThenDecodeAgain() {
- AMQPMessage message = new AMQPMessage(0, encodedProtonMessage, null, null);
+ AMQPStandardMessage message = new AMQPStandardMessage(0, encodedProtonMessage, null, null);
// Sanity checks
assertTrue(message.isDurable());
assertEquals(TEST_STRING_BODY, ((AmqpValue) message.getBody()).getValue());
// Copy the message
- message = (AMQPMessage) message.copy();
+ message = (AMQPStandardMessage) message.copy();
// Sanity checks
assertTrue(message.isDurable());
@@ -1748,13 +1748,13 @@ public class AMQPMessageTest {
@Test
public void testSendBuffer() {
ByteBuf buffer = Unpooled.buffer(255);
- AMQPMessage message = new AMQPMessage(0, encodedProtonMessage, null, null);
+ AMQPStandardMessage message = new AMQPStandardMessage(0, encodedProtonMessage, null, null);
message.sendBuffer(buffer, 1);
assertNotNull(buffer);
- AMQPMessage copy = new AMQPMessage(0, new NettyReadable(buffer), null, null);
+ AMQPStandardMessage copy = new AMQPStandardMessage(0, new NettyReadable(buffer), null, null);
assertProtonMessageEquals(message.getProtonMessage(), copy.getProtonMessage());
}
@@ -1763,7 +1763,7 @@ public class AMQPMessageTest {
@Test
public void testGetSendBuffer() {
- AMQPMessage message = new AMQPMessage(0, encodedProtonMessage, null, null);
+ AMQPStandardMessage message = new AMQPStandardMessage(0, encodedProtonMessage, null, null);
ReadableBuffer buffer = message.getSendBuffer(1);
assertNotNull(buffer);
@@ -1771,20 +1771,20 @@ public class AMQPMessageTest {
assertTrue(Arrays.equals(encodedProtonMessage, buffer.array()));
- AMQPMessage copy = new AMQPMessage(0, buffer, null, null);
+ AMQPStandardMessage copy = new AMQPStandardMessage(0, buffer, null, null);
assertProtonMessageEquals(message.getProtonMessage(), copy.getProtonMessage());
}
@Test
public void testGetSendBufferAddsDeliveryCountOnlyToSendMessage() {
- AMQPMessage message = new AMQPMessage(0, encodedProtonMessage, null, null);
+ AMQPStandardMessage message = new AMQPStandardMessage(0, encodedProtonMessage, null, null);
ReadableBuffer buffer = message.getSendBuffer(7);
assertNotNull(buffer);
message.reencode(); // Ensures Header is current if accidentally updated
- AMQPMessage copy = new AMQPMessage(0, buffer, null, null);
+ AMQPStandardMessage copy = new AMQPStandardMessage(0, buffer, null, null);
MessageImpl originalsProtonMessage = message.getProtonMessage();
MessageImpl copyProtonMessage = copy.getProtonMessage();
@@ -1797,13 +1797,13 @@ public class AMQPMessageTest {
@Test
public void testGetSendBufferAddsDeliveryCountOnlyToSendMessageOriginalHadNoHeader() {
MessageImpl protonMessage = (MessageImpl) Proton.message();
- AMQPMessage message = new AMQPMessage(0, encodeMessage(protonMessage), null, null);
+ AMQPStandardMessage message = new AMQPStandardMessage(0, encodeMessage(protonMessage), null, null);
ReadableBuffer buffer = message.getSendBuffer(7);
assertNotNull(buffer);
message.reencode(); // Ensures Header is current if accidentally updated
- AMQPMessage copy = new AMQPMessage(0, buffer, null, null);
+ AMQPStandardMessage copy = new AMQPStandardMessage(0, buffer, null, null);
MessageImpl originalsProtonMessage = message.getProtonMessage();
MessageImpl copyProtonMessage = copy.getProtonMessage();
@@ -1819,12 +1819,12 @@ public class AMQPMessageTest {
DeliveryAnnotations deliveryAnnotations = new DeliveryAnnotations(new HashMap<>());
deliveryAnnotations.getValue().put(Symbol.valueOf("testGetSendBufferRemoveDeliveryAnnotations"), "X");
protonMessage.setDeliveryAnnotations(deliveryAnnotations);
- AMQPMessage message = new AMQPMessage(0, encodeMessage(protonMessage), null, null);
+ AMQPStandardMessage message = new AMQPStandardMessage(0, encodeMessage(protonMessage), null, null);
ReadableBuffer buffer = message.getSendBuffer(1);
assertNotNull(buffer);
- AMQPMessage copy = new AMQPMessage(0, buffer, null, null);
+ AMQPStandardMessage copy = new AMQPStandardMessage(0, buffer, null, null);
MessageImpl copyProtonMessage = copy.getProtonMessage();
assertProtonMessageNotEquals(message.getProtonMessage(), copyProtonMessage);
@@ -1837,13 +1837,13 @@ public class AMQPMessageTest {
DeliveryAnnotations deliveryAnnotations = new DeliveryAnnotations(new HashMap<>());
deliveryAnnotations.getValue().put(Symbol.valueOf("testGetSendBufferRemoveDeliveryAnnotations"), "X");
protonMessage.setDeliveryAnnotations(deliveryAnnotations);
- AMQPMessage message = new AMQPMessage(0, encodeMessage(protonMessage), null, null);
+ AMQPStandardMessage message = new AMQPStandardMessage(0, encodeMessage(protonMessage), null, null);
ReadableBuffer buffer = message.getSendBuffer(7);
assertNotNull(buffer);
message.reencode(); // Ensures Header is current if accidentally updated
- AMQPMessage copy = new AMQPMessage(0, buffer, null, null);
+ AMQPStandardMessage copy = new AMQPStandardMessage(0, buffer, null, null);
MessageImpl originalsProtonMessage = message.getProtonMessage();
MessageImpl copyProtonMessage = copy.getProtonMessage();
@@ -1976,7 +1976,7 @@ public class AMQPMessageTest {
protonMessage.setFooter(foot);
}
- AMQPMessage message = new AMQPMessage(0, encodeMessage(protonMessage), null, null);
+ AMQPStandardMessage message = new AMQPStandardMessage(0, encodeMessage(protonMessage), null, null);
message.reencode();
@@ -2004,18 +2004,18 @@ public class AMQPMessageTest {
deliveryAnnotations.getValue().put(Symbol.getSymbol(annotationKey), annotationValue);
protonMessage.setDeliveryAnnotations(deliveryAnnotations);
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
ReadableBuffer sendBuffer = decoded.getSendBuffer(1);
assertEquals(decoded.getEncodeSize(), sendBuffer.capacity());
- AMQPMessage msgFromSendBuffer = new AMQPMessage(0, sendBuffer, null, null);
+ AMQPStandardMessage msgFromSendBuffer = new AMQPStandardMessage(0, sendBuffer, null, null);
assertEquals("someNiceLocal", msgFromSendBuffer.getAddress());
assertNull(msgFromSendBuffer.getDeliveryAnnotations());
// again with higher deliveryCount
ReadableBuffer sendBuffer2 = decoded.getSendBuffer(5);
assertEquals(decoded.getEncodeSize(), sendBuffer2.capacity());
- AMQPMessage msgFromSendBuffer2 = new AMQPMessage(0, sendBuffer2, null, null);
+ AMQPStandardMessage msgFromSendBuffer2 = new AMQPStandardMessage(0, sendBuffer2, null, null);
assertEquals("someNiceLocal", msgFromSendBuffer2.getAddress());
assertNull(msgFromSendBuffer2.getDeliveryAnnotations());
}
@@ -2031,7 +2031,7 @@ public class AMQPMessageTest {
protonMessage.setProperties(properties);
protonMessage.setBody(new AmqpValue("Sample payload"));
- AMQPMessage decoded = encodeAndDecodeMessage(protonMessage);
+ AMQPStandardMessage decoded = encodeAndDecodeMessage(protonMessage);
DeliveryAnnotations newDeliveryAnnotations = new DeliveryAnnotations(new HashMap<>());
final String annotationKey = "annotationKey";
@@ -2041,7 +2041,7 @@ public class AMQPMessageTest {
ReadableBuffer sendBuffer = decoded.getSendBuffer(1);
assertEquals(decoded.getEncodeSize(), sendBuffer.capacity());
- AMQPMessage msgFromSendBuffer = new AMQPMessage(0, sendBuffer, null, null);
+ AMQPStandardMessage msgFromSendBuffer = new AMQPStandardMessage(0, sendBuffer, null, null);
assertEquals("someNiceLocal", msgFromSendBuffer.getAddress());
assertNotNull(msgFromSendBuffer.getDeliveryAnnotations());
assertEquals(1, msgFromSendBuffer.getDeliveryAnnotations().getValue().size());
@@ -2056,7 +2056,7 @@ public class AMQPMessageTest {
ReadableBuffer sendBuffer2 = decoded.getSendBuffer(5);
assertEquals(decoded.getEncodeSize(), sendBuffer2.capacity());
- AMQPMessage msgFromSendBuffer2 = new AMQPMessage(0, sendBuffer2, null, null);
+ AMQPStandardMessage msgFromSendBuffer2 = new AMQPStandardMessage(0, sendBuffer2, null, null);
assertEquals("someNiceLocal", msgFromSendBuffer2.getAddress());
assertNotNull(msgFromSendBuffer2.getDeliveryAnnotations());
assertEquals(1, msgFromSendBuffer2.getDeliveryAnnotations().getValue().size());
@@ -2426,13 +2426,13 @@ public class AMQPMessageTest {
return bytes;
}
- private AMQPMessage encodeAndDecodeMessage(MessageImpl message) {
+ private AMQPStandardMessage encodeAndDecodeMessage(MessageImpl message) {
ByteBuf nettyBuffer = Unpooled.buffer(1500);
message.encode(new NettyWritable(nettyBuffer));
byte[] bytes = new byte[nettyBuffer.writerIndex()];
nettyBuffer.readBytes(bytes);
- return new AMQPMessage(0, bytes, null);
+ return new AMQPStandardMessage(0, bytes, null);
}
}
diff --git a/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/TestConversions.java b/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/TestConversions.java
index 472e9d94bb..cda1b3f578 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/TestConversions.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/TestConversions.java
@@ -30,6 +30,7 @@ import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.buffers.impl.ResetLimitWrappedActiveMQBuffer;
import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessage;
+import org.apache.activemq.artemis.protocol.amqp.broker.AMQPStandardMessage;
import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSBytesMessage;
import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSMapMessage;
import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSMessage;
@@ -168,7 +169,7 @@ public class TestConversions extends Assert {
assertEquals(1, mapMessage.getInt("someint"));
assertEquals("value", mapMessage.getString("somestr"));
- AMQPMessage newAMQP = CoreAmqpConverter.fromCore(mapMessage.getInnerMessage());
+ AMQPMessage newAMQP = CoreAmqpConverter.fromCore(mapMessage.getInnerMessage(), null);
assertNotNull(newAMQP.getBody());
}
@@ -286,7 +287,7 @@ public class TestConversions extends Assert {
assertTrue(mapMessage.propertyExists(JMS_AMQP_ENCODED_MESSAGE_ANNOTATION_PREFIX + annotationName));
assertArrayEquals(encodedEmbeddedMap, (byte[]) mapMessage.getObjectProperty(JMS_AMQP_ENCODED_MESSAGE_ANNOTATION_PREFIX + annotationName));
- AMQPMessage newAMQP = CoreAmqpConverter.fromCore(mapMessage.getInnerMessage());
+ AMQPMessage newAMQP = CoreAmqpConverter.fromCore(mapMessage.getInnerMessage(), null);
assertNotNull(newAMQP.getBody());
assertNotNull(newAMQP.getMessageAnnotations());
assertNotNull(newAMQP.getMessageAnnotations().getValue());
@@ -338,7 +339,7 @@ public class TestConversions extends Assert {
assertTrue(mapMessage.propertyExists(JMS_AMQP_ENCODED_FOOTER_PREFIX + footerName));
assertArrayEquals(encodedEmbeddedMap, (byte[]) mapMessage.getObjectProperty(JMS_AMQP_ENCODED_FOOTER_PREFIX + footerName));
- AMQPMessage newAMQP = CoreAmqpConverter.fromCore(mapMessage.getInnerMessage());
+ AMQPMessage newAMQP = CoreAmqpConverter.fromCore(mapMessage.getInnerMessage(), null);
assertNotNull(newAMQP.getBody());
assertNotNull(newAMQP.getFooter());
assertNotNull(newAMQP.getFooter().getValue());
@@ -368,7 +369,7 @@ public class TestConversions extends Assert {
serverMessage.setObjectProperty(JMS_AMQP_ENCODED_DELIVERY_ANNOTATION_PREFIX + annotationName, encodedEmbeddedMap);
serverMessage.encode();
- AMQPMessage newAMQP = CoreAmqpConverter.fromCore(serverMessage.getInnerMessage());
+ AMQPMessage newAMQP = CoreAmqpConverter.fromCore(serverMessage.getInnerMessage(), null);
assertNull(newAMQP.getBody());
assertNotNull(newAMQP.getDeliveryAnnotations());
assertNotNull(newAMQP.getDeliveryAnnotations().getValue());
@@ -520,7 +521,7 @@ public class TestConversions extends Assert {
NettyReadable readable = new NettyReadable(encoded.getByteBuf());
- return new AMQPMessage(AMQPMessage.DEFAULT_MESSAGE_FORMAT, readable, null, null);
+ return new AMQPStandardMessage(AMQPMessage.DEFAULT_MESSAGE_FORMAT, readable, null, null);
}
private ServerJMSMessage createMessage() {
diff --git a/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/JMSMappingInboundTransformerTest.java b/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/JMSMappingInboundTransformerTest.java
index d7cd714f46..0b8ac8d334 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/JMSMappingInboundTransformerTest.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/JMSMappingInboundTransformerTest.java
@@ -38,6 +38,7 @@ import javax.jms.Topic;
import org.apache.activemq.artemis.api.core.ICoreMessage;
import org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessage;
+import org.apache.activemq.artemis.protocol.amqp.broker.AMQPStandardMessage;
import org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport;
import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSBytesMessage;
import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSMapMessage;
@@ -80,7 +81,7 @@ public class JMSMappingInboundTransformerTest {
MessageImpl message = (MessageImpl) Message.Factory.create();
message.setContentType(AMQPMessageSupport.OCTET_STREAM_CONTENT_TYPE);
- AMQPMessage messageEncode = encodeAndCreateAMQPMessage(message);
+ AMQPStandardMessage messageEncode = encodeAndCreateAMQPMessage(message);
ICoreMessage coreMessage = messageEncode.toCore();
@@ -135,7 +136,7 @@ public class JMSMappingInboundTransformerTest {
message.setBody(new Data(binary));
message.setContentType(AMQPMessageSupport.OCTET_STREAM_CONTENT_TYPE);
- AMQPMessage amqp = encodeAndCreateAMQPMessage(message);
+ AMQPStandardMessage amqp = encodeAndCreateAMQPMessage(message);
javax.jms.Message jmsMessage = ServerJMSMessage.wrapCoreMessage(amqp.toCore());
assertNotNull("Message should not be null", jmsMessage);
@@ -570,12 +571,12 @@ public class JMSMappingInboundTransformerTest {
assertTrue("Expected TextMessage", jmsMessage instanceof TextMessage);
}
- private AMQPMessage encodeAndCreateAMQPMessage(MessageImpl message) {
+ private AMQPStandardMessage encodeAndCreateAMQPMessage(MessageImpl message) {
NettyWritable encoded = new NettyWritable(Unpooled.buffer(1024));
message.encode(encoded);
NettyReadable readable = new NettyReadable(encoded.getByteBuf());
- return new AMQPMessage(AMQPMessage.DEFAULT_MESSAGE_FORMAT, readable, null, null);
+ return new AMQPStandardMessage(AMQPMessage.DEFAULT_MESSAGE_FORMAT, readable, null, null);
}
}
diff --git a/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/JMSMappingOutboundTransformerTest.java b/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/JMSMappingOutboundTransformerTest.java
index 062e0ddab1..069996a7d3 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/JMSMappingOutboundTransformerTest.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/JMSMappingOutboundTransformerTest.java
@@ -84,7 +84,7 @@ public class JMSMappingOutboundTransformerTest {
ServerJMSMessage outbound = createMessage();
outbound.encode();
- AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage());
+ AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage(), null);
assertNull(amqp.getBody());
}
@@ -95,7 +95,7 @@ public class JMSMappingOutboundTransformerTest {
outbound.setShortProperty(JMS_AMQP_ORIGINAL_ENCODING, AMQP_NULL);
outbound.encode();
- AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage());
+ AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage(), null);
assertNull(amqp.getBody());
}
@@ -109,7 +109,7 @@ public class JMSMappingOutboundTransformerTest {
outbound.writeBytes(expectedPayload);
outbound.encode();
- AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage());
+ AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage(), null);
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof Data);
@@ -128,7 +128,7 @@ public class JMSMappingOutboundTransformerTest {
outbound.setShortProperty(JMS_AMQP_ORIGINAL_ENCODING, AMQP_VALUE_BINARY);
outbound.encode();
- AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage());
+ AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage(), null);
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof AmqpValue);
@@ -144,7 +144,7 @@ public class JMSMappingOutboundTransformerTest {
outbound.writeBytes(expectedPayload);
outbound.encode();
- AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage());
+ AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage(), null);
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof AmqpValue);
@@ -164,7 +164,7 @@ public class JMSMappingOutboundTransformerTest {
ServerJMSMapMessage outbound = createMapMessage();
outbound.encode();
- AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage());
+ AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage(), null);
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof AmqpValue);
@@ -179,7 +179,7 @@ public class JMSMappingOutboundTransformerTest {
outbound.setBytes("bytes", byteArray);
outbound.encode();
- AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage());
+ AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage(), null);
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof AmqpValue);
@@ -201,7 +201,7 @@ public class JMSMappingOutboundTransformerTest {
outbound.setBoolean("property-3", true);
outbound.encode();
- AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage());
+ AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage(), null);
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof AmqpValue);
@@ -223,7 +223,7 @@ public class JMSMappingOutboundTransformerTest {
outbound.writeString("test");
outbound.encode();
- AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage());
+ AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage(), null);
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof AmqpValue);
@@ -244,7 +244,7 @@ public class JMSMappingOutboundTransformerTest {
outbound.writeString("test");
outbound.encode();
- AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage());
+ AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage(), null);
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof AmqpValue);
@@ -265,7 +265,7 @@ public class JMSMappingOutboundTransformerTest {
outbound.writeString("test");
outbound.encode();
- AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage());
+ AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage(), null);
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof AmqpSequence);
@@ -284,7 +284,7 @@ public class JMSMappingOutboundTransformerTest {
ServerJMSObjectMessage outbound = createObjectMessage();
outbound.encode();
- AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage());
+ AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage(), null);
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof Data);
@@ -297,7 +297,7 @@ public class JMSMappingOutboundTransformerTest {
outbound.setShortProperty(JMS_AMQP_ORIGINAL_ENCODING, AMQP_UNKNOWN);
outbound.encode();
- AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage());
+ AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage(), null);
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof Data);
@@ -309,7 +309,7 @@ public class JMSMappingOutboundTransformerTest {
ServerJMSObjectMessage outbound = createObjectMessage(TEST_OBJECT_VALUE);
outbound.encode();
- AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage());
+ AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage(), null);
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof Data);
@@ -326,7 +326,7 @@ public class JMSMappingOutboundTransformerTest {
outbound.setShortProperty(JMS_AMQP_ORIGINAL_ENCODING, AMQP_UNKNOWN);
outbound.encode();
- AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage());
+ AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage(), null);
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof Data);
@@ -343,7 +343,7 @@ public class JMSMappingOutboundTransformerTest {
outbound.setShortProperty(JMS_AMQP_ORIGINAL_ENCODING, AMQP_VALUE_BINARY);
outbound.encode();
- AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage());
+ AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage(), null);
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof AmqpValue);
@@ -361,7 +361,7 @@ public class JMSMappingOutboundTransformerTest {
outbound.setShortProperty(JMS_AMQP_ORIGINAL_ENCODING, AMQP_VALUE_BINARY);
outbound.encode();
- AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage());
+ AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage(), null);
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof AmqpValue);
@@ -376,7 +376,7 @@ public class JMSMappingOutboundTransformerTest {
ServerJMSTextMessage outbound = createTextMessage();
outbound.encode();
- AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage());
+ AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage(), null);
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof AmqpValue);
@@ -389,7 +389,7 @@ public class JMSMappingOutboundTransformerTest {
ServerJMSTextMessage outbound = createTextMessage(contentString);
outbound.encode();
- AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage());
+ AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage(), null);
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof AmqpValue);
@@ -402,7 +402,7 @@ public class JMSMappingOutboundTransformerTest {
ServerJMSTextMessage outbound = createTextMessage(contentString);
outbound.encode();
- AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage());
+ AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage(), null);
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof AmqpValue);
@@ -415,7 +415,7 @@ public class JMSMappingOutboundTransformerTest {
ServerJMSTextMessage outbound = createTextMessage(contentString);
outbound.encode();
- AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage());
+ AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage(), null);
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof AmqpValue);
@@ -432,7 +432,7 @@ public class JMSMappingOutboundTransformerTest {
outbound.setShortProperty(JMS_AMQP_ORIGINAL_ENCODING, AMQP_DATA);
outbound.encode();
- AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage());
+ AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage(), null);
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof Data);
@@ -450,7 +450,7 @@ public class JMSMappingOutboundTransformerTest {
outbound.setShortProperty(JMS_AMQP_ORIGINAL_ENCODING, AMQP_DATA);
outbound.encode();
- AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage());
+ AMQPMessage amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage(), null);
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof Data);
@@ -478,7 +478,7 @@ public class JMSMappingOutboundTransformerTest {
textMessage.setText("myTextMessageContent");
textMessage.setJMSDestination(jmsDestination);
- AMQPMessage amqp = AMQPConverter.getInstance().fromCore(textMessage.getInnerMessage());
+ AMQPMessage amqp = AMQPConverter.getInstance().fromCore(textMessage.getInnerMessage(), null);
MessageAnnotations ma = amqp.getMessageAnnotations();
Map maMap = ma == null ? null : ma.getValue();
@@ -511,7 +511,7 @@ public class JMSMappingOutboundTransformerTest {
textMessage.setText("myTextMessageContent");
textMessage.setJMSReplyTo(jmsReplyTo);
- AMQPMessage amqp = AMQPConverter.getInstance().fromCore(textMessage.getInnerMessage());
+ AMQPMessage amqp = AMQPConverter.getInstance().fromCore(textMessage.getInnerMessage(), null);
MessageAnnotations ma = amqp.getMessageAnnotations();
Map maMap = ma == null ? null : ma.getValue();
diff --git a/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/JMSTransformationSpeedComparisonTest.java b/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/JMSTransformationSpeedComparisonTest.java
index a6f735d619..b92dfdcf29 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/JMSTransformationSpeedComparisonTest.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/JMSTransformationSpeedComparisonTest.java
@@ -23,6 +23,7 @@ import java.util.concurrent.TimeUnit;
import org.apache.activemq.artemis.api.core.ICoreMessage;
import org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessage;
+import org.apache.activemq.artemis.protocol.amqp.broker.AMQPStandardMessage;
import org.apache.activemq.artemis.protocol.amqp.converter.AMQPConverter;
import org.apache.activemq.artemis.protocol.amqp.util.NettyReadable;
import org.apache.activemq.artemis.protocol.amqp.util.NettyWritable;
@@ -62,12 +63,12 @@ public class JMSTransformationSpeedComparisonTest {
public void testBodyOnlyMessage() throws Exception {
MessageImpl message = (MessageImpl) Proton.message();
message.setBody(new AmqpValue("String payload for AMQP message conversion performance testing."));
- AMQPMessage encoded = encodeAndCreateAMQPMessage(message);
+ AMQPStandardMessage encoded = encodeAndCreateAMQPMessage(message);
// Warm up
for (int i = 0; i < WARM_CYCLES; ++i) {
ICoreMessage intermediate = encoded.toCore();
- encode(AMQPConverter.getInstance().fromCore(intermediate));
+ encode(AMQPConverter.getInstance().fromCore(intermediate,null));
}
long totalDuration = 0;
@@ -75,7 +76,7 @@ public class JMSTransformationSpeedComparisonTest {
long startTime = System.nanoTime();
for (int i = 0; i < PROFILE_CYCLES; ++i) {
ICoreMessage intermediate = encoded.toCore();
- encode(AMQPConverter.getInstance().fromCore(intermediate));
+ encode(AMQPConverter.getInstance().fromCore(intermediate,null));
}
totalDuration += System.nanoTime() - startTime;
@@ -92,12 +93,12 @@ public class JMSTransformationSpeedComparisonTest {
message.setContentType("text/plain");
message.setBody(new AmqpValue("String payload for AMQP message conversion performance testing."));
- AMQPMessage encoded = encodeAndCreateAMQPMessage(message);
+ AMQPStandardMessage encoded = encodeAndCreateAMQPMessage(message);
// Warm up
for (int i = 0; i < WARM_CYCLES; ++i) {
ICoreMessage intermediate = encoded.toCore();
- encode(AMQPConverter.getInstance().fromCore(intermediate));
+ encode(AMQPConverter.getInstance().fromCore(intermediate,null));
}
long totalDuration = 0;
@@ -105,7 +106,7 @@ public class JMSTransformationSpeedComparisonTest {
long startTime = System.nanoTime();
for (int i = 0; i < PROFILE_CYCLES; ++i) {
ICoreMessage intermediate = encoded.toCore();
- encode(AMQPConverter.getInstance().fromCore(intermediate));
+ encode(AMQPConverter.getInstance().fromCore(intermediate,null));
}
totalDuration += System.nanoTime() - startTime;
@@ -114,12 +115,12 @@ public class JMSTransformationSpeedComparisonTest {
@Test
public void testTypicalQpidJMSMessage() throws Exception {
- AMQPMessage encoded = encodeAndCreateAMQPMessage(createTypicalQpidJMSMessage());
+ AMQPStandardMessage encoded = encodeAndCreateAMQPMessage(createTypicalQpidJMSMessage());
// Warm up
for (int i = 0; i < WARM_CYCLES; ++i) {
ICoreMessage intermediate = encoded.toCore();
- encode(AMQPConverter.getInstance().fromCore(intermediate));
+ encode(AMQPConverter.getInstance().fromCore(intermediate,null));
}
long totalDuration = 0;
@@ -127,7 +128,7 @@ public class JMSTransformationSpeedComparisonTest {
long startTime = System.nanoTime();
for (int i = 0; i < PROFILE_CYCLES; ++i) {
ICoreMessage intermediate = encoded.toCore();
- encode(AMQPConverter.getInstance().fromCore(intermediate));
+ encode(AMQPConverter.getInstance().fromCore(intermediate,null));
}
totalDuration += System.nanoTime() - startTime;
@@ -137,12 +138,12 @@ public class JMSTransformationSpeedComparisonTest {
@Test
public void testComplexQpidJMSMessage() throws Exception {
- AMQPMessage encoded = encodeAndCreateAMQPMessage(createComplexQpidJMSMessage());
+ AMQPStandardMessage encoded = encodeAndCreateAMQPMessage(createComplexQpidJMSMessage());
// Warm up
for (int i = 0; i < WARM_CYCLES; ++i) {
ICoreMessage intermediate = encoded.toCore();
- encode(AMQPConverter.getInstance().fromCore(intermediate));
+ encode(AMQPConverter.getInstance().fromCore(intermediate,null));
}
long totalDuration = 0;
@@ -150,7 +151,7 @@ public class JMSTransformationSpeedComparisonTest {
long startTime = System.nanoTime();
for (int i = 0; i < PROFILE_CYCLES; ++i) {
ICoreMessage intermediate = encoded.toCore();
- encode(AMQPConverter.getInstance().fromCore(intermediate));
+ encode(AMQPConverter.getInstance().fromCore(intermediate,null));
}
totalDuration += System.nanoTime() - startTime;
@@ -160,12 +161,12 @@ public class JMSTransformationSpeedComparisonTest {
@Test
public void testTypicalQpidJMSMessageInBoundOnly() throws Exception {
- AMQPMessage encoded = encodeAndCreateAMQPMessage(createTypicalQpidJMSMessage());
+ AMQPStandardMessage encoded = encodeAndCreateAMQPMessage(createTypicalQpidJMSMessage());
// Warm up
for (int i = 0; i < WARM_CYCLES; ++i) {
ICoreMessage intermediate = encoded.toCore();
- encode(AMQPConverter.getInstance().fromCore(intermediate));
+ encode(AMQPConverter.getInstance().fromCore(intermediate,null));
}
long totalDuration = 0;
@@ -173,7 +174,7 @@ public class JMSTransformationSpeedComparisonTest {
long startTime = System.nanoTime();
for (int i = 0; i < PROFILE_CYCLES; ++i) {
ICoreMessage intermediate = encoded.toCore();
- encode(AMQPConverter.getInstance().fromCore(intermediate));
+ encode(AMQPConverter.getInstance().fromCore(intermediate,null));
}
totalDuration += System.nanoTime() - startTime;
@@ -183,12 +184,12 @@ public class JMSTransformationSpeedComparisonTest {
@Test
public void testTypicalQpidJMSMessageOutBoundOnly() throws Exception {
- AMQPMessage encoded = encodeAndCreateAMQPMessage(createTypicalQpidJMSMessage());
+ AMQPStandardMessage encoded = encodeAndCreateAMQPMessage(createTypicalQpidJMSMessage());
// Warm up
for (int i = 0; i < WARM_CYCLES; ++i) {
ICoreMessage intermediate = encoded.toCore();
- encode(AMQPConverter.getInstance().fromCore(intermediate));
+ encode(AMQPConverter.getInstance().fromCore(intermediate,null));
}
long totalDuration = 0;
@@ -196,7 +197,7 @@ public class JMSTransformationSpeedComparisonTest {
long startTime = System.nanoTime();
for (int i = 0; i < PROFILE_CYCLES; ++i) {
ICoreMessage intermediate = encoded.toCore();
- encode(AMQPConverter.getInstance().fromCore(intermediate));
+ encode(AMQPConverter.getInstance().fromCore(intermediate,null));
}
totalDuration += System.nanoTime() - startTime;
@@ -272,13 +273,13 @@ public class JMSTransformationSpeedComparisonTest {
return message;
}
- private AMQPMessage encodeAndCreateAMQPMessage(MessageImpl message) {
+ private AMQPStandardMessage encodeAndCreateAMQPMessage(MessageImpl message) {
NettyWritable encoded = new NettyWritable(Unpooled.buffer(1024));
message.encode(encoded);
NettyReadable readable = new NettyReadable(encoded.getByteBuf());
- return new AMQPMessage(AMQPMessage.DEFAULT_MESSAGE_FORMAT, readable, null, null);
+ return new AMQPStandardMessage(AMQPMessage.DEFAULT_MESSAGE_FORMAT, readable, null, null);
}
private void encode(AMQPMessage target) {
diff --git a/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/MessageTransformationTest.java b/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/MessageTransformationTest.java
index 9d171aa187..c4c527ea03 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/MessageTransformationTest.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/MessageTransformationTest.java
@@ -27,6 +27,7 @@ import java.util.Map;
import org.apache.activemq.artemis.api.core.ICoreMessage;
import org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessage;
+import org.apache.activemq.artemis.protocol.amqp.broker.AMQPStandardMessage;
import org.apache.activemq.artemis.protocol.amqp.converter.AMQPConverter;
import org.apache.activemq.artemis.protocol.amqp.util.NettyReadable;
import org.apache.activemq.artemis.protocol.amqp.util.NettyWritable;
@@ -58,7 +59,7 @@ public class MessageTransformationTest {
incomingMessage.setBody(new AmqpValue("String payload for AMQP message conversion performance testing."));
ICoreMessage core = encodeAndCreateAMQPMessage(incomingMessage).toCore();
- AMQPMessage outboudMessage = AMQPConverter.getInstance().fromCore(core);
+ AMQPMessage outboudMessage = AMQPConverter.getInstance().fromCore(core, null);
assertNull(outboudMessage.getHeader());
@@ -76,7 +77,7 @@ public class MessageTransformationTest {
incomingMessage.setMessageId("ID:SomeQualifier:0:0:1");
ICoreMessage core = encodeAndCreateAMQPMessage(incomingMessage).toCore();
- AMQPMessage outboudMessage = AMQPConverter.getInstance().fromCore(core);
+ AMQPMessage outboudMessage = AMQPConverter.getInstance().fromCore(core, null);
assertNull(outboudMessage.getHeader());
assertNotNull(outboudMessage.getProperties());
@@ -90,7 +91,7 @@ public class MessageTransformationTest {
incomingMessage.setDurable(true);
ICoreMessage core = encodeAndCreateAMQPMessage(incomingMessage).toCore();
- AMQPMessage outboudMessage = AMQPConverter.getInstance().fromCore(core);
+ AMQPMessage outboudMessage = AMQPConverter.getInstance().fromCore(core, null);
assertNotNull(outboudMessage.getHeader());
@@ -145,7 +146,7 @@ public class MessageTransformationTest {
message.setBody(new AmqpValue("String payload for AMQP message conversion performance testing."));
ICoreMessage core = encodeAndCreateAMQPMessage(message).toCore();
- AMQPMessage outboudMessage = AMQPConverter.getInstance().fromCore(core);
+ AMQPMessage outboudMessage = AMQPConverter.getInstance().fromCore(core, null);
assertEquals(10, outboudMessage.getApplicationProperties().getValue().size());
assertEquals(4, outboudMessage.getMessageAnnotations().getValue().size());
@@ -157,6 +158,6 @@ public class MessageTransformationTest {
NettyReadable readable = new NettyReadable(encoded.getByteBuf());
- return new AMQPMessage(AMQPMessage.DEFAULT_MESSAGE_FORMAT, readable, null, null);
+ return new AMQPStandardMessage(AMQPMessage.DEFAULT_MESSAGE_FORMAT, readable, null, null);
}
}
diff --git a/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/proton/ProtonServerReceiverContextTest.java b/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/proton/ProtonServerReceiverContextTest.java
index 571ca92bc0..62858c8e1c 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/proton/ProtonServerReceiverContextTest.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/proton/ProtonServerReceiverContextTest.java
@@ -19,7 +19,6 @@ package org.apache.activemq.artemis.protocol.amqp.proton;
import static java.util.Arrays.asList;
import static java.util.Collections.singletonList;
import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.nullable;
import static org.mockito.Mockito.doAnswer;
@@ -37,6 +36,7 @@ import org.apache.activemq.artemis.api.core.ActiveMQException;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.server.RoutingContext;
import org.apache.activemq.artemis.core.transaction.Transaction;
+import org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessage;
import org.apache.activemq.artemis.protocol.amqp.broker.AMQPSessionCallback;
import org.apache.activemq.artemis.protocol.amqp.broker.ProtonProtocolManager;
import org.apache.activemq.artemis.protocol.amqp.exceptions.ActiveMQAMQPException;
@@ -48,7 +48,6 @@ import org.apache.qpid.proton.amqp.messaging.Outcome;
import org.apache.qpid.proton.amqp.messaging.Rejected;
import org.apache.qpid.proton.amqp.messaging.Source;
import org.apache.qpid.proton.amqp.transport.DeliveryState;
-import org.apache.qpid.proton.codec.ReadableBuffer;
import org.apache.qpid.proton.engine.Delivery;
import org.apache.qpid.proton.engine.Receiver;
import org.junit.Test;
@@ -68,40 +67,24 @@ public class ProtonServerReceiverContextTest {
@Test
public void addressFull_SourceSupportsModified() throws Exception {
- doOnMessageWithDeliveryException(asList(Rejected.DESCRIPTOR_SYMBOL,
- Accepted.DESCRIPTOR_SYMBOL,
- Modified.DESCRIPTOR_SYMBOL),
- null, new ActiveMQAddressFullException(),
- Modified.class);
+ doOnMessageWithDeliveryException(asList(Rejected.DESCRIPTOR_SYMBOL, Accepted.DESCRIPTOR_SYMBOL, Modified.DESCRIPTOR_SYMBOL), null, new ActiveMQAddressFullException(), Modified.class);
}
@Test
public void addressFull_SourceDoesNotSupportModified() throws Exception {
- doOnMessageWithDeliveryException(asList(Rejected.DESCRIPTOR_SYMBOL,
- Accepted.DESCRIPTOR_SYMBOL),
- null, new ActiveMQAddressFullException(),
- Rejected.class);
+ doOnMessageWithDeliveryException(asList(Rejected.DESCRIPTOR_SYMBOL, Accepted.DESCRIPTOR_SYMBOL), null, new ActiveMQAddressFullException(), Rejected.class);
}
@Test
public void otherFailure_SourceSupportsRejects() throws Exception {
- doOnMessageWithDeliveryException(asList(Rejected.DESCRIPTOR_SYMBOL,
- Accepted.DESCRIPTOR_SYMBOL,
- Modified.DESCRIPTOR_SYMBOL),
- null, new ActiveMQException(),
- Rejected.class);
+ doOnMessageWithDeliveryException(asList(Rejected.DESCRIPTOR_SYMBOL, Accepted.DESCRIPTOR_SYMBOL, Modified.DESCRIPTOR_SYMBOL), null, new ActiveMQException(), Rejected.class);
}
@Test
public void otherFailure_SourceDoesNotSupportReject() throws Exception {
- doOnMessageWithDeliveryException(singletonList(Accepted.DESCRIPTOR_SYMBOL),
- Accepted.getInstance(), new ActiveMQException(),
- Accepted.class);
+ doOnMessageWithDeliveryException(singletonList(Accepted.DESCRIPTOR_SYMBOL), Accepted.getInstance(), new ActiveMQException(), Accepted.class);
// violates AMQP specification - see explanation ProtonServerReceiverContext.determineDeliveryState
- doOnMessageWithDeliveryException(singletonList(Accepted.DESCRIPTOR_SYMBOL),
- null,
- new ActiveMQException(),
- Rejected.class);
+ doOnMessageWithDeliveryException(singletonList(Accepted.DESCRIPTOR_SYMBOL), null, new ActiveMQException(), Rejected.class);
}
private void doOnMessageWithAbortedDeliveryTestImpl(boolean drain) throws ActiveMQAMQPException {
@@ -140,7 +123,8 @@ public class ProtonServerReceiverContextTest {
}
private void doOnMessageWithDeliveryException(List sourceSymbols,
- Outcome defaultOutcome, Exception deliveryException,
+ Outcome defaultOutcome,
+ Exception deliveryException,
Class extends DeliveryState> expectedDeliveryState) throws Exception {
AMQPConnectionContext mockConnContext = mock(AMQPConnectionContext.class);
doAnswer((Answer) invocation -> {
@@ -152,7 +136,6 @@ public class ProtonServerReceiverContextTest {
when(mockProtocolManager.isUseModifiedForTransientDeliveryErrors()).thenReturn(true);
when(mockConnContext.getProtocolManager()).thenReturn(mockProtocolManager);
-
AMQPSessionCallback mockSession = mock(AMQPSessionCallback.class);
Receiver mockReceiver = mock(Receiver.class);
@@ -167,15 +150,7 @@ public class ProtonServerReceiverContextTest {
source.setDefaultOutcome(defaultOutcome);
when(mockReceiver.getSource()).thenReturn(source);
- doThrow(deliveryException).when(mockSession)
- .serverSend(eq(rc),
- nullable(Transaction.class),
- eq(mockReceiver),
- eq(mockDelivery),
- nullable(SimpleString.class),
- anyInt(),
- nullable(ReadableBuffer.class),
- any(RoutingContext.class));
+ doThrow(deliveryException).when(mockSession).serverSend(eq(rc), nullable(Transaction.class), eq(mockReceiver), eq(mockDelivery), nullable(SimpleString.class), any(RoutingContext.class), nullable(AMQPMessage.class));
rc.onMessage(mockDelivery);
diff --git a/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTSession.java b/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTSession.java
index 1da256be31..b74622ed59 100644
--- a/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTSession.java
+++ b/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTSession.java
@@ -20,7 +20,7 @@ package org.apache.activemq.artemis.core.protocol.mqtt;
import java.util.UUID;
import org.apache.activemq.artemis.core.config.WildcardConfiguration;
-import org.apache.activemq.artemis.core.message.impl.CoreMessageObjectPools;
+import org.apache.activemq.artemis.core.persistence.CoreMessageObjectPools;
import org.apache.activemq.artemis.core.server.ActiveMQServer;
import org.apache.activemq.artemis.core.server.impl.ServerSessionImpl;
import org.apache.activemq.artemis.spi.core.protocol.SessionCallback;
diff --git a/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireMessageConverter.java b/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireMessageConverter.java
index 63082d916d..cfc4aa64ae 100644
--- a/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireMessageConverter.java
+++ b/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireMessageConverter.java
@@ -42,7 +42,7 @@ import org.apache.activemq.artemis.api.core.ActiveMQPropertyConversionException;
import org.apache.activemq.artemis.api.core.ICoreMessage;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.message.impl.CoreMessage;
-import org.apache.activemq.artemis.core.message.impl.CoreMessageObjectPools;
+import org.apache.activemq.artemis.core.persistence.CoreMessageObjectPools;
import org.apache.activemq.artemis.core.protocol.openwire.amq.AMQConsumer;
import org.apache.activemq.artemis.core.protocol.openwire.util.OpenWireUtil;
import org.apache.activemq.artemis.core.server.MessageReference;
diff --git a/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenwireMessage.java b/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenwireMessage.java
index 9644b706cc..0279b5bb7d 100644
--- a/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenwireMessage.java
+++ b/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenwireMessage.java
@@ -24,9 +24,8 @@ import org.apache.activemq.artemis.api.core.ActiveMQException;
import org.apache.activemq.artemis.api.core.ActiveMQPropertyConversionException;
import org.apache.activemq.artemis.api.core.ICoreMessage;
import org.apache.activemq.artemis.api.core.Message;
-import org.apache.activemq.artemis.api.core.RefCountMessageListener;
import org.apache.activemq.artemis.api.core.SimpleString;
-import org.apache.activemq.artemis.core.message.impl.CoreMessageObjectPools;
+import org.apache.activemq.artemis.core.persistence.CoreMessageObjectPools;
import org.apache.activemq.artemis.core.persistence.Persister;
import io.netty.buffer.ByteBuf;
@@ -69,21 +68,16 @@ public class OpenwireMessage implements Message {
return null;
}
- @Override
- public RefCountMessageListener getContext() {
- return null;
- }
-
- @Override
- public Message setContext(RefCountMessageListener context) {
- return null;
- }
-
@Override
public Message setBuffer(ByteBuf buffer) {
return null;
}
+ @Override
+ public int getDurableCount() {
+ return 0;
+ }
+
@Override
public ByteBuf getBuffer() {
return null;
@@ -140,7 +134,7 @@ public class OpenwireMessage implements Message {
}
@Override
- public Persister getPersister() {
+ public Persister getPersister() {
return null;
}
@@ -465,22 +459,22 @@ public class OpenwireMessage implements Message {
}
@Override
- public int incrementRefCount() throws Exception {
+ public int refUp() {
return 0;
}
@Override
- public int decrementRefCount() throws Exception {
+ public int refDown() {
return 0;
}
@Override
- public int incrementDurableRefCount() {
+ public int durableUp() {
return 0;
}
@Override
- public int decrementDurableRefCount() {
+ public int durableDown() {
return 0;
}
@@ -503,4 +497,19 @@ public class OpenwireMessage implements Message {
public long getPersistentSize() throws ActiveMQException {
return 0;
}
+
+ @Override
+ public int getUsage() {
+ return 0;
+ }
+
+ @Override
+ public int usageUp() {
+ return 0;
+ }
+
+ @Override
+ public int usageDown() {
+ return 0;
+ }
}
diff --git a/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/amq/AMQSession.java b/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/amq/AMQSession.java
index b780563ff2..87a41eed10 100644
--- a/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/amq/AMQSession.java
+++ b/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/amq/AMQSession.java
@@ -32,7 +32,7 @@ import org.apache.activemq.artemis.api.core.ActiveMQQueueExistsException;
import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.io.IOCallback;
-import org.apache.activemq.artemis.core.message.impl.CoreMessageObjectPools;
+import org.apache.activemq.artemis.core.persistence.CoreMessageObjectPools;
import org.apache.activemq.artemis.core.paging.PagingStore;
import org.apache.activemq.artemis.core.protocol.openwire.OpenWireConnection;
import org.apache.activemq.artemis.core.protocol.openwire.OpenWireMessageConverter;
diff --git a/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/StompSession.java b/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/StompSession.java
index eec52b6e20..d7e2ddcc8b 100644
--- a/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/StompSession.java
+++ b/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/StompSession.java
@@ -363,11 +363,9 @@ public class StompSession implements SessionCallback {
largeMessage.releaseResources(true);
- largeMessage.putLongProperty(Message.HDR_LARGE_BODY_SIZE, bytes.length);
+ largeMessage.toMessage().putLongProperty(Message.HDR_LARGE_BODY_SIZE, bytes.length);
- session.send(largeMessage, direct);
-
- largeMessage = null;
+ session.send(largeMessage.toMessage(), direct);
}
}
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/cursor/impl/LivePageCacheImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/cursor/impl/LivePageCacheImpl.java
index 6c98c12835..6fb42c1a58 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/cursor/impl/LivePageCacheImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/cursor/impl/LivePageCacheImpl.java
@@ -19,7 +19,6 @@ package org.apache.activemq.artemis.core.paging.cursor.impl;
import org.apache.activemq.artemis.core.paging.PagedMessage;
import org.apache.activemq.artemis.core.paging.cursor.LivePageCache;
import org.apache.activemq.artemis.core.paging.cursor.PagePosition;
-import org.apache.activemq.artemis.core.server.LargeServerMessage;
import org.apache.activemq.artemis.utils.collections.ConcurrentAppendOnlyChunkedList;
import org.jboss.logging.Logger;
@@ -73,9 +72,7 @@ public final class LivePageCacheImpl implements LivePageCache {
@Override
public void addLiveMessage(PagedMessage message) {
- if (message.getMessage().isLargeMessage()) {
- ((LargeServerMessage) message.getMessage()).incrementDelayDeletionCount();
- }
+ message.getMessage().usageUp();
messages.add(message);
}
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/impl/Page.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/impl/Page.java
index a7a164dc16..bbaea46867 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/impl/Page.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/impl/Page.java
@@ -24,7 +24,6 @@ import java.util.concurrent.atomic.AtomicInteger;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
-import org.apache.activemq.artemis.api.core.ICoreMessage;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.buffers.impl.ChannelBufferWrapper;
import org.apache.activemq.artemis.core.io.SequentialFile;
@@ -35,7 +34,6 @@ import org.apache.activemq.artemis.core.paging.cursor.PageSubscriptionCounter;
import org.apache.activemq.artemis.core.persistence.StorageManager;
import org.apache.activemq.artemis.core.server.ActiveMQMessageBundle;
import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
-import org.apache.activemq.artemis.core.server.LargeServerMessage;
import org.apache.activemq.artemis.utils.DataConstants;
import org.apache.activemq.artemis.utils.Env;
import org.apache.activemq.artemis.utils.collections.ConcurrentHashSet;
@@ -494,14 +492,10 @@ public final class Page implements Comparable {
List largeMessageIds = new ArrayList<>();
if (messages != null) {
for (PagedMessage msg : messages) {
- if (msg.getMessage() instanceof ICoreMessage && (msg.getMessage()).isLargeMessage()) {
- LargeServerMessage lmsg = (LargeServerMessage) msg.getMessage();
-
- // Remember, cannot call delete directly here
- // Because the large-message may be linked to another message
- // or it may still being delivered even though it has been acked already
- lmsg.decrementDelayDeletionCount();
- largeMessageIds.add(lmsg.getMessageID());
+ // this will trigger large message delete
+ msg.getMessage().usageDown();
+ if ((msg.getMessage()).isLargeMessage()) {
+ largeMessageIds.add(msg.getMessage().getMessageID());
}
}
}
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/impl/PagedMessageImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/impl/PagedMessageImpl.java
index 3ef833d246..11eb2020d1 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/impl/PagedMessageImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/impl/PagedMessageImpl.java
@@ -74,10 +74,10 @@ public class PagedMessageImpl implements PagedMessage {
LargeServerMessage lgMessage = storage.createLargeMessage();
ActiveMQBuffer buffer = ActiveMQBuffers.wrappedBuffer(largeMessageLazyData);
- lgMessage = LargeMessagePersister.getInstance().decode(buffer, lgMessage);
- lgMessage.incrementDelayDeletionCount();
+ lgMessage = LargeMessagePersister.getInstance().decode(buffer, lgMessage, null);
+ lgMessage.toMessage().usageUp();
lgMessage.setPaged();
- this.message = lgMessage;
+ this.message = lgMessage.toMessage();
largeMessageLazyData = null;
}
}
@@ -107,12 +107,12 @@ public class PagedMessageImpl implements PagedMessage {
largeMessageLazyData = new byte[largeMessageHeaderSize];
buffer.readBytes(largeMessageLazyData);
} else {
- this.message = storageManager.createLargeMessage();
- LargeMessagePersister.getInstance().decode(buffer, (LargeServerMessage) message);
- ((LargeServerMessage) message).incrementDelayDeletionCount();
+ this.message = storageManager.createLargeMessage().toMessage();
+ LargeMessagePersister.getInstance().decode(buffer, (LargeServerMessage) message, null);
+ ((LargeServerMessage) message).toMessage().usageUp();
}
} else {
- this.message = MessagePersister.getInstance().decode(buffer, null);
+ this.message = MessagePersister.getInstance().decode(buffer, null, null);
}
int queueIDsSize = buffer.readInt();
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/impl/PagingStoreImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/impl/PagingStoreImpl.java
index 341ee7c792..6f4db11e59 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/impl/PagingStoreImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/impl/PagingStoreImpl.java
@@ -446,37 +446,7 @@ public class PagingStoreImpl implements PagingStore {
currentPageId = pageId;
if (pageId != 0) {
- Page page = createPage(pageId);
- page.open();
-
- List messages = page.read(storageManager);
-
- LivePageCache pageCache = new LivePageCacheImpl(pageId);
-
- for (PagedMessage msg : messages) {
- pageCache.addLiveMessage(msg);
- if (msg.getMessage().isLargeMessage()) {
- // We have to do this since addLIveMessage will increment an extra one
- ((LargeServerMessage) msg.getMessage()).decrementDelayDeletionCount();
- }
- }
-
- page.setLiveCache(pageCache);
-
- currentPageSize = page.getSize();
-
- currentPage = page;
-
- cursorProvider.addPageCache(pageCache);
-
- /**
- * The page file might be incomplete in the cases: 1) last message incomplete 2) disk damaged.
- * In case 1 we can keep writing the file. But in case 2 we'd better not bcs old data might be overwritten.
- * Here we open a new page so the incomplete page would be reserved for recovery if needed.
- */
- if (page.getSize() != page.getFile().size()) {
- openNewPage();
- }
+ reloadLivePage(pageId);
}
// We will not mark it for paging if there's only a single empty file
@@ -492,6 +462,39 @@ public class PagingStoreImpl implements PagingStore {
}
}
+ protected void reloadLivePage(int pageId) throws Exception {
+ Page page = createPage(pageId);
+ page.open();
+
+ List messages = page.read(storageManager);
+
+ LivePageCache pageCache = new LivePageCacheImpl(pageId);
+
+ for (PagedMessage msg : messages) {
+ pageCache.addLiveMessage(msg);
+ // As we add back to the live page,
+ // we have to discount one when we read the page
+ msg.getMessage().usageDown();
+ }
+
+ page.setLiveCache(pageCache);
+
+ currentPageSize = page.getSize();
+
+ currentPage = page;
+
+ cursorProvider.addPageCache(pageCache);
+
+ /**
+ * The page file might be incomplete in the cases: 1) last message incomplete 2) disk damaged.
+ * In case 1 we can keep writing the file. But in case 2 we'd better not bcs old data might be overwritten.
+ * Here we open a new page so the incomplete page would be reserved for recovery if needed.
+ */
+ if (page.getSize() != page.getFile().size()) {
+ openNewPage();
+ }
+ }
+
@Override
public void stopPaging() {
lock.writeLock().lock();
@@ -953,14 +956,16 @@ public class PagingStoreImpl implements PagingStore {
@Override
public void durableDown(Message message, int durableCount) {
+ refDown(message, durableCount);
}
@Override
public void durableUp(Message message, int durableCount) {
+ refUp(message, durableCount);
}
@Override
- public void nonDurableUp(Message message, int count) {
+ public void refUp(Message message, int count) {
if (count == 1) {
this.addSize(message.getMemoryEstimate() + MessageReferenceImpl.getMemoryEstimate());
} else {
@@ -969,9 +974,9 @@ public class PagingStoreImpl implements PagingStore {
}
@Override
- public void nonDurableDown(Message message, int count) {
+ public void refDown(Message message, int count) {
if (count < 0) {
- // this could happen on paged messages since they are not routed and incrementRefCount is never called
+ // this could happen on paged messages since they are not routed and refUp is never called
return;
}
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/StorageManager.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/StorageManager.java
index 0436398fb1..39183cde1f 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/StorageManager.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/StorageManager.java
@@ -24,6 +24,8 @@ import java.util.Set;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
+import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
+import org.apache.activemq.artemis.api.core.ActiveMQException;
import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.Pair;
import org.apache.activemq.artemis.api.core.SimpleString;
@@ -265,6 +267,17 @@ public interface StorageManager extends IDGenerator, ActiveMQComponent {
*/
SequentialFile createFileForLargeMessage(long messageID, LargeMessageExtension extension);
+ void deleteLargeMessageBody(LargeServerMessage largeServerMessage) throws ActiveMQException;
+
+ default SequentialFile createFileForLargeMessage(long messageID, boolean durable) {
+ if (durable) {
+ return createFileForLargeMessage(messageID, LargeMessageExtension.DURABLE);
+ } else {
+ return createFileForLargeMessage(messageID, LargeMessageExtension.TEMPORARY);
+ }
+ }
+
+
void prepare(long txID, Xid xid) throws Exception;
void commit(long txID) throws Exception;
@@ -416,6 +429,10 @@ public interface StorageManager extends IDGenerator, ActiveMQComponent {
*/
void addBytesToLargeMessage(SequentialFile appendFile, long messageID, byte[] bytes) throws Exception;
+ void addBytesToLargeMessage(SequentialFile file,
+ long messageId,
+ ActiveMQBuffer bytes) throws Exception;
+
/**
* Stores the id from IDManager.
*
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/AbstractJournalStorageManager.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/AbstractJournalStorageManager.java
index 296b221f8f..9b8177ebc2 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/AbstractJournalStorageManager.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/AbstractJournalStorageManager.java
@@ -58,7 +58,7 @@ import org.apache.activemq.artemis.core.journal.Journal;
import org.apache.activemq.artemis.core.journal.JournalLoadInformation;
import org.apache.activemq.artemis.core.journal.PreparedTransactionInfo;
import org.apache.activemq.artemis.core.journal.RecordInfo;
-import org.apache.activemq.artemis.core.message.impl.CoreMessageObjectPools;
+import org.apache.activemq.artemis.core.persistence.CoreMessageObjectPools;
import org.apache.activemq.artemis.core.paging.PageTransactionInfo;
import org.apache.activemq.artemis.core.paging.PagingManager;
import org.apache.activemq.artemis.core.paging.PagingStore;
@@ -134,6 +134,19 @@ public abstract class AbstractJournalStorageManager extends CriticalComponentImp
protected static final int CRITICAL_STOP = 1;
protected static final int CRITICAL_STOP_2 = 2;
+
+ public static ThreadLocal storageManagerThreadLocal = new ThreadLocal<>();
+
+ /** Persisters may need to access this on reloading of the journal,
+ * for large message processing */
+ public static void setupThreadLocal(StorageManager manager) {
+ storageManagerThreadLocal.set(manager);
+ }
+
+ public static StorageManager getThreadLocal() {
+ return storageManagerThreadLocal.get();
+ }
+
private static final Logger logger = Logger.getLogger(AbstractJournalStorageManager.class);
public enum JournalContent {
@@ -359,7 +372,7 @@ public abstract class AbstractJournalStorageManager extends CriticalComponentImp
// Note that we don't sync, the add reference that comes immediately after will sync if
// appropriate
- if (message.isLargeMessage()) {
+ if (message.isLargeMessage() && message instanceof LargeServerMessageImpl) {
messageJournal.appendAddRecord(message.getMessageID(), JournalRecordIds.ADD_LARGE_MESSAGE, LargeMessagePersister.getInstance(), message, false, getContext(false));
} else {
messageJournal.appendAddRecord(message.getMessageID(), JournalRecordIds.ADD_MESSAGE_PROTOCOL, message.getPersister(), message, false, getContext(false));
@@ -480,7 +493,8 @@ public abstract class AbstractJournalStorageManager extends CriticalComponentImp
readLock();
try {
- if (message.isLargeMessage()) {
+ if (message.isLargeMessage() && message instanceof LargeServerMessageImpl) {
+ // this is a core large message
messageJournal.appendAddRecordTransactional(txID, message.getMessageID(), JournalRecordIds.ADD_LARGE_MESSAGE, LargeMessagePersister.getInstance(), message);
} else {
messageJournal.appendAddRecordTransactional(txID, message.getMessageID(), JournalRecordIds.ADD_MESSAGE_PROTOCOL, message.getPersister(), message);
@@ -843,6 +857,7 @@ public abstract class AbstractJournalStorageManager extends CriticalComponentImp
Map messages = new HashMap<>();
readLock();
+ setupThreadLocal(this);
try {
JournalLoadInformation info = messageJournal.load(records, preparedTransactions, new LargeMessageTXFailureCallback(this));
@@ -908,7 +923,7 @@ public abstract class AbstractJournalStorageManager extends CriticalComponentImp
case JournalRecordIds.ADD_LARGE_MESSAGE: {
LargeServerMessage largeMessage = parseLargeMessage(buff);
- messages.put(record.id, largeMessage);
+ messages.put(record.id, largeMessage.toMessage());
largeMessages.add(largeMessage);
@@ -920,7 +935,15 @@ public abstract class AbstractJournalStorageManager extends CriticalComponentImp
case JournalRecordIds.ADD_MESSAGE_PROTOCOL: {
- Message message = MessagePersister.getInstance().decode(buff, pools);
+ Message message = MessagePersister.getInstance().decode(buff, null, pools);
+
+ /* if (message instanceof LargeServerMessage) {
+ try {
+ ((LargeServerMessage) message).finishParse();
+ } catch (Exception e) {
+ logger.warn(e.getMessage(), e);
+ }
+ } */
messages.put(record.id, message);
@@ -1194,9 +1217,9 @@ public abstract class AbstractJournalStorageManager extends CriticalComponentImp
}
for (LargeServerMessage msg : largeMessages) {
- if (msg.getRefCount() == 0) {
+ if (msg.toMessage().getRefCount() == 0) {
ActiveMQServerLogger.LOGGER.largeMessageWithNoRef(msg.getMessageID());
- msg.decrementDelayDeletionCount();
+ msg.toMessage().usageDown();
}
}
@@ -1217,6 +1240,8 @@ public abstract class AbstractJournalStorageManager extends CriticalComponentImp
return info;
} finally {
readUnLock();
+ // need to clear it, otherwise we may have a permanent leak
+ setupThreadLocal(null);
}
}
@@ -1712,7 +1737,7 @@ public abstract class AbstractJournalStorageManager extends CriticalComponentImp
if (largeServerMessage.getPendingRecordID() >= 0) {
try {
confirmPendingLargeMessage(largeServerMessage.getPendingRecordID());
- largeServerMessage.setPendingRecordID(LargeServerMessage.NO_PENDING_ID);
+ largeServerMessage.clearPendingRecordID();
} catch (Exception e) {
ActiveMQServerLogger.LOGGER.warn(e.getMessage(), e);
}
@@ -1758,7 +1783,7 @@ public abstract class AbstractJournalStorageManager extends CriticalComponentImp
switch (recordType) {
case JournalRecordIds.ADD_LARGE_MESSAGE: {
- messages.put(record.id, parseLargeMessage(buff));
+ messages.put(record.id, parseLargeMessage(buff).toMessage());
break;
}
@@ -1770,7 +1795,7 @@ public abstract class AbstractJournalStorageManager extends CriticalComponentImp
if (pools == null) {
pools = new CoreMessageObjectPools();
}
- Message message = MessagePersister.getInstance().decode(buff, pools);
+ Message message = MessagePersister.getInstance().decode(buff, null, pools);
messages.put(record.id, message);
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/DescribeJournal.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/DescribeJournal.java
index 910b0c1260..9ee72ea00e 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/DescribeJournal.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/DescribeJournal.java
@@ -561,16 +561,15 @@ public final class DescribeJournal {
LargeServerMessage largeMessage = new LargeServerMessageImpl(storageManager);
- LargeMessagePersister.getInstance().decode(buffer, largeMessage);
+ LargeMessagePersister.getInstance().decode(buffer, largeMessage, null);
- return new MessageDescribe(largeMessage);
+ return new MessageDescribe(largeMessage.toMessage());
}
case ADD_MESSAGE: {
return "ADD-MESSAGE is not supported any longer, use export/import";
}
case ADD_MESSAGE_PROTOCOL: {
- Message message = MessagePersister.getInstance().decode(buffer, null);
-
+ Message message = MessagePersister.getInstance().decode(buffer, null, null);
return new MessageDescribe(message);
}
case ADD_REF: {
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/JournalStorageManager.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/JournalStorageManager.java
index e200eadcc2..567ee03dfc 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/JournalStorageManager.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/JournalStorageManager.java
@@ -348,14 +348,6 @@ public class JournalStorageManager extends AbstractJournalStorageManager {
}
}
- protected SequentialFile createFileForLargeMessage(final long messageID, final boolean durable) {
- if (durable) {
- return createFileForLargeMessage(messageID, LargeMessageExtension.DURABLE);
- } else {
- return createFileForLargeMessage(messageID, LargeMessageExtension.TEMPORARY);
- }
- }
-
@Override
/**
* @param buff
@@ -365,13 +357,13 @@ public class JournalStorageManager extends AbstractJournalStorageManager {
protected LargeServerMessage parseLargeMessage(final ActiveMQBuffer buff) throws Exception {
LargeServerMessage largeMessage = createLargeMessage();
- LargeMessagePersister.getInstance().decode(buff, largeMessage);
+ LargeMessagePersister.getInstance().decode(buff, largeMessage, null);
- if (largeMessage.containsProperty(Message.HDR_ORIG_MESSAGE_ID)) {
+ if (largeMessage.toMessage().containsProperty(Message.HDR_ORIG_MESSAGE_ID)) {
// for compatibility: couple with old behaviour, copying the old file to avoid message loss
- long originalMessageID = largeMessage.getLongProperty(Message.HDR_ORIG_MESSAGE_ID);
+ long originalMessageID = largeMessage.toMessage().getLongProperty(Message.HDR_ORIG_MESSAGE_ID);
- SequentialFile currentFile = createFileForLargeMessage(largeMessage.getMessageID(), true);
+ SequentialFile currentFile = createFileForLargeMessage(largeMessage.toMessage().getMessageID(), true);
if (!currentFile.exists()) {
SequentialFile linkedFile = createFileForLargeMessage(originalMessageID, true);
@@ -442,18 +434,10 @@ public class JournalStorageManager extends AbstractJournalStorageManager {
journalFF.releaseBuffer(buffer);
}
- public long storePendingLargeMessage(final long messageID, long recordID) throws Exception {
+ public long storePendingLargeMessage(final long messageID) throws Exception {
readLock();
try {
- if (recordID == LargeServerMessage.NO_PENDING_ID) {
- recordID = generateID();
- } else {
- //this means the large message doesn't
- //have a pendingRecordID, but one has been
- //generated (coming from live server) for use.
- recordID = -recordID;
- }
-
+ long recordID = generateID();
messageJournal.appendAddRecord(recordID, JournalRecordIds.ADD_LARGE_MESSAGE_PENDING, new PendingLargeMessageEncoding(messageID), true, getContext(true));
return recordID;
@@ -462,31 +446,31 @@ public class JournalStorageManager extends AbstractJournalStorageManager {
}
}
- // This should be accessed from this package only
- void deleteLargeMessageFile(final LargeServerMessage largeServerMessage) throws ActiveMQException {
+ @Override
+ public void deleteLargeMessageBody(final LargeServerMessage largeServerMessage) throws ActiveMQException {
synchronized (largeServerMessage) {
- if (largeServerMessage.getPendingRecordID() < 0) {
+ if (!largeServerMessage.hasPendingRecord()) {
try {
// The delete file happens asynchronously
// And the client won't be waiting for the actual file to be deleted.
// We set a temporary record (short lived) on the journal
// to avoid a situation where the server is restarted and pending large message stays on forever
- largeServerMessage.setPendingRecordID(storePendingLargeMessage(largeServerMessage.getMessageID(), largeServerMessage.getPendingRecordID()));
+ largeServerMessage.setPendingRecordID(storePendingLargeMessage(largeServerMessage.toMessage().getMessageID()));
} catch (Exception e) {
throw new ActiveMQInternalErrorException(e.getMessage(), e);
}
}
}
- final SequentialFile file = largeServerMessage.getFile();
+ final SequentialFile file = largeServerMessage.getAppendFile();
if (file == null) {
return;
}
- if (largeServerMessage.isDurable() && isReplicated()) {
+ if (largeServerMessage.toMessage().isDurable() && isReplicated()) {
readLock();
try {
if (isReplicated() && replicator.isSynchronizing()) {
- largeMessagesToDelete.put(largeServerMessage.getMessageID(), largeServerMessage);
+ largeMessagesToDelete.put(largeServerMessage.toMessage().getMessageID(), largeServerMessage);
return;
}
} finally {
@@ -500,7 +484,7 @@ public class JournalStorageManager extends AbstractJournalStorageManager {
readLock();
try {
if (replicator != null) {
- replicator.largeMessageDelete(largeServerMessage.getMessageID(), JournalStorageManager.this);
+ replicator.largeMessageDelete(largeServerMessage.toMessage().getMessageID(), JournalStorageManager.this);
}
file.delete();
@@ -510,7 +494,7 @@ public class JournalStorageManager extends AbstractJournalStorageManager {
readUnLock();
}
} catch (Exception e) {
- ActiveMQServerLogger.LOGGER.journalErrorDeletingMessage(e, largeServerMessage.getMessageID());
+ ActiveMQServerLogger.LOGGER.journalErrorDeletingMessage(e, largeServerMessage.toMessage().getMessageID());
}
}
@@ -575,7 +559,7 @@ public class JournalStorageManager extends AbstractJournalStorageManager {
if (largeMessage.isDurable()) {
// We store a marker on the journal that the large file is pending
- long pendingRecordID = storePendingLargeMessage(id, LargeServerMessage.NO_PENDING_ID);
+ long pendingRecordID = storePendingLargeMessage(id);
largeMessage.setPendingRecordID(pendingRecordID);
}
@@ -831,6 +815,7 @@ public class JournalStorageManager extends AbstractJournalStorageManager {
}
}
+ @Override
public final void addBytesToLargeMessage(final SequentialFile file,
final long messageId,
final ActiveMQBuffer bytes) throws Exception {
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/LargeBody.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/LargeBody.java
new file mode 100644
index 0000000000..9d17f6e003
--- /dev/null
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/LargeBody.java
@@ -0,0 +1,450 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.activemq.artemis.core.persistence.impl.journal;
+
+import java.nio.ByteBuffer;
+
+import io.netty.buffer.Unpooled;
+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;
+import org.apache.activemq.artemis.core.io.SequentialFile;
+import org.apache.activemq.artemis.core.message.LargeBodyReader;
+import org.apache.activemq.artemis.core.persistence.StorageManager;
+import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
+import org.apache.activemq.artemis.core.server.LargeServerMessage;
+import org.jboss.logging.Logger;
+
+public class LargeBody {
+
+ private static final Logger logger = Logger.getLogger(LargeBody.class);
+
+ private long bodySize = -1;
+
+ long NO_PENDING_ID = -1;
+
+ private long pendingRecordID = NO_PENDING_ID;
+
+ final StorageManager storageManager;
+
+ private long messageID = -1;
+
+ private LargeServerMessage message;
+
+ private boolean paged;
+
+ // This is to be used only for appending
+ private SequentialFile file;
+
+ public LargeBody(LargeServerMessage message, StorageManager storageManager) {
+ this.storageManager = storageManager;
+ this.message = message;
+ }
+
+ public LargeBody(LargeServerMessage message, StorageManager storageManager, SequentialFile file) {
+ this(message, storageManager);
+ this.file = file;
+ }
+
+ public StorageManager getStorageManager() {
+ return storageManager;
+ }
+
+ public ByteBuffer map() throws Exception {
+ ensureFileExists(true);
+ if (!file.isOpen()) {
+ file.open();
+ }
+ return file.map(0, file.size());
+ }
+
+ public LargeBody(long messageID, JournalStorageManager storageManager) {
+ this(null, storageManager);
+ this.messageID = messageID;
+ }
+
+ public void setMessage(LargeServerMessage message) {
+ this.message = message;
+
+ }
+
+ public void setPaged() {
+ this.paged = true;
+ }
+
+ public boolean isPaged() {
+ return paged;
+ }
+
+ public void clearFile() {
+ if (file != null && file.isOpen()) {
+ try {
+ file.close();
+ } catch (Exception e) {
+ // this shouldn't happen anyways, this close call is here just in case it ever happened
+ logger.warn(e.getMessage(), e);
+ }
+ }
+
+ file = null;
+ }
+
+ public synchronized void deleteFile() {
+ try {
+ validateFile();
+ releaseResources(false);
+ storageManager.deleteLargeMessageBody(message);
+ } catch (Exception e) {
+ storageManager.criticalError(e);
+ }
+ }
+
+ public long getMessageID() {
+ if (message == null) {
+ return messageID;
+ } else {
+ return message.getMessageID();
+ }
+ }
+
+ public synchronized void addBytes(final byte[] bytes) throws Exception {
+ validateFile();
+
+ if (!file.isOpen()) {
+ file.open();
+ }
+
+ storageManager.addBytesToLargeMessage(file, getMessageID(), bytes);
+
+ bodySize += bytes.length;
+ }
+
+ public synchronized void addBytes(final ActiveMQBuffer bytes) throws Exception {
+ validateFile();
+
+ if (!file.isOpen()) {
+ file.open();
+ }
+
+ final int readableBytes = bytes.readableBytes();
+
+ storageManager.addBytesToLargeMessage(file, getMessageID(), bytes);
+
+ bodySize += readableBytes;
+ }
+
+ public synchronized void validateFile() throws ActiveMQException {
+ this.ensureFileExists(true);
+ }
+
+ public synchronized void ensureFileExists(boolean toOpen) throws ActiveMQException {
+ try {
+ if (file == null) {
+ if (getMessageID() <= 0) {
+ throw new RuntimeException("MessageID not set on LargeMessage");
+ }
+
+ file = createFile();
+
+ if (toOpen) {
+ openFile();
+ }
+
+ bodySize = file.size();
+ }
+ } catch (Exception e) {
+ throw new ActiveMQInternalErrorException(e.getMessage(), e);
+ }
+ }
+
+ /**
+ * This will return the bodySize without trying to open the file, just returning what's currently stored
+ */
+ public long getStoredBodySize() {
+ return bodySize;
+ }
+
+ public void setBodySize(long size) {
+ this.bodySize = size;
+ }
+
+ public long getBodySize() throws ActiveMQException {
+
+ try {
+ if (bodySize <= 0) {
+ if (file != null) {
+ bodySize = file.size();
+ } else {
+ SequentialFile tmpFile = createFile();
+ bodySize = tmpFile.size();
+ tmpFile.close(false);
+ }
+ }
+ return bodySize;
+ } catch (Exception e) {
+ ActiveMQIOErrorException errorException = new ActiveMQIOErrorException();
+ errorException.initCause(e);
+ throw errorException;
+ }
+ }
+
+ public LargeBodyReader getLargeBodyReader() {
+ return new LargeBodyReaderImpl();
+ }
+
+ /**
+ * This will return its own File useful for reading the file on the large message while delivering, browsing.. etc
+ */
+ public SequentialFile getReadingFile() throws ActiveMQException {
+ ensureFileExists(false);
+ return file.cloneFile();
+ }
+
+ /** Meant for test-ability, be careful if you decide to use it.
+ * and in case you use it for a real reason, please change the documentation here.
+ * @param file
+ */
+ public void replaceFile(SequentialFile file) {
+ this.file = file;
+ }
+
+ public SequentialFile getAppendFile() throws ActiveMQException {
+ validateFile();
+ return file;
+ }
+
+ public void checkDelete() {
+ if (message.toMessage().getRefCount() <= 0 && message.toMessage().getUsage() <= 0 && message.toMessage().getDurableCount() <= 0) {
+ if (logger.isTraceEnabled()) {
+ try {
+ logger.trace("Deleting file " + getAppendFile() + " as the usage was complete");
+ } catch (Exception e) {
+ // this is only after a trace, no need to do any special logging handling here
+ logger.warn(e.getMessage(), e);
+ }
+ }
+
+ deleteFile();
+ }
+ }
+
+ public void referenceOriginalMessage(final LargeBody original) {
+ if (original.isPaged()) {
+ this.setPaged();
+ }
+
+ if (this.paged) {
+ message.toMessage().removeAnnotation(Message.HDR_ORIG_MESSAGE_ID);
+ }
+ }
+
+ public ActiveMQBuffer getReadOnlyBodyBuffer() {
+ try {
+ validateFile();
+ file.open();
+ int fileSize = (int) file.size();
+ ByteBuffer buffer = ByteBuffer.allocate(fileSize);
+ file.read(buffer);
+ return new ChannelBufferWrapper(Unpooled.wrappedBuffer(buffer));
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ } finally {
+ try {
+ file.close(false);
+ } catch (Exception ignored) {
+ }
+ }
+ }
+
+ public int getBodyBufferSize() {
+ final boolean closeFile = file == null || !file.isOpen();
+ try {
+ openFile();
+ final long fileSize = file.size();
+ int fileSizeAsInt = (int) fileSize;
+ if (fileSizeAsInt < 0) {
+ logger.warnf("suspicious large message file size of %d bytes for %s, will use %d instead.", fileSize, file.getFileName(), Integer.MAX_VALUE);
+ fileSizeAsInt = Integer.MAX_VALUE;
+ }
+ return fileSizeAsInt;
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ } finally {
+ if (closeFile) {
+ try {
+ file.close(false);
+ } catch (Exception ignored) {
+ }
+ }
+ }
+ }
+
+ public synchronized void releaseResources(boolean sync) {
+ if (file != null && file.isOpen()) {
+ try {
+ if (sync) {
+ file.sync();
+ }
+ file.close(false);
+ } catch (Exception e) {
+ ActiveMQServerLogger.LOGGER.largeMessageErrorReleasingResources(e);
+ }
+ }
+ }
+
+ public void copyInto(LargeServerMessage newMessage) throws Exception {
+ //clone a SequentialFile to avoid concurrent access
+ SequentialFile cloneFile = getReadingFile();
+
+ try {
+ byte[] bufferBytes = new byte[100 * 1024];
+
+ ByteBuffer buffer = ByteBuffer.wrap(bufferBytes);
+
+ if (!cloneFile.isOpen()) {
+ cloneFile.open();
+ }
+
+ cloneFile.position(0);
+
+ for (; ; ) {
+ // The buffer is reused...
+ // We need to make sure we clear the limits and the buffer before reusing it
+ buffer.clear();
+ int bytesRead = cloneFile.read(buffer);
+
+ byte[] bufferToWrite;
+ if (bytesRead <= 0) {
+ break;
+ } else if (bytesRead == bufferBytes.length && this.storageManager instanceof JournalStorageManager && !((JournalStorageManager) this.storageManager).isReplicated()) {
+ // ARTEMIS-1220: We cannot reuse the same buffer if it's replicated
+ // otherwise there could be another thread still using the buffer on a
+ // replication.
+ bufferToWrite = bufferBytes;
+ } else {
+ bufferToWrite = new byte[bytesRead];
+ System.arraycopy(bufferBytes, 0, bufferToWrite, 0, bytesRead);
+ }
+
+ newMessage.addBytes(bufferToWrite);
+
+ if (bytesRead < bufferBytes.length) {
+ break;
+ }
+ }
+ } finally {
+ cloneFile.close();
+ }
+ }
+
+ public SequentialFile createFile() {
+ return storageManager.createFileForLargeMessage(getMessageID(), message.toMessage().isDurable());
+ }
+
+ protected void openFile() throws Exception {
+ if (file == null) {
+ validateFile();
+ } else if (!file.isOpen()) {
+ file.open();
+ }
+ }
+
+ class LargeBodyReaderImpl implements LargeBodyReader {
+
+ private SequentialFile cFile;
+
+ @Override
+ public void open() throws ActiveMQException {
+ try {
+ if (cFile != null && cFile.isOpen()) {
+ cFile.close(false);
+ }
+ cFile = getReadingFile();
+ cFile.open();
+ } catch (Exception e) {
+ throw new ActiveMQException(ActiveMQExceptionType.INTERNAL_ERROR, e.getMessage(), e);
+ }
+ }
+
+ @Override
+ public void position(long position) throws ActiveMQException {
+ try {
+ cFile.position(position);
+ } catch (Exception e) {
+ throw new ActiveMQException(ActiveMQExceptionType.INTERNAL_ERROR, e.getMessage(), e);
+ }
+ }
+
+ @Override
+ public long position() {
+ return cFile.position();
+ }
+
+ @Override
+ public void close() throws ActiveMQException {
+ try {
+ if (cFile != null) {
+ cFile.close(false);
+ cFile = null;
+ }
+ } catch (Exception e) {
+ throw new ActiveMQInternalErrorException(e.getMessage(), e);
+ }
+ }
+
+ @Override
+ public int readInto(final ByteBuffer bufferRead) throws ActiveMQException {
+ try {
+ return cFile.read(bufferRead);
+ } catch (Exception e) {
+ throw new ActiveMQInternalErrorException(e.getMessage(), e);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.activemq.artemis.core.message.LargeBodyEncoder#getSize()
+ */
+ @Override
+ public long getSize() throws ActiveMQException {
+ return getBodySize();
+ }
+ }
+
+ public boolean hasPendingRecord() {
+ return pendingRecordID != NO_PENDING_ID;
+ }
+
+ public void clearPendingRecordID() {
+ setPendingRecordID(NO_PENDING_ID);
+ }
+
+
+ public long getPendingRecordID() {
+ return this.pendingRecordID;
+ }
+
+ public void setPendingRecordID(long pendingRecordID) {
+ this.pendingRecordID = pendingRecordID;
+ }
+
+
+}
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/LargeMessageTXFailureCallback.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/LargeMessageTXFailureCallback.java
index 0a92bd232c..4f62f1bcb3 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/LargeMessageTXFailureCallback.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/LargeMessageTXFailureCallback.java
@@ -48,7 +48,7 @@ public class LargeMessageTXFailureCallback implements TransactionFailureCallback
try {
LargeServerMessage serverMessage = journalStorageManager.parseLargeMessage(buff);
- serverMessage.decrementDelayDeletionCount();
+ serverMessage.toMessage().usageDown();
} catch (Exception e) {
ActiveMQServerLogger.LOGGER.journalError(e);
}
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 85cb24c066..32879747fb 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
@@ -16,36 +16,34 @@
*/
package org.apache.activemq.artemis.core.persistence.impl.journal;
-import java.nio.ByteBuffer;
-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.ICoreMessage;
import org.apache.activemq.artemis.api.core.Message;
-import org.apache.activemq.artemis.api.core.RefCountMessageListener;
-import org.apache.activemq.artemis.core.buffers.impl.ChannelBufferWrapper;
import org.apache.activemq.artemis.core.io.SequentialFile;
-import org.apache.activemq.artemis.core.message.LargeBodyEncoder;
+import org.apache.activemq.artemis.core.message.LargeBodyReader;
import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import org.apache.activemq.artemis.core.persistence.StorageManager;
import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
+import org.apache.activemq.artemis.core.server.CoreLargeServerMessage;
import org.apache.activemq.artemis.core.server.LargeServerMessage;
import org.apache.activemq.artemis.utils.DataConstants;
import org.apache.activemq.artemis.utils.collections.TypedProperties;
import org.jboss.logging.Logger;
-import io.netty.buffer.Unpooled;
+public final class LargeServerMessageImpl extends CoreMessage implements CoreLargeServerMessage {
-public final class LargeServerMessageImpl extends CoreMessage implements LargeServerMessage {
+ @Override
+ public Message toMessage() {
+ return this;
+ }
// When a message is stored on the journal, it will contain some header and trail on the journal
// we need to take that into consideration if that would fit the Journal TimedBuffer.
private static final int ESTIMATE_RECORD_TRAIL = 512;
+ private final LargeBody largeBody;
+
/** This will check if a regular message needs to be converted as large message */
public static Message checkLargeMessage(Message message, StorageManager storageManager) throws Exception {
if (message.isLargeMessage()) {
@@ -59,6 +57,11 @@ public final class LargeServerMessageImpl extends CoreMessage implements LargeSe
}
}
+ @Override
+ public void finishParse() throws Exception {
+
+ }
+
private static Message asLargeMessage(Message message, StorageManager storageManager) throws Exception {
ICoreMessage coreMessage = message.toCore();
LargeServerMessage lsm = storageManager.createLargeMessage(storageManager.generateID(), coreMessage);
@@ -66,8 +69,8 @@ public final class LargeServerMessageImpl extends CoreMessage implements LargeSe
final int readableBytes = buffer.readableBytes();
lsm.addBytes(buffer);
lsm.releaseResources(true);
- lsm.putLongProperty(Message.HDR_LARGE_BODY_SIZE, readableBytes);
- return lsm;
+ lsm.toMessage().putLongProperty(Message.HDR_LARGE_BODY_SIZE, readableBytes);
+ return lsm.toMessage();
}
// Constants -----------------------------------------------------
@@ -75,26 +78,20 @@ public final class LargeServerMessageImpl extends CoreMessage implements LargeSe
// Attributes ----------------------------------------------------
- private final JournalStorageManager storageManager;
-
- private long pendingRecordID = NO_PENDING_ID;
-
- private boolean paged;
-
- // We should only use the NIO implementation on the Journal
- private SequentialFile file;
-
- private long bodySize = -1;
-
- private final AtomicInteger delayDeletionCount = new AtomicInteger(0);
+ private final StorageManager storageManager;
// We cache this
private volatile int memoryEstimate = -1;
- public LargeServerMessageImpl(final JournalStorageManager storageManager) {
+ public LargeServerMessageImpl(final StorageManager storageManager) {
+ largeBody = new LargeBody(this, storageManager);
this.storageManager = storageManager;
}
+ public long getBodySize() throws ActiveMQException {
+ return largeBody.getBodySize();
+ }
+
/**
* Copy constructor
*
@@ -102,17 +99,28 @@ public final class LargeServerMessageImpl extends CoreMessage implements LargeSe
* @param copy
* @param fileCopy
*/
- private LargeServerMessageImpl(final LargeServerMessageImpl copy,
+ public LargeServerMessageImpl(final LargeServerMessageImpl copy,
TypedProperties properties,
final SequentialFile fileCopy,
final long newID) {
super(copy, properties);
storageManager = copy.storageManager;
- file = fileCopy;
- bodySize = copy.bodySize;
+ largeBody = new LargeBody(this, storageManager, fileCopy);
+ largeBody.setBodySize(copy.largeBody.getStoredBodySize());
setMessageID(newID);
}
+ public LargeServerMessageImpl(byte type,
+ long id,
+ StorageManager storageManager,
+ final SequentialFile fileCopy) {
+ super();
+ this.storageManager = storageManager;
+ setMessageID(id);
+ setType(type);
+ largeBody = new LargeBody(this, storageManager, fileCopy);
+ }
+
private static String toDate(long timestamp) {
if (timestamp == 0) {
return "0";
@@ -122,6 +130,11 @@ public final class LargeServerMessageImpl extends CoreMessage implements LargeSe
}
+ @Override
+ public StorageManager getStorageManager() {
+ return storageManager;
+ }
+
@Override
public boolean isServerMessage() {
return true;
@@ -129,7 +142,17 @@ public final class LargeServerMessageImpl extends CoreMessage implements LargeSe
@Override
public long getPendingRecordID() {
- return this.pendingRecordID;
+ return largeBody.getPendingRecordID();
+ }
+
+ @Override
+ public void clearPendingRecordID() {
+ largeBody.clearPendingRecordID();
+ }
+
+ @Override
+ public boolean hasPendingRecord() {
+ return largeBody.hasPendingRecord();
}
/**
@@ -137,40 +160,22 @@ public final class LargeServerMessageImpl extends CoreMessage implements LargeSe
*/
@Override
public void setPendingRecordID(long pendingRecordID) {
- this.pendingRecordID = pendingRecordID;
+ largeBody.setPendingRecordID(pendingRecordID);
}
@Override
public void setPaged() {
- paged = true;
+ largeBody.setPaged();
}
@Override
public synchronized void addBytes(final byte[] bytes) throws Exception {
- validateFile();
-
- if (!file.isOpen()) {
- file.open();
- }
-
- storageManager.addBytesToLargeMessage(file, getMessageID(), bytes);
-
- bodySize += bytes.length;
+ largeBody.addBytes(bytes);
}
@Override
public synchronized void addBytes(final ActiveMQBuffer bytes) throws Exception {
- validateFile();
-
- if (!file.isOpen()) {
- file.open();
- }
-
- final int readableBytes = bytes.readableBytes();
-
- storageManager.addBytesToLargeMessage(file, getMessageID(), bytes);
-
- bodySize += readableBytes;
+ largeBody.addBytes(bytes);
}
@Override
@@ -183,79 +188,19 @@ public final class LargeServerMessageImpl extends CoreMessage implements LargeSe
}
public void decode(final ActiveMQBuffer buffer1) {
- file = null;
-
+ largeBody.clearFile();
super.decodeHeadersAndProperties(buffer1.byteBuf());
}
@Override
- public synchronized void incrementDelayDeletionCount() {
- delayDeletionCount.incrementAndGet();
- try {
- if (paged) {
- RefCountMessageListener tmpContext = super.getContext();
- setContext(null);
- incrementRefCount();
- setContext(tmpContext);
- } else {
- incrementRefCount();
- }
-
- } catch (Exception e) {
- ActiveMQServerLogger.LOGGER.errorIncrementDelayDeletionCount(e);
- }
+ public LargeBodyReader getLargeBodyReader() {
+ return largeBody.getLargeBodyReader();
}
+
@Override
- public synchronized void decrementDelayDeletionCount() throws Exception {
- int count = delayDeletionCount.decrementAndGet();
-
- decrementRefCount();
-
- if (count == 0) {
- checkDelete();
- }
- }
-
- @Override
- public LargeBodyEncoder getBodyEncoder() throws ActiveMQException {
- validateFile();
- return new DecodingContext();
- }
-
- private void checkDelete() throws Exception {
- if (getRefCount() <= 0) {
- if (logger.isTraceEnabled()) {
- logger.trace("Deleting file " + file + " as the usage was complete");
- }
-
- try {
- deleteFile();
- } catch (Exception e) {
- ActiveMQServerLogger.LOGGER.error(e.getMessage(), e);
- }
- }
- }
-
- @Override
- public synchronized int decrementRefCount() throws Exception {
- int currentRefCount;
- if (paged) {
- RefCountMessageListener tmpContext = super.getContext();
- setContext(null);
- currentRefCount = super.decrementRefCount();
- setContext(tmpContext);
- } else {
- currentRefCount = super.decrementRefCount();
- }
-
- // We use <= as this could be used by load.
- // because of a failure, no references were loaded, so we have 0... and we still need to delete the associated
- // files
- if (delayDeletionCount.get() <= 0) {
- checkDelete();
- }
- return currentRefCount;
+ protected void releaseComplete() {
+ largeBody.deleteFile();
}
// Even though not recommended, in certain instances
@@ -263,46 +208,13 @@ public final class LargeServerMessageImpl extends CoreMessage implements LargeSe
// in a way you can convert
@Override
public ActiveMQBuffer getReadOnlyBodyBuffer() {
- try {
- validateFile();
- file.open();
- int fileSize = (int) file.size();
- ByteBuffer buffer = ByteBuffer.allocate(fileSize);
- file.read(buffer);
- return new ChannelBufferWrapper(Unpooled.wrappedBuffer(buffer));
- } catch (Exception e) {
- throw new RuntimeException(e);
- } finally {
- try {
- file.close(false);
- } catch (Exception ignored) {
- }
- }
+
+ return largeBody.getReadOnlyBodyBuffer();
}
@Override
public int getBodyBufferSize() {
- final boolean closeFile = file == null || !file.isOpen();
- try {
- openFile();
- final long fileSize = file.size();
- int fileSizeAsInt = (int) fileSize;
- if (fileSizeAsInt < 0) {
- logger.warnf("suspicious large message file size of %d bytes for %s, will use %d instead.",
- fileSize, file.getFileName(), Integer.MAX_VALUE);
- fileSizeAsInt = Integer.MAX_VALUE;
- }
- return fileSizeAsInt;
- } catch (Exception e) {
- throw new RuntimeException(e);
- } finally {
- if (closeFile) {
- try {
- file.close(false);
- } catch (Exception ignored) {
- }
- }
- }
+ return largeBody.getBodyBufferSize();
}
@Override
@@ -312,9 +224,7 @@ public final class LargeServerMessageImpl extends CoreMessage implements LargeSe
@Override
public synchronized void deleteFile() throws Exception {
- validateFile();
- releaseResources(false);
- storageManager.deleteLargeMessageFile(this);
+ largeBody.deleteFile();
}
@Override
@@ -329,16 +239,7 @@ public final class LargeServerMessageImpl extends CoreMessage implements LargeSe
@Override
public synchronized void releaseResources(boolean sync) {
- if (file != null && file.isOpen()) {
- try {
- if (sync) {
- file.sync();
- }
- file.close(false);
- } catch (Exception e) {
- ActiveMQServerLogger.LOGGER.largeMessageErrorReleasingResources(e);
- }
- }
+ largeBody.releaseResources(sync);
}
@Override
@@ -347,11 +248,7 @@ public final class LargeServerMessageImpl extends CoreMessage implements LargeSe
super.referenceOriginalMessage(original, originalQueue);
if (original instanceof LargeServerMessageImpl) {
- LargeServerMessageImpl otherLM = (LargeServerMessageImpl) original;
- this.paged = otherLM.paged;
- if (this.paged) {
- this.removeAnnotation(Message.HDR_ORIG_MESSAGE_ID);
- }
+ this.largeBody.referenceOriginalMessage(((LargeServerMessageImpl) original).largeBody);
}
}
@@ -363,59 +260,19 @@ public final class LargeServerMessageImpl extends CoreMessage implements LargeSe
return newMessage;
}
+ @Override
+ public LargeBody getLargeBody() {
+ return largeBody;
+ }
+
@Override
public Message copy(final long newID) {
try {
LargeServerMessage newMessage = storageManager.createLargeMessage(newID, this);
-
- //clone a SequentialFile to avoid concurrent access
- ensureFileExists(false);
- SequentialFile cloneFile = file.cloneFile();
-
- try {
- byte[] bufferBytes = new byte[100 * 1024];
-
- ByteBuffer buffer = ByteBuffer.wrap(bufferBytes);
-
- if (!cloneFile.isOpen()) {
- cloneFile.open();
- }
-
- cloneFile.position(0);
-
- for (;;) {
- // The buffer is reused...
- // We need to make sure we clear the limits and the buffer before reusing it
- buffer.clear();
- int bytesRead = cloneFile.read(buffer);
-
- byte[] bufferToWrite;
- if (bytesRead <= 0) {
- break;
- } else if (bytesRead == bufferBytes.length && !this.storageManager.isReplicated()) {
- // ARTEMIS-1220: We cannot reuse the same buffer if it's replicated
- // otherwise there could be another thread still using the buffer on a
- // replication.
- bufferToWrite = bufferBytes;
- } else {
- bufferToWrite = new byte[bytesRead];
- System.arraycopy(bufferBytes, 0, bufferToWrite, 0, bytesRead);
- }
-
- newMessage.addBytes(bufferToWrite);
-
- if (bytesRead < bufferBytes.length) {
- break;
- }
- }
- } finally {
- if (!file.isOpen()) {
- newMessage.getFile().close();
- }
- cloneFile.close();
- }
-
- return newMessage;
+ largeBody.copyInto(newMessage);
+ newMessage.finishParse();
+ newMessage.releaseResources(true);
+ return newMessage.toMessage();
} catch (Exception e) {
ActiveMQServerLogger.LOGGER.lareMessageErrorCopying(e, this);
@@ -424,29 +281,8 @@ public final class LargeServerMessageImpl extends CoreMessage implements LargeSe
}
@Override
- public SequentialFile getFile() throws ActiveMQException {
- validateFile();
- 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(false);
- }
- }
- return bodySize;
- } catch (Exception e) {
- ActiveMQIOErrorException errorException = new ActiveMQIOErrorException();
- errorException.initCause(e);
- throw errorException;
- }
+ public SequentialFile getAppendFile() throws ActiveMQException {
+ return largeBody.getAppendFile();
}
@Override
@@ -473,93 +309,8 @@ public final class LargeServerMessageImpl extends CoreMessage implements LargeSe
}
public synchronized void ensureFileExists(boolean toOpen) throws ActiveMQException {
- try {
- if (file == null) {
- if (messageID <= 0) {
- throw new RuntimeException("MessageID not set on LargeMessage");
- }
-
- file = createFile();
-
- if (toOpen) {
- openFile();
- }
-
- bodySize = file.size();
- }
- } catch (Exception e) {
- // TODO: There is an IO_ERROR on trunk now, this should be used here instead
- throw new ActiveMQInternalErrorException(e.getMessage(), e);
- }
+ largeBody.ensureFileExists(toOpen);
}
- /**
- *
- */
- protected SequentialFile createFile() {
- return storageManager.createFileForLargeMessage(getMessageID(), durable);
- }
-
- protected void openFile() throws Exception {
- if (file == null) {
- validateFile();
- } else if (!file.isOpen()) {
- file.open();
- }
- }
-
- protected void closeFile() throws Exception {
- if (file != null && file.isOpen()) {
- file.close();
- }
- }
-
- // Inner classes -------------------------------------------------
-
- class DecodingContext implements LargeBodyEncoder {
-
- private SequentialFile cFile;
-
- @Override
- public void open() throws ActiveMQException {
- try {
- if (cFile != null && cFile.isOpen()) {
- cFile.close(false);
- }
- cFile = file.cloneFile();
- cFile.open();
- } catch (Exception e) {
- throw new ActiveMQException(ActiveMQExceptionType.INTERNAL_ERROR, e.getMessage(), e);
- }
- }
-
- @Override
- public void close() throws ActiveMQException {
- try {
- if (cFile != null) {
- cFile.close(false);
- }
- } catch (Exception e) {
- throw new ActiveMQInternalErrorException(e.getMessage(), e);
- }
- }
-
- @Override
- public int encode(final ByteBuffer bufferRead) throws ActiveMQException {
- try {
- return cFile.read(bufferRead);
- } catch (Exception e) {
- throw new ActiveMQInternalErrorException(e.getMessage(), e);
- }
- }
-
- /* (non-Javadoc)
- * @see org.apache.activemq.artemis.core.message.LargeBodyEncoder#getLargeBodySize()
- */
- @Override
- public long getLargeBodySize() throws ActiveMQException {
- return getBodySize();
- }
- }
}
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/LargeServerMessageInSync.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/LargeServerMessageInSync.java
index 3aeae4512d..62d5365e3d 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/LargeServerMessageInSync.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/LargeServerMessageInSync.java
@@ -50,7 +50,7 @@ public final class LargeServerMessageInSync implements ReplicatedLargeMessage {
public synchronized void joinSyncedData(ByteBuffer buffer) throws Exception {
if (deleted)
return;
- SequentialFile mainSeqFile = mainLM.getFile();
+ SequentialFile mainSeqFile = mainLM.getAppendFile();
if (!mainSeqFile.isOpen()) {
mainSeqFile.open();
}
@@ -80,19 +80,19 @@ public final class LargeServerMessageInSync implements ReplicatedLargeMessage {
}
public SequentialFile getSyncFile() throws ActiveMQException {
- return mainLM.getFile();
+ return mainLM.getAppendFile();
}
@Override
public Message setDurable(boolean durable) {
mainLM.setDurable(durable);
- return mainLM;
+ return mainLM.toMessage();
}
@Override
public synchronized Message setMessageID(long id) {
mainLM.setMessageID(id);
- return mainLM;
+ return mainLM.toMessage();
}
@Override
@@ -158,6 +158,16 @@ public final class LargeServerMessageInSync implements ReplicatedLargeMessage {
storageManager.addBytesToLargeMessage(appendFile, mainLM.getMessageID(), bytes);
}
+ @Override
+ public void clearPendingRecordID() {
+ mainLM.clearPendingRecordID();
+ }
+
+ @Override
+ public boolean hasPendingRecord() {
+ return mainLM.hasPendingRecord();
+ }
+
@Override
public void setPendingRecordID(long pendingRecordID) {
mainLM.setPendingRecordID(pendingRecordID);
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/codec/DeleteEncoding.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/codec/DeleteEncoding.java
index 3001edfa37..565d6fde49 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/codec/DeleteEncoding.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/codec/DeleteEncoding.java
@@ -40,7 +40,7 @@ public class DeleteEncoding implements EncodingSupport {
}
/* (non-Javadoc)
- * @see org.apache.activemq.artemis.core.journal.EncodingSupport#encode(org.apache.activemq.artemis.api.core.ActiveMQBuffer)
+ * @see org.apache.activemq.artemis.core.journal.EncodingSupport#readInto(org.apache.activemq.artemis.api.core.ActiveMQBuffer)
*/
@Override
public void encode(ActiveMQBuffer buffer) {
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/codec/LargeMessagePersister.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/codec/LargeMessagePersister.java
index 4e02f68c0b..1e9b3d4efb 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/codec/LargeMessagePersister.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/codec/LargeMessagePersister.java
@@ -19,13 +19,22 @@ package org.apache.activemq.artemis.core.persistence.impl.journal.codec;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
import org.apache.activemq.artemis.core.message.impl.CoreMessage;
+import org.apache.activemq.artemis.core.persistence.CoreMessageObjectPools;
import org.apache.activemq.artemis.core.persistence.Persister;
import org.apache.activemq.artemis.core.server.LargeServerMessage;
-public class LargeMessagePersister implements Persister {
+import static org.apache.activemq.artemis.core.persistence.PersisterIDs.CoreLargeMessagePersister_ID;
+
+public class LargeMessagePersister implements Persister {
+
+ public static final byte ID = CoreLargeMessagePersister_ID;
private static final LargeMessagePersister theInstance = new LargeMessagePersister();
+ @Override
+ public byte getID() {
+ return ID;
+ }
public static LargeMessagePersister getInstance() {
return theInstance;
@@ -38,7 +47,7 @@ public class LargeMessagePersister implements Persister redistribute(Message message,
Queue originatingQueue,
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/PostOfficeImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/PostOfficeImpl.java
index f35e590f29..bbebfae11d 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/PostOfficeImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/PostOfficeImpl.java
@@ -1042,8 +1042,6 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
final SimpleString address = context.getAddress(message);
- setPagingStore(address, message);
-
AtomicBoolean startedTX = new AtomicBoolean(false);
applyExpiryDelay(message, address);
@@ -1175,9 +1173,7 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
}
@Override
- public MessageReference reroute(final Message message, final Queue queue, final Transaction tx) throws Exception {
-
- setPagingStore(queue.getAddress(), message);
+ public MessageReference reload(final Message message, final Queue queue, final Transaction tx) throws Exception {
MessageReference reference = MessageReference.Factory.createReference(message, queue);
@@ -1189,9 +1185,7 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
}
}
- message.incrementDurableRefCount();
-
- message.incrementRefCount();
+ queue.durableUp(message);
if (tx == null) {
queue.reload(reference);
@@ -1229,7 +1223,7 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
try {
//this will cause large message file to be
//cleaned up
- copyRedistribute.decrementRefCount();
+ // copyRedistribute.refDown();
} catch (Exception e) {
logger.warn("Failed to clean up message: " + copyRedistribute);
}
@@ -1387,12 +1381,6 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
// Private -----------------------------------------------------------------
- private void setPagingStore(SimpleString address, Message message) throws Exception {
- PagingStore store = pagingManager.getPageStore(CompositeAddress.extractAddressName(address));
-
- message.setContext(store);
- }
-
private void routeQueueInfo(final Message message, final Queue queue, final boolean applyFilters) throws Exception {
if (!applyFilters || queue.getFilter() == null || queue.getFilter().match(message)) {
RoutingContext context = new RoutingContextImpl(null);
@@ -1462,7 +1450,7 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
}
refs.add(reference);
- message.incrementRefCount();
+ queue.refUp(message);
}
Iterator iter = entry.getValue().getDurableQueues().iterator();
@@ -1485,7 +1473,7 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
refs.add(reference);
if (message.isDurable()) {
- int durableRefCount = message.incrementDurableRefCount();
+ int durableRefCount = queue.durableUp(message);
if (durableRefCount == 1) {
if (tx != null) {
@@ -1514,9 +1502,9 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
storageManager.updateScheduledDeliveryTime(reference);
}
}
+ } else {
+ queue.refUp(message);
}
-
- message.incrementRefCount();
}
}
@@ -1623,7 +1611,7 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
if (!cacheBridge.atomicVerify(bridgeDupBytes, context.getTransaction())) {
context.getTransaction().rollback();
startedTX.set(false);
- message.decrementRefCount();
+ message.usageDown(); // this will cause large message delete
return false;
}
} else {
@@ -1649,7 +1637,7 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
context.getTransaction().markAsRollbackOnly(new ActiveMQDuplicateIdException(warnMessage));
}
- message.decrementRefCount();
+ message.usageDown(); // this will cause large message delete
return false;
}
@@ -1836,10 +1824,10 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
Message message = ref.getMessage();
if (message.isDurable() && ref.getQueue().isDurable()) {
- message.decrementDurableRefCount();
+ ref.getQueue().durableDown(message);
+ } else {
+ ref.getQueue().refDown(message);
}
-
- message.decrementRefCount();
}
}
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/ServerSessionPacketHandler.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/ServerSessionPacketHandler.java
index 5a731fbd0b..058d636dff 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/ServerSessionPacketHandler.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/ServerSessionPacketHandler.java
@@ -26,6 +26,7 @@ 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.ActiveMQQueueMaxConsumerLimitReached;
+import org.apache.activemq.artemis.api.core.ICoreMessage;
import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.api.core.SimpleString;
@@ -699,7 +700,7 @@ public class ServerSessionPacketHandler implements ChannelHandler {
try {
final SessionSendMessage message = (SessionSendMessage) packet;
requiresResponse = message.isRequiresResponse();
- this.session.send(EmbedMessageUtil.extractEmbedded(message.getMessage()), this.direct);
+ this.session.send(EmbedMessageUtil.extractEmbedded(message.getMessage(), storageManager), this.direct);
if (requiresResponse) {
response = createNullResponseMessage(packet);
}
@@ -1026,12 +1027,12 @@ public class ServerSessionPacketHandler implements ChannelHandler {
currentLargeMessage.releaseResources(true);
if (messageBodySize >= 0) {
- currentLargeMessage.putLongProperty(Message.HDR_LARGE_BODY_SIZE, messageBodySize);
+ currentLargeMessage.toMessage().putLongProperty(Message.HDR_LARGE_BODY_SIZE, messageBodySize);
}
LargeServerMessage message = currentLargeMessage;
currentLargeMessage = null;
- session.doSend(session.getCurrentTransaction(), message, null, false, false);
+ session.doSend(session.getCurrentTransaction(), EmbedMessageUtil.extractEmbedded((ICoreMessage)message.toMessage(), storageManager), null, false, false);
}
}
}
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/CoreProtocolManagerFactory.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/CoreProtocolManagerFactory.java
index 6d5e3520c7..75909246e0 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/CoreProtocolManagerFactory.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/CoreProtocolManagerFactory.java
@@ -23,7 +23,6 @@ import org.apache.activemq.artemis.api.core.BaseInterceptor;
import org.apache.activemq.artemis.api.core.Interceptor;
import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.client.ActiveMQClient;
-import org.apache.activemq.artemis.core.message.impl.CoreMessageObjectPools;
import org.apache.activemq.artemis.core.message.impl.CoreMessagePersister;
import org.apache.activemq.artemis.core.persistence.Persister;
import org.apache.activemq.artemis.core.server.ActiveMQServer;
@@ -38,7 +37,7 @@ public class CoreProtocolManagerFactory extends AbstractProtocolManagerFactory[] getPersister() {
+ public Persister[] getPersister() {
return new Persister[]{CoreMessagePersister.getInstance()};
}
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/CoreSessionCallback.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/CoreSessionCallback.java
index f53d028981..ad0c320441 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/CoreSessionCallback.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/CoreSessionCallback.java
@@ -18,7 +18,7 @@ package org.apache.activemq.artemis.core.protocol.core.impl;
import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
-import org.apache.activemq.artemis.core.message.impl.CoreMessageObjectPools;
+import org.apache.activemq.artemis.core.persistence.CoreMessageObjectPools;
import org.apache.activemq.artemis.core.protocol.core.Channel;
import org.apache.activemq.artemis.core.protocol.core.Packet;
import org.apache.activemq.artemis.core.protocol.core.ServerSessionPacketHandler;
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/replication/ReplicatedLargeMessage.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/replication/ReplicatedLargeMessage.java
index 06fb19600a..d63167fe9c 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/replication/ReplicatedLargeMessage.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/replication/ReplicatedLargeMessage.java
@@ -52,8 +52,12 @@ public interface ReplicatedLargeMessage {
*/
void addBytes(byte[] body) throws Exception;
+ void clearPendingRecordID();
+
void setPendingRecordID(long pendingRecordID);
long getPendingRecordID();
+ boolean hasPendingRecord();
+
}
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/CoreLargeServerMessage.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/CoreLargeServerMessage.java
new file mode 100644
index 0000000000..7794228d9a
--- /dev/null
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/CoreLargeServerMessage.java
@@ -0,0 +1,26 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.activemq.artemis.core.server;
+
+/**
+ * This is a tagging interface,
+ * as we need to make sure the LargeMessage is a core large message is certain places.
+ */
+public interface CoreLargeServerMessage extends LargeServerMessage {
+
+}
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/LargeServerMessage.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/LargeServerMessage.java
index 8fc3444cfb..9175781005 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/LargeServerMessage.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/LargeServerMessage.java
@@ -18,19 +18,26 @@ package org.apache.activemq.artemis.core.server;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
import org.apache.activemq.artemis.api.core.ActiveMQException;
-import org.apache.activemq.artemis.api.core.ICoreMessage;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.core.io.SequentialFile;
+import org.apache.activemq.artemis.core.message.LargeBodyReader;
+import org.apache.activemq.artemis.core.persistence.StorageManager;
+import org.apache.activemq.artemis.core.persistence.impl.journal.LargeBody;
import org.apache.activemq.artemis.core.replication.ReplicatedLargeMessage;
-public interface LargeServerMessage extends ReplicatedLargeMessage, ICoreMessage {
+public interface LargeServerMessage extends ReplicatedLargeMessage {
- long NO_PENDING_ID = -1;
+ Message toMessage();
+
+ StorageManager getStorageManager();
@Override
void addBytes(byte[] bytes) throws Exception;
void addBytes(ActiveMQBuffer bytes) throws Exception;
+ long getMessageID();
+
/**
* We have to copy the large message content in case of DLQ and paged messages
* For that we need to pre-mark the LargeMessage with a flag when it is paged
@@ -46,13 +53,16 @@ public interface LargeServerMessage extends ReplicatedLargeMessage, ICoreMessage
@Override
void deleteFile() throws Exception;
- void incrementDelayDeletionCount();
-
- void decrementDelayDeletionCount() throws Exception;
-
/**
+ * This will return the File suitable for appending the message
* @return
* @throws ActiveMQException
*/
- SequentialFile getFile() throws ActiveMQException;
+ SequentialFile getAppendFile() throws ActiveMQException;
+
+ LargeBodyReader getLargeBodyReader() throws ActiveMQException;
+
+ LargeBody getLargeBody();
+
+ void finishParse() throws Exception;
}
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/Queue.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/Queue.java
index 4d769f2751..ee370246b3 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/Queue.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/Queue.java
@@ -27,6 +27,7 @@ import org.apache.activemq.artemis.api.core.Pair;
import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.filter.Filter;
+import org.apache.activemq.artemis.core.paging.PagingStore;
import org.apache.activemq.artemis.core.paging.cursor.PageSubscription;
import org.apache.activemq.artemis.core.persistence.OperationContext;
import org.apache.activemq.artemis.core.postoffice.Binding;
@@ -48,6 +49,8 @@ public interface Queue extends Bindable,CriticalComponent {
void setFilter(Filter filter);
+ PagingStore getPagingStore();
+
PageSubscription getPageSubscription();
RoutingType getRoutingType();
@@ -60,6 +63,15 @@ public interface Queue extends Bindable,CriticalComponent {
boolean isDurable();
+ int durableUp(Message message);
+
+ int durableDown(Message message);
+
+ void refUp(Message message);
+
+ void refDown(Message message);
+
+
/**
* The queue definition could be durable, but the messages could eventually be considered non durable.
* (e.g. purgeOnNoConsumers)
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/QueueConfig.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/QueueConfig.java
index e5b9bb6fea..74aa5d42bf 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/QueueConfig.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/QueueConfig.java
@@ -31,6 +31,7 @@ public final class QueueConfig {
private final SimpleString address;
private final SimpleString name;
private final Filter filter;
+ final PagingStore pagingStore;
private final PageSubscription pageSubscription;
private final SimpleString user;
private final boolean durable;
@@ -259,10 +260,11 @@ public final class QueueConfig {
* @throws IllegalStateException if the creation of {@link PageSubscription} fails
*/
public QueueConfig build() {
+ final PagingStore pageStore;
final PageSubscription pageSubscription;
if (pagingManager != null && !FilterUtils.isTopicIdentification(filter)) {
try {
- final PagingStore pageStore = this.pagingManager.getPageStore(address);
+ pageStore = this.pagingManager.getPageStore(address);
if (pageStore != null) {
pageSubscription = pageStore.getCursorProvider().createSubscription(id, filter, durable);
} else {
@@ -273,8 +275,9 @@ public final class QueueConfig {
}
} else {
pageSubscription = null;
+ pageStore = null;
}
- return new QueueConfig(id, address, name, filter, pageSubscription, user, durable, temporary, autoCreated, routingType, maxConsumers, exclusive, lastValue, lastValueKey, nonDestructive, consumersBeforeDispatch, delayBeforeDispatch, purgeOnNoConsumers, groupRebalance, groupBuckets, groupFirstKey, autoDelete, autoDeleteDelay, autoDeleteMessageCount, ringSize, configurationManaged);
+ return new QueueConfig(id, address, name, filter, pageStore, pageSubscription, user, durable, temporary, autoCreated, routingType, maxConsumers, exclusive, lastValue, lastValueKey, nonDestructive, consumersBeforeDispatch, delayBeforeDispatch, purgeOnNoConsumers, groupRebalance, groupBuckets, groupFirstKey, autoDelete, autoDeleteDelay, autoDeleteMessageCount, ringSize, configurationManaged);
}
}
@@ -311,6 +314,7 @@ public final class QueueConfig {
final SimpleString address,
final SimpleString name,
final Filter filter,
+ final PagingStore pagingStore,
final PageSubscription pageSubscription,
final SimpleString user,
final boolean durable,
@@ -337,6 +341,7 @@ public final class QueueConfig {
this.address = address;
this.name = name;
this.filter = filter;
+ this.pagingStore = pagingStore;
this.pageSubscription = pageSubscription;
this.user = user;
this.durable = durable;
@@ -465,6 +470,10 @@ public final class QueueConfig {
return ringSize;
}
+ public PagingStore getPagingStore() {
+ return pagingStore;
+ }
+
@Override
public boolean equals(Object o) {
if (this == o)
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/impl/BridgeImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/impl/BridgeImpl.java
index c43610ed9b..8a34ca375e 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/impl/BridgeImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/impl/BridgeImpl.java
@@ -32,6 +32,7 @@ import org.apache.activemq.artemis.api.core.ActiveMQExceptionType;
import org.apache.activemq.artemis.api.core.ActiveMQInterruptedException;
import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.Pair;
+import org.apache.activemq.artemis.api.core.RefCountMessage;
import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.api.core.TransportConfiguration;
@@ -552,6 +553,7 @@ public class BridgeImpl implements Bridge, SessionFailureListener, SendAcknowled
/* Hook for processing message before forwarding */
protected Message beforeForward(Message message, final SimpleString forwardingAddress) {
message = message.copy();
+ ((RefCountMessage)message).setParentRef((RefCountMessage)message);
return beforeForwardingNoCopy(message, forwardingAddress);
}
@@ -662,10 +664,10 @@ public class BridgeImpl implements Bridge, SessionFailureListener, SendAcknowled
final HandleStatus status;
if (message.isLargeMessage()) {
deliveringLargeMessage = true;
- deliverLargeMessage(dest, ref, (LargeServerMessage) message);
+ deliverLargeMessage(dest, ref, (LargeServerMessage) message, ref.getMessage());
status = HandleStatus.HANDLED;
} else {
- status = deliverStandardMessage(dest, ref, message);
+ status = deliverStandardMessage(dest, ref, message, ref.getMessage());
}
//Only increment messages pending acknowledgement if handled by bridge
@@ -764,12 +766,13 @@ public class BridgeImpl implements Bridge, SessionFailureListener, SendAcknowled
private void deliverLargeMessage(final SimpleString dest,
final MessageReference ref,
- final LargeServerMessage message) {
+ final LargeServerMessage message,
+ final Message originalMessage) {
executor.execute(new Runnable() {
@Override
public void run() {
try {
- producer.send(dest, message);
+ producer.send(dest, message.toMessage());
// as soon as we are done sending the large message
// we unset the delivery flag and we will call the deliveryAsync on the queue
@@ -794,7 +797,7 @@ public class BridgeImpl implements Bridge, SessionFailureListener, SendAcknowled
* @param message
* @return
*/
- private HandleStatus deliverStandardMessage(SimpleString dest, final MessageReference ref, Message message) {
+ private HandleStatus deliverStandardMessage(SimpleString dest, final MessageReference ref, Message message, Message originalMessage) {
// if we failover during send then there is a chance that the
// that this will throw a disconnect, we need to remove the message
// from the acks so it will get resent, duplicate detection will cope
@@ -821,6 +824,8 @@ public class BridgeImpl implements Bridge, SessionFailureListener, SendAcknowled
connectionFailed(e, false);
return HandleStatus.BUSY;
+ } finally {
+ originalMessage.usageDown();
}
return HandleStatus.HANDLED;
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/LastValueQueue.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/LastValueQueue.java
index 63044b6e63..5a269ab513 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/LastValueQueue.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/LastValueQueue.java
@@ -28,6 +28,7 @@ import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.filter.Filter;
+import org.apache.activemq.artemis.core.paging.PagingStore;
import org.apache.activemq.artemis.core.paging.cursor.PageSubscription;
import org.apache.activemq.artemis.core.persistence.StorageManager;
import org.apache.activemq.artemis.core.postoffice.PostOffice;
@@ -60,6 +61,7 @@ public class LastValueQueue extends QueueImpl {
final SimpleString address,
final SimpleString name,
final Filter filter,
+ final PagingStore pagingStore,
final PageSubscription pageSubscription,
final SimpleString user,
final boolean durable,
@@ -87,7 +89,7 @@ public class LastValueQueue extends QueueImpl {
final ArtemisExecutor executor,
final ActiveMQServer server,
final QueueFactory factory) {
- super(persistenceID, address, name, filter, pageSubscription, user, durable, temporary, autoCreated, routingType, maxConsumers, exclusive, groupRebalance, groupBuckets, groupFirstKey, nonDestructive, consumersBeforeDispatch, delayBeforeDispatch, purgeOnNoConsumers, autoDelete, autoDeleteDelay, autoDeleteMessageCount, configurationManaged, scheduledExecutor, postOffice, storageManager, addressSettingsRepository, executor, server, factory);
+ super(persistenceID, address, name, filter, pagingStore, pageSubscription, user, durable, temporary, autoCreated, routingType, maxConsumers, exclusive, groupRebalance, groupBuckets, groupFirstKey, nonDestructive, consumersBeforeDispatch, delayBeforeDispatch, purgeOnNoConsumers, autoDelete, autoDeleteDelay, autoDeleteMessageCount, configurationManaged, scheduledExecutor, postOffice, storageManager, addressSettingsRepository, executor, server, factory);
this.lastValueKey = lastValueKey;
}
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/PostOfficeJournalLoader.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/PostOfficeJournalLoader.java
index c18835cd9a..26be7dce8e 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/PostOfficeJournalLoader.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/PostOfficeJournalLoader.java
@@ -238,7 +238,7 @@ public class PostOfficeJournalLoader implements JournalLoader {
record.getMessage().setScheduledDeliveryTime(scheduledDeliveryTime);
}
- MessageReference ref = postOffice.reroute(record.getMessage(), queue, null);
+ MessageReference ref = postOffice.reload(record.getMessage(), queue, null);
ref.setDeliveryCount(record.getDeliveryCount());
@@ -252,7 +252,7 @@ public class PostOfficeJournalLoader implements JournalLoader {
@Override
public void handleNoMessageReferences(Map messages) {
for (Message msg : messages.values()) {
- if (msg.getRefCount() == 0) {
+ if (msg.getRefCount() == 0 && msg.getDurableCount() == 0) {
ActiveMQServerLogger.LOGGER.journalUnreferencedMessage(msg.getMessageID());
try {
storageManager.deleteMessage(msg.getMessageID());
@@ -308,7 +308,7 @@ public class PostOfficeJournalLoader implements JournalLoader {
ActiveMQServerLogger.LOGGER.journalMessageInPreparedTX(queueID);
return;
}
- postOffice.reroute(message, queue, tx);
+ postOffice.reload(message, queue, tx);
}
@Override
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/QueueFactoryImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/QueueFactoryImpl.java
index f4ad91d389..ecfc86d29f 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/QueueFactoryImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/QueueFactoryImpl.java
@@ -75,9 +75,9 @@ public class QueueFactoryImpl implements QueueFactory {
public Queue createQueueWith(final QueueConfig config) {
final Queue queue;
if (lastValueKey(config) != null) {
- queue = new LastValueQueue(config.id(), config.address(), config.name(), config.filter(), config.pageSubscription(), config.user(), config.isDurable(), config.isTemporary(), config.isAutoCreated(), config.deliveryMode(), config.maxConsumers(), config.isExclusive(), config.isGroupRebalance(), config.getGroupBuckets(), config.getGroupFirstKey(), config.consumersBeforeDispatch(), config.delayBeforeDispatch(), config.isPurgeOnNoConsumers(), lastValueKey(config), config.isNonDestructive(), config.isAutoDelete(), config.getAutoDeleteDelay(), config.getAutoDeleteMessageCount(), config.isConfigurationManaged(), scheduledExecutor, postOffice, storageManager, addressSettingsRepository, executorFactory.getExecutor(), server, this);
+ queue = new LastValueQueue(config.id(), config.address(), config.name(), config.filter(), config.getPagingStore(), config.pageSubscription(), config.user(), config.isDurable(), config.isTemporary(), config.isAutoCreated(), config.deliveryMode(), config.maxConsumers(), config.isExclusive(), config.isGroupRebalance(), config.getGroupBuckets(), config.getGroupFirstKey(), config.consumersBeforeDispatch(), config.delayBeforeDispatch(), config.isPurgeOnNoConsumers(), lastValueKey(config), config.isNonDestructive(), config.isAutoDelete(), config.getAutoDeleteDelay(), config.getAutoDeleteMessageCount(), config.isConfigurationManaged(), scheduledExecutor, postOffice, storageManager, addressSettingsRepository, executorFactory.getExecutor(), server, this);
} else {
- queue = new QueueImpl(config.id(), config.address(), config.name(), config.filter(), config.pageSubscription(), config.user(), config.isDurable(), config.isTemporary(), config.isAutoCreated(), config.deliveryMode(), config.maxConsumers(), config.isExclusive(), config.isGroupRebalance(), config.getGroupBuckets(), config.getGroupFirstKey(), config.isNonDestructive(), config.consumersBeforeDispatch(), config.delayBeforeDispatch(), config.isPurgeOnNoConsumers(), config.isAutoDelete(), config.getAutoDeleteDelay(), config.getAutoDeleteMessageCount(), config.isConfigurationManaged(), config.getRingSize(), scheduledExecutor, postOffice, storageManager, addressSettingsRepository, executorFactory.getExecutor(), server, this);
+ queue = new QueueImpl(config.id(), config.address(), config.name(), config.filter(), config.getPagingStore(), config.pageSubscription(), config.user(), config.isDurable(), config.isTemporary(), config.isAutoCreated(), config.deliveryMode(), config.maxConsumers(), config.isExclusive(), config.isGroupRebalance(), config.getGroupBuckets(), config.getGroupFirstKey(), config.isNonDestructive(), config.consumersBeforeDispatch(), config.delayBeforeDispatch(), config.isPurgeOnNoConsumers(), config.isAutoDelete(), config.getAutoDeleteDelay(), config.getAutoDeleteMessageCount(), config.isConfigurationManaged(), config.getRingSize(), scheduledExecutor, postOffice, storageManager, addressSettingsRepository, executorFactory.getExecutor(), server, this);
}
server.getCriticalAnalyzer().add(queue);
return queue;
@@ -102,9 +102,9 @@ public class QueueFactoryImpl implements QueueFactory {
Queue queue;
if (lastValueKey(addressSettings) != null) {
- queue = new LastValueQueue(persistenceID, address, name, filter, pageSubscription, user, durable, temporary, autoCreated, ActiveMQDefaultConfiguration.getDefaultRoutingType(), ActiveMQDefaultConfiguration.getDefaultMaxQueueConsumers(), ActiveMQDefaultConfiguration.getDefaultExclusive(), ActiveMQDefaultConfiguration.getDefaultGroupRebalance(), ActiveMQDefaultConfiguration.getDefaultGroupBuckets(), ActiveMQDefaultConfiguration.getDefaultGroupFirstKey(), ActiveMQDefaultConfiguration.getDefaultConsumersBeforeDispatch(), ActiveMQDefaultConfiguration.getDefaultDelayBeforeDispatch(), ActiveMQDefaultConfiguration.getDefaultPurgeOnNoConsumers(), lastValueKey(addressSettings), ActiveMQDefaultConfiguration.getDefaultNonDestructive(), ActiveMQDefaultConfiguration.getDefaultQueueAutoDelete(autoCreated), ActiveMQDefaultConfiguration.getDefaultQueueAutoDeleteDelay(), ActiveMQDefaultConfiguration.getDefaultQueueAutoDeleteMessageCount(),false, scheduledExecutor, postOffice, storageManager, addressSettingsRepository, executorFactory.getExecutor(), server, this);
+ queue = new LastValueQueue(persistenceID, address, name, filter, pageSubscription == null ? null : pageSubscription.getPagingStore(), pageSubscription, user, durable, temporary, autoCreated, ActiveMQDefaultConfiguration.getDefaultRoutingType(), ActiveMQDefaultConfiguration.getDefaultMaxQueueConsumers(), ActiveMQDefaultConfiguration.getDefaultExclusive(), ActiveMQDefaultConfiguration.getDefaultGroupRebalance(), ActiveMQDefaultConfiguration.getDefaultGroupBuckets(), ActiveMQDefaultConfiguration.getDefaultGroupFirstKey(), ActiveMQDefaultConfiguration.getDefaultConsumersBeforeDispatch(), ActiveMQDefaultConfiguration.getDefaultDelayBeforeDispatch(), ActiveMQDefaultConfiguration.getDefaultPurgeOnNoConsumers(), lastValueKey(addressSettings), ActiveMQDefaultConfiguration.getDefaultNonDestructive(), ActiveMQDefaultConfiguration.getDefaultQueueAutoDelete(autoCreated), ActiveMQDefaultConfiguration.getDefaultQueueAutoDeleteDelay(), ActiveMQDefaultConfiguration.getDefaultQueueAutoDeleteMessageCount(),false, scheduledExecutor, postOffice, storageManager, addressSettingsRepository, executorFactory.getExecutor(), server, this);
} else {
- queue = new QueueImpl(persistenceID, address, name, filter, pageSubscription, user, durable, temporary, autoCreated, scheduledExecutor, postOffice, storageManager, addressSettingsRepository, executorFactory.getExecutor(), server, this);
+ queue = new QueueImpl(persistenceID, address, name, filter, pageSubscription == null ? null : pageSubscription.getPagingStore(), pageSubscription, user, durable, temporary, autoCreated, scheduledExecutor, postOffice, storageManager, addressSettingsRepository, executorFactory.getExecutor(), server, this);
}
server.getCriticalAnalyzer().add(queue);
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/QueueImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/QueueImpl.java
index b21e1a2e3b..53b701ebe1 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/QueueImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/QueueImpl.java
@@ -56,6 +56,7 @@ import org.apache.activemq.artemis.api.core.management.ResourceNames;
import org.apache.activemq.artemis.core.PriorityAware;
import org.apache.activemq.artemis.core.filter.Filter;
import org.apache.activemq.artemis.core.io.IOCallback;
+import org.apache.activemq.artemis.core.paging.PagingStore;
import org.apache.activemq.artemis.core.paging.cursor.PageIterator;
import org.apache.activemq.artemis.core.paging.cursor.PagePosition;
import org.apache.activemq.artemis.core.paging.cursor.PageSubscription;
@@ -168,6 +169,8 @@ public class QueueImpl extends CriticalComponentImpl implements Queue {
private volatile boolean queueDestroyed = false;
+ private final PagingStore pagingStore;
+
private final PageSubscription pageSubscription;
private ReferenceCounter refCountForConsumers;
@@ -370,32 +373,34 @@ public class QueueImpl extends CriticalComponentImpl implements Queue {
final ArtemisExecutor executor,
final ActiveMQServer server,
final QueueFactory factory) {
- this(id, address, name, filter, null, user, durable, temporary, autoCreated, scheduledExecutor, postOffice, storageManager, addressSettingsRepository, executor, server, factory);
- }
-
- public QueueImpl(final long id,
- final SimpleString address,
- final SimpleString name,
- final Filter filter,
- final PageSubscription pageSubscription,
- final SimpleString user,
- final boolean durable,
- final boolean temporary,
- final boolean autoCreated,
- final ScheduledExecutorService scheduledExecutor,
- final PostOffice postOffice,
- final StorageManager storageManager,
- final HierarchicalRepository addressSettingsRepository,
- final ArtemisExecutor executor,
- final ActiveMQServer server,
- final QueueFactory factory) {
- this(id, address, name, filter, pageSubscription, user, durable, temporary, autoCreated, RoutingType.MULTICAST, null, null, scheduledExecutor, postOffice, storageManager, addressSettingsRepository, executor, server, factory);
+ this(id, address, name, filter, null, null, user, durable, temporary, autoCreated, scheduledExecutor, postOffice, storageManager, addressSettingsRepository, executor, server, factory);
+ }
+
+ public QueueImpl(final long id,
+ final SimpleString address,
+ final SimpleString name,
+ final Filter filter,
+ final PagingStore pagingStore,
+ final PageSubscription pageSubscription,
+ final SimpleString user,
+ final boolean durable,
+ final boolean temporary,
+ final boolean autoCreated,
+ final ScheduledExecutorService scheduledExecutor,
+ final PostOffice postOffice,
+ final StorageManager storageManager,
+ final HierarchicalRepository addressSettingsRepository,
+ final ArtemisExecutor executor,
+ final ActiveMQServer server,
+ final QueueFactory factory) {
+ this(id, address, name, filter, pagingStore, pageSubscription, user, durable, temporary, autoCreated, RoutingType.MULTICAST, null, null, scheduledExecutor, postOffice, storageManager, addressSettingsRepository, executor, server, factory);
}
public QueueImpl(final long id,
final SimpleString address,
final SimpleString name,
final Filter filter,
+ final PagingStore pagingStore,
final PageSubscription pageSubscription,
final SimpleString user,
final boolean durable,
@@ -411,13 +416,14 @@ public class QueueImpl extends CriticalComponentImpl implements Queue {
final ArtemisExecutor executor,
final ActiveMQServer server,
final QueueFactory factory) {
- this(id, address, name, filter, pageSubscription, user, durable, temporary, autoCreated, routingType, maxConsumers, null, purgeOnNoConsumers, scheduledExecutor, postOffice, storageManager, addressSettingsRepository, executor, server, factory);
+ this(id, address, name, filter, pagingStore, pageSubscription, user, durable, temporary, autoCreated, routingType, maxConsumers, null, purgeOnNoConsumers, scheduledExecutor, postOffice, storageManager, addressSettingsRepository, executor, server, factory);
}
public QueueImpl(final long id,
final SimpleString address,
final SimpleString name,
final Filter filter,
+ final PagingStore pagingStore,
final PageSubscription pageSubscription,
final SimpleString user,
final boolean durable,
@@ -434,13 +440,14 @@ public class QueueImpl extends CriticalComponentImpl implements Queue {
final ArtemisExecutor executor,
final ActiveMQServer server,
final QueueFactory factory) {
- this(id, address, name, filter, pageSubscription, user, durable, temporary, autoCreated, routingType, maxConsumers, exclusive, null, null, false, null, null, purgeOnNoConsumers, null, null, null, false, scheduledExecutor, postOffice, storageManager, addressSettingsRepository, executor, server, factory);
+ this(id, address, name, filter, pagingStore, pageSubscription, user, durable, temporary, autoCreated, routingType, maxConsumers, exclusive, null, null, false, null, null, purgeOnNoConsumers, null, null, null, false, scheduledExecutor, postOffice, storageManager, addressSettingsRepository, executor, server, factory);
}
public QueueImpl(final long id,
final SimpleString address,
final SimpleString name,
final Filter filter,
+ final PagingStore pagingStore,
final PageSubscription pageSubscription,
final SimpleString user,
final boolean durable,
@@ -466,13 +473,14 @@ public class QueueImpl extends CriticalComponentImpl implements Queue {
final ArtemisExecutor executor,
final ActiveMQServer server,
final QueueFactory factory) {
- this(id, address, name, filter, pageSubscription, user, durable, temporary, autoCreated, routingType, maxConsumers, exclusive, groupRebalance, groupBuckets, null, nonDestructive, consumersBeforeDispatch, delayBeforeDispatch, purgeOnNoConsumers, autoDelete, autoDeleteDelay, autoDeleteMessageCount, configurationManaged, scheduledExecutor, postOffice, storageManager, addressSettingsRepository, executor, server, factory);
+ this(id, address, name, filter, pagingStore, pageSubscription, user, durable, temporary, autoCreated, routingType, maxConsumers, exclusive, groupRebalance, groupBuckets, null, nonDestructive, consumersBeforeDispatch, delayBeforeDispatch, purgeOnNoConsumers, autoDelete, autoDeleteDelay, autoDeleteMessageCount, configurationManaged, scheduledExecutor, postOffice, storageManager, addressSettingsRepository, executor, server, factory);
}
public QueueImpl(final long id,
final SimpleString address,
final SimpleString name,
final Filter filter,
+ final PagingStore pagingStore,
final PageSubscription pageSubscription,
final SimpleString user,
final boolean durable,
@@ -499,13 +507,14 @@ public class QueueImpl extends CriticalComponentImpl implements Queue {
final ArtemisExecutor executor,
final ActiveMQServer server,
final QueueFactory factory) {
- this(id, address, name, filter, pageSubscription, user, durable, temporary, autoCreated, routingType, maxConsumers, exclusive, groupRebalance, groupBuckets, groupFirstKey, nonDestructive, consumersBeforeDispatch, delayBeforeDispatch, purgeOnNoConsumers, autoDelete, autoDeleteDelay, autoDeleteMessageCount, configurationManaged, null, scheduledExecutor, postOffice, storageManager, addressSettingsRepository, executor, server, factory);
+ this(id, address, name, filter, pagingStore, pageSubscription, user, durable, temporary, autoCreated, routingType, maxConsumers, exclusive, groupRebalance, groupBuckets, groupFirstKey, nonDestructive, consumersBeforeDispatch, delayBeforeDispatch, purgeOnNoConsumers, autoDelete, autoDeleteDelay, autoDeleteMessageCount, configurationManaged, null, scheduledExecutor, postOffice, storageManager, addressSettingsRepository, executor, server, factory);
}
public QueueImpl(final long id,
final SimpleString address,
final SimpleString name,
final Filter filter,
+ final PagingStore pagingStore,
final PageSubscription pageSubscription,
final SimpleString user,
final boolean durable,
@@ -547,6 +556,8 @@ public class QueueImpl extends CriticalComponentImpl implements Queue {
this.filter = filter;
+ this.pagingStore = pagingStore;
+
this.pageSubscription = pageSubscription;
this.propertyDurable = durable;
@@ -868,6 +879,47 @@ public class QueueImpl extends CriticalComponentImpl implements Queue {
return id;
}
+
+ @Override
+ public int durableUp(Message message) {
+ int count = message.durableUp();
+ if (pagingStore != null) {
+ pagingStore.durableUp(message, count);
+ }
+ return count;
+ }
+
+ @Override
+ public int durableDown(Message message) {
+ int count = message.durableDown();
+ if (pagingStore != null) {
+ pagingStore.durableDown(message, count);
+ }
+ return count;
+ }
+
+ @Override
+ public void refUp(Message message) {
+ int count = message.refUp();
+ if (pagingStore != null) {
+ pagingStore.refUp(message, count);
+ }
+
+ }
+
+ @Override
+ public void refDown(Message message) {
+ int count = message.refDown();
+ if (pagingStore != null) {
+ pagingStore.refDown(message, count);
+ }
+ }
+
+ @Override
+ public PagingStore getPagingStore() {
+ return pagingStore;
+ }
+
@Override
public PageSubscription getPageSubscription() {
return pageSubscription;
@@ -3654,14 +3706,8 @@ public class QueueImpl extends CriticalComponentImpl implements Queue {
boolean durableRef = message.isDurable() && queue.isDurable();
- try {
- message.decrementRefCount();
- } catch (Exception e) {
- ActiveMQServerLogger.LOGGER.errorDecrementingRefCount(e);
- }
-
if (durableRef) {
- int count = message.decrementDurableRefCount();
+ int count = queue.durableDown(message);
if (count == 0) {
// Note - we MUST store the delete after the preceding ack has been committed to storage, we cannot combine
@@ -3684,6 +3730,8 @@ public class QueueImpl extends CriticalComponentImpl implements Queue {
ActiveMQServerLogger.LOGGER.errorRemovingMessage(e, message.getMessageID());
}
}
+ } else {
+ queue.refDown(message);
}
}
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/RefsOperation.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/RefsOperation.java
index d3cd425701..355bcd9ee1 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/RefsOperation.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/RefsOperation.java
@@ -23,7 +23,6 @@ import java.util.List;
import java.util.Map;
import org.apache.activemq.artemis.api.core.Message;
-import org.apache.activemq.artemis.core.paging.cursor.NonExistentPage;
import org.apache.activemq.artemis.core.paging.cursor.PagedReference;
import org.apache.activemq.artemis.core.persistence.StorageManager;
import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
@@ -134,7 +133,7 @@ public class RefsOperation extends TransactionOperationAbstract {
for (MessageReference ref : ackedRefs) {
Message message = ref.getMessage();
if (message.isDurable()) {
- int durableRefCount = message.incrementDurableRefCount();
+ int durableRefCount = ref.getQueue().durableUp(ref.getMessage());
if (durableRefCount == 1) {
storageManager.storeMessageTransactional(ackedTX.getID(), message);
@@ -146,7 +145,8 @@ public class RefsOperation extends TransactionOperationAbstract {
ackedTX.setContainsPersistent();
}
- message.incrementRefCount();
+ // TODO-NOW: THIS MUST BE SOLVED BEFORE MERGED, DO NOT LET ME COMMIT THIS WITHOUT REVIEW
+ queue.refUp(message);
}
ackedTX.commit(true);
} catch (Exception e) {
@@ -190,7 +190,7 @@ public class RefsOperation extends TransactionOperationAbstract {
for (MessageReference refmsg : pagedMessagesToPostACK) {
((PagedReference)refmsg).removePendingFlag();
if (((PagedReference) refmsg).isLargeMessage()) {
- decrementRefCount(refmsg);
+ refmsg.getQueue().refDown(refmsg.getMessage());
}
}
}
@@ -202,17 +202,6 @@ public class RefsOperation extends TransactionOperationAbstract {
}
}
- private void decrementRefCount(MessageReference refmsg) {
- try {
- refmsg.getMessage().decrementRefCount();
- } catch (NonExistentPage e) {
- // This could happen on after commit, since the page could be deleted on file earlier by another thread
- logger.debug(e);
- } catch (Exception e) {
- ActiveMQServerLogger.LOGGER.failedToDecrementMessageReferenceCount(e);
- }
- }
-
@Override
public synchronized List getRelatedMessageReferences() {
List listRet = new LinkedList<>();
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 bb611cb910..2f4078e286 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
@@ -39,7 +39,7 @@ import org.apache.activemq.artemis.api.core.management.CoreNotificationType;
import org.apache.activemq.artemis.api.core.management.ManagementHelper;
import org.apache.activemq.artemis.core.client.impl.ClientConsumerImpl;
import org.apache.activemq.artemis.core.filter.Filter;
-import org.apache.activemq.artemis.core.message.LargeBodyEncoder;
+import org.apache.activemq.artemis.core.message.LargeBodyReader;
import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import org.apache.activemq.artemis.core.persistence.StorageManager;
import org.apache.activemq.artemis.core.postoffice.Binding;
@@ -49,6 +49,7 @@ import org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl;
import org.apache.activemq.artemis.core.server.ActiveMQMessageBundle;
import org.apache.activemq.artemis.core.server.ActiveMQServer;
import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
+import org.apache.activemq.artemis.core.server.CoreLargeServerMessage;
import org.apache.activemq.artemis.core.server.HandleStatus;
import org.apache.activemq.artemis.core.server.LargeServerMessage;
import org.apache.activemq.artemis.core.server.MessageReference;
@@ -112,7 +113,7 @@ public class ServerConsumerImpl implements ServerConsumer, ReadyListener {
private boolean started;
- private volatile LargeMessageDeliverer largeMessageDeliverer = null;
+ private volatile CoreLargeMessageDeliverer largeMessageDeliverer = null;
@Override
public String debug() {
@@ -458,10 +459,16 @@ public class ServerConsumerImpl implements ServerConsumer, ReadyListener {
}
}
+ // The deliverer will increase the usageUp, so the preAck has to be done after this is created
+ // otherwise we may have a removed message early on
+ if (message instanceof CoreLargeServerMessage && this.supportLargeMessage) {
+ largeMessageDeliverer = new CoreLargeMessageDeliverer((LargeServerMessage) message, ref);
+ }
+
if (preAcknowledge) {
if (message.isLargeMessage()) {
// we must hold one reference, or the file will be deleted before it could be delivered
- ((LargeServerMessage) message).incrementDelayDeletionCount();
+ ((LargeServerMessage) message).toMessage().usageUp();
}
// With pre-ack, we ack *before* sending to the client
@@ -469,10 +476,6 @@ public class ServerConsumerImpl implements ServerConsumer, ReadyListener {
acks++;
}
- if (message.isLargeMessage() && this.supportLargeMessage) {
- largeMessageDeliverer = new LargeMessageDeliverer((LargeServerMessage) message, ref);
- }
-
}
pendingDelivery.countUp();
@@ -490,12 +493,12 @@ public class ServerConsumerImpl implements ServerConsumer, ReadyListener {
server.callBrokerMessagePlugins(plugin -> plugin.beforeDeliver(this, reference));
}
- if (message.isLargeMessage() && supportLargeMessage) {
+ if (message instanceof CoreLargeServerMessage && supportLargeMessage) {
if (largeMessageDeliverer == null) {
// This can't really happen as handle had already crated the deliverer
// instead of throwing an exception in weird cases there is no problem on just go ahead and create it
// again here
- largeMessageDeliverer = new LargeMessageDeliverer((LargeServerMessage) message, reference);
+ largeMessageDeliverer = new CoreLargeMessageDeliverer((LargeServerMessage) message, reference);
}
// The deliverer was prepared during handle, as we can't have more than one pending large message
// as it would return busy if there is anything pending
@@ -550,7 +553,7 @@ public class ServerConsumerImpl implements ServerConsumer, ReadyListener {
setStarted(false);
- LargeMessageDeliverer del = largeMessageDeliverer;
+ CoreLargeMessageDeliverer del = largeMessageDeliverer;
if (del != null) {
del.finish();
@@ -688,7 +691,7 @@ public class ServerConsumerImpl implements ServerConsumer, ReadyListener {
boolean performACK = lastConsumedAsDelivered;
try {
- LargeMessageDeliverer pendingLargeMessageDeliverer = largeMessageDeliverer;
+ CoreLargeMessageDeliverer pendingLargeMessageDeliverer = largeMessageDeliverer;
if (pendingLargeMessageDeliverer != null) {
pendingLargeMessageDeliverer.finish();
}
@@ -1220,7 +1223,7 @@ public class ServerConsumerImpl implements ServerConsumer, ReadyListener {
* Internal encapsulation of the logic on sending LargeMessages.
* This Inner class was created to avoid a bunch of loose properties about the current LargeMessage being sent
*/
- private final class LargeMessageDeliverer {
+ private final class CoreLargeMessageDeliverer {
private long sizePendingLargeMessage;
@@ -1235,14 +1238,14 @@ public class ServerConsumerImpl implements ServerConsumer, ReadyListener {
*/
private long positionPendingLargeMessage;
- private LargeBodyEncoder context;
+ private LargeBodyReader context;
private ByteBuffer chunkBytes;
- private LargeMessageDeliverer(final LargeServerMessage message, final MessageReference ref) throws Exception {
+ private CoreLargeMessageDeliverer(final LargeServerMessage message, final MessageReference ref) throws Exception {
largeMessage = message;
- largeMessage.incrementDelayDeletionCount();
+ largeMessage.toMessage().usageUp();
this.ref = ref;
@@ -1289,15 +1292,15 @@ public class ServerConsumerImpl implements ServerConsumer, ReadyListener {
}
if (!sentInitialPacket) {
- context = currentLargeMessage.getBodyEncoder();
+ context = currentLargeMessage.getLargeBodyReader();
- sizePendingLargeMessage = context.getLargeBodySize();
+ sizePendingLargeMessage = context.getSize();
context.open();
sentInitialPacket = true;
- int packetSize = callback.sendLargeMessage(ref, currentLargeMessage, ServerConsumerImpl.this, context.getLargeBodySize(), ref.getDeliveryCount());
+ int packetSize = callback.sendLargeMessage(ref, currentLargeMessage.toMessage(), ServerConsumerImpl.this, context.getSize(), ref.getDeliveryCount());
if (availableCredits != null) {
final int credits = availableCredits.addAndGet(-packetSize);
@@ -1337,7 +1340,7 @@ public class ServerConsumerImpl implements ServerConsumer, ReadyListener {
assert bodyBuffer.remaining() == localChunkLen;
- final int readBytes = context.encode(bodyBuffer);
+ final int readBytes = context.readInto(bodyBuffer);
assert readBytes == localChunkLen;
@@ -1406,12 +1409,7 @@ public class ServerConsumerImpl implements ServerConsumer, ReadyListener {
largeMessage.releaseResources(false);
- largeMessage.decrementDelayDeletionCount();
-
- if (preAcknowledge && !browseOnly) {
- // PreAck will have an extra reference
- largeMessage.decrementDelayDeletionCount();
- }
+ largeMessage.toMessage().usageDown();
largeMessageDeliverer = null;
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/transformer/ServerMessageImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/transformer/ServerMessageImpl.java
index 0e0220eb3d..d8a26c8bc2 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/transformer/ServerMessageImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/transformer/ServerMessageImpl.java
@@ -73,22 +73,22 @@ public class ServerMessageImpl extends MessageInternalImpl implements ServerMess
}
@Override
- public int incrementRefCount() throws Exception {
+ public int refUp() {
throw new UnsupportedOperationException();
}
@Override
- public int decrementRefCount() throws Exception {
+ public int refDown() {
throw new UnsupportedOperationException();
}
@Override
- public int incrementDurableRefCount() {
+ public int durableUp() {
throw new UnsupportedOperationException();
}
@Override
- public int decrementDurableRefCount() {
+ public int durableDown() {
throw new UnsupportedOperationException();
}
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/EmbedMessageUtil.java b/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/EmbedMessageUtil.java
index 53eb27bc32..310971f0f6 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/EmbedMessageUtil.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/EmbedMessageUtil.java
@@ -18,14 +18,23 @@
package org.apache.activemq.artemis.spi.core.protocol;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
+import org.apache.activemq.artemis.api.core.ActiveMQBuffers;
import org.apache.activemq.artemis.api.core.ICoreMessage;
import org.apache.activemq.artemis.api.core.Message;
+import org.apache.activemq.artemis.api.core.RefCountMessage;
import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import org.apache.activemq.artemis.core.persistence.Persister;
+import org.apache.activemq.artemis.core.persistence.StorageManager;
+import org.apache.activemq.artemis.core.persistence.impl.journal.AbstractJournalStorageManager;
+import org.apache.activemq.artemis.core.persistence.impl.journal.LargeServerMessageImpl;
+import org.apache.activemq.artemis.core.server.LargeServerMessage;
import org.jboss.logging.Logger;
public class EmbedMessageUtil {
+
+ private static final String AMQP_ENCODE_PROPERTY = "_AMQP_EMBED_LARGE";
+
private static final byte[] signature = new byte[]{(byte) 'E', (byte) 'M', (byte) 'B'};
private static final Logger logger = Logger.getLogger(EmbedMessageUtil.class);
@@ -35,35 +44,76 @@ public class EmbedMessageUtil {
if (source instanceof ICoreMessage) {
return (ICoreMessage) source;
} else {
- Persister persister = source.getPersister();
- CoreMessage message = new CoreMessage(source.getMessageID(), persister.getEncodeSize(source) + signature.length + CoreMessage.BODY_OFFSET).setType(Message.EMBEDDED_TYPE);
+ if (source.isLargeMessage()) {
+ LargeServerMessage largeSource = (LargeServerMessage) source;
- ActiveMQBuffer buffer = message.getBodyBuffer();
- buffer.writeBytes(signature);
- persister.encode(buffer, source);
- return message;
+ LargeServerMessageImpl largeServerMessage = new LargeServerMessageImpl(Message.LARGE_EMBEDDED_TYPE, source.getMessageID(), largeSource.getStorageManager(), largeSource.getLargeBody().createFile());
+ largeServerMessage.setDurable(source.isDurable());
+ int size = source.getPersister().getEncodeSize(source);
+ byte[] arrayByte = new byte[size];
+ ActiveMQBuffer buffer = ActiveMQBuffers.wrappedBuffer(arrayByte);
+ buffer.resetWriterIndex();
+ source.getPersister().encode(buffer, source);
+ largeServerMessage.toMessage().putBytesProperty(AMQP_ENCODE_PROPERTY, arrayByte);
+ largeServerMessage.setParentRef((RefCountMessage)source);
+ return (ICoreMessage) largeServerMessage.toMessage();
+ } else {
+ Persister persister = source.getPersister();
+
+ CoreMessage message = new CoreMessage(source.getMessageID(), persister.getEncodeSize(source) + signature.length + CoreMessage.BODY_OFFSET).setType(Message.EMBEDDED_TYPE);
+ message.setDurable(source.isDurable());
+
+ ActiveMQBuffer buffer = message.getBodyBuffer();
+ buffer.writeBytes(signature);
+ persister.encode(buffer, source);
+ return message;
+ }
}
}
- public static Message extractEmbedded(ICoreMessage message) {
- if (message.getType() == Message.EMBEDDED_TYPE) {
- ActiveMQBuffer buffer = message.getReadOnlyBodyBuffer();
-
- if (buffer.readableBytes() < signature.length || !checkSignature(buffer)) {
- logger.tracef("Message type %d was used for something other than embed messages, ignoring content and treating as a regular message", Message.EMBEDDED_TYPE);
+ public static Message extractEmbedded(ICoreMessage message, StorageManager storageManager) {
+ switch (message.getType()) {
+ case Message.EMBEDDED_TYPE:
+ return extractRegularMessage(message, storageManager);
+ case Message.LARGE_EMBEDDED_TYPE:
+ return extractLargeMessage(message, storageManager);
+ default:
return message;
- }
+ }
+ }
- try {
- return MessagePersister.getInstance().decode(buffer, null);
- } catch (Exception e) {
- logger.warn(e.getMessage(), e);
- return message;
- }
- } else {
+ private static Message extractRegularMessage(ICoreMessage message, StorageManager storageManager) {
+ ActiveMQBuffer buffer = message.getReadOnlyBodyBuffer();
+
+ if (buffer.readableBytes() < signature.length || !checkSignature(buffer)) {
+ logger.tracef("Message type %d was used for something other than embed messages, ignoring content and treating as a regular message", Message.EMBEDDED_TYPE);
return message;
}
+
+ return readEncoded(message, storageManager, buffer);
+ }
+
+ private static Message readEncoded(ICoreMessage message, StorageManager storageManager, ActiveMQBuffer buffer) {
+
+
+ AbstractJournalStorageManager.setupThreadLocal(storageManager);
+ try {
+ Message returnMessage = MessagePersister.getInstance().decode(buffer, null, null);
+ returnMessage.setMessageID(message.getMessageID());
+ return returnMessage;
+ } catch (Exception e) {
+ logger.warn(e.getMessage(), e);
+ return message;
+ } finally {
+ AbstractJournalStorageManager.setupThreadLocal(null);
+ }
+ }
+
+ private static Message extractLargeMessage(ICoreMessage message, StorageManager storageManager) {
+ ActiveMQBuffer buffer = ActiveMQBuffers.wrappedBuffer(message.getBytesProperty(AMQP_ENCODE_PROPERTY));
+
+ return readEncoded(message, storageManager, buffer);
}
private static boolean checkSignature(final ActiveMQBuffer buffer) {
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/MessageConverter.java b/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/MessageConverter.java
index 2c81343277..5420fd62d9 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/MessageConverter.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/MessageConverter.java
@@ -18,11 +18,12 @@ package org.apache.activemq.artemis.spi.core.protocol;
import org.apache.activemq.artemis.api.core.ICoreMessage;
import org.apache.activemq.artemis.api.core.Message;
-import org.apache.activemq.artemis.core.message.impl.CoreMessageObjectPools;
+import org.apache.activemq.artemis.core.persistence.CoreMessageObjectPools;
+import org.apache.activemq.artemis.core.persistence.StorageManager;
public interface MessageConverter {
ICoreMessage toCore(ProtocolMessage pureMessage, CoreMessageObjectPools coreMessageObjectPools) throws Exception;
- ProtocolMessage fromCore(ICoreMessage coreMessage) throws Exception;
+ ProtocolMessage fromCore(ICoreMessage coreMessage, StorageManager storageManager) throws Exception;
}
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/MessagePersister.java b/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/MessagePersister.java
index 2fddc564f0..808d094d98 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/MessagePersister.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/MessagePersister.java
@@ -21,20 +21,26 @@ import java.util.ServiceLoader;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
import org.apache.activemq.artemis.api.core.Message;
-import org.apache.activemq.artemis.core.message.impl.CoreMessageObjectPools;
+import org.apache.activemq.artemis.core.persistence.CoreMessageObjectPools;
import org.apache.activemq.artemis.core.message.impl.CoreMessagePersister;
import org.apache.activemq.artemis.core.persistence.Persister;
import org.jboss.logging.Logger;
-public class MessagePersister implements Persister {
+import static org.apache.activemq.artemis.core.persistence.PersisterIDs.MAX_PERSISTERS;
+
+public class MessagePersister implements Persister {
+
+ @Override
+ public byte getID() {
+ return 0;
+ }
private static final Logger logger = Logger.getLogger(MessagePersister.class);
private static final MessagePersister theInstance = new MessagePersister();
/** This will be used for reading messages */
- private static final int MAX_PERSISTERS = 3;
- private static final Persister[] persisters = new Persister[MAX_PERSISTERS];
+ private static final Persister[] persisters = new Persister[MAX_PERSISTERS];
static {
CoreMessagePersister persister = CoreMessagePersister.getInstance();
@@ -47,7 +53,7 @@ public class MessagePersister implements Persister[] messagePersisters = manager.getPersister();
+ Persister[] messagePersisters = manager.getPersister();
if (messagePersisters == null || messagePersisters.length == 0) {
logger.debug("Cannot find persister for " + manager);
} else {
@@ -70,7 +76,7 @@ public class MessagePersister implements Persister persister) {
+ public static void registerPersister(Persister persister) {
if (persister != null) {
assert persister.getID() <= MAX_PERSISTERS : "You must update MessagePersister::MAX_PERSISTERS to a higher number";
persisters[persister.getID() - 1] = persister;
@@ -98,12 +104,12 @@ public class MessagePersister implements Persister persister = getPersister(protocol);
+ Persister persister = getPersister(protocol);
if (persister == null) {
throw new NullPointerException("couldn't find factory for type=" + protocol);
}
- return persister.decode(buffer, pools);
+ return persister.decode(buffer, record, pools);
}
}
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/ProtocolManagerFactory.java b/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/ProtocolManagerFactory.java
index 77c66f977f..4ab34ebf56 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/ProtocolManagerFactory.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/ProtocolManagerFactory.java
@@ -21,13 +21,12 @@ import java.util.Map;
import org.apache.activemq.artemis.api.core.BaseInterceptor;
import org.apache.activemq.artemis.api.core.Message;
-import org.apache.activemq.artemis.core.message.impl.CoreMessageObjectPools;
import org.apache.activemq.artemis.core.persistence.Persister;
import org.apache.activemq.artemis.core.server.ActiveMQServer;
public interface ProtocolManagerFactory {
- default Persister[] getPersister() {
+ default Persister[] getPersister() {
return new Persister[]{};
}
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/QueueImplTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/QueueImplTest.java
index a2b42dbf79..b39c79a8a5 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/QueueImplTest.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/QueueImplTest.java
@@ -76,7 +76,7 @@ public class QueueImplTest {
return null;
}).when(storageManager).afterCompleteOperations(Mockito.any(IOCallback.class));
- QueueImpl queue = new QueueImpl(0, address, address, null, pageSubscription, null, false,
+ QueueImpl queue = new QueueImpl(0, address, address, null, null, pageSubscription, null, false,
false, false, Mockito.mock(ScheduledExecutorService.class),
Mockito.mock(PostOffice.class), storageManager, null,
Mockito.mock(ArtemisExecutor.class), Mockito.mock(ActiveMQServer.class),
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/ScheduledDeliveryHandlerTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/ScheduledDeliveryHandlerTest.java
index d0ed6f8ae2..988fa490a1 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/ScheduledDeliveryHandlerTest.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/ScheduledDeliveryHandlerTest.java
@@ -36,12 +36,12 @@ import org.apache.activemq.artemis.api.core.ActiveMQException;
import org.apache.activemq.artemis.api.core.ActiveMQPropertyConversionException;
import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.Pair;
-import org.apache.activemq.artemis.api.core.RefCountMessage;
import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.filter.Filter;
import org.apache.activemq.artemis.core.message.impl.CoreMessage;
-import org.apache.activemq.artemis.core.message.impl.CoreMessageObjectPools;
+import org.apache.activemq.artemis.core.persistence.CoreMessageObjectPools;
+import org.apache.activemq.artemis.core.paging.PagingStore;
import org.apache.activemq.artemis.core.paging.cursor.PageSubscription;
import org.apache.activemq.artemis.core.persistence.OperationContext;
import org.apache.activemq.artemis.core.persistence.Persister;
@@ -290,7 +290,7 @@ public class ScheduledDeliveryHandlerTest extends Assert {
}
}
- class FakeMessage extends RefCountMessage {
+ class FakeMessage implements Message {
@Override
public SimpleString getReplyTo() {
@@ -317,6 +317,11 @@ public class ScheduledDeliveryHandlerTest extends Assert {
}
+ @Override
+ public int getDurableCount() {
+ return 0;
+ }
+
@Override
public Long getScheduledDeliveryTime() {
return null;
@@ -328,7 +333,7 @@ public class ScheduledDeliveryHandlerTest extends Assert {
}
@Override
- public Persister getPersister() {
+ public Persister getPersister() {
return null;
}
@@ -363,22 +368,12 @@ public class ScheduledDeliveryHandlerTest extends Assert {
}
@Override
- public int incrementRefCount() throws Exception {
+ public int durableUp() {
return 0;
}
@Override
- public int decrementRefCount() throws Exception {
- return 0;
- }
-
- @Override
- public int incrementDurableRefCount() {
- return 0;
- }
-
- @Override
- public int decrementDurableRefCount() {
+ public int durableDown() {
return 0;
}
@@ -776,6 +771,31 @@ public class ScheduledDeliveryHandlerTest extends Assert {
}
+ @Override
+ public int getUsage() {
+ return 0;
+ }
+
+ @Override
+ public int usageUp() {
+ return 0;
+ }
+
+ @Override
+ public int usageDown() {
+ return 0;
+ }
+
+ @Override
+ public int refUp() {
+ return 0;
+ }
+
+ @Override
+ public int refDown() {
+ return 0;
+ }
+
@Override
public void sendBuffer(ByteBuf buffer, int count) {
@@ -794,6 +814,31 @@ public class ScheduledDeliveryHandlerTest extends Assert {
}
+ @Override
+ public PagingStore getPagingStore() {
+ return null;
+ }
+
+ @Override
+ public int durableUp(Message message) {
+ return 1;
+ }
+
+ @Override
+ public int durableDown(Message message) {
+ return 1;
+ }
+
+ @Override
+ public void refUp(Message message) {
+
+ }
+
+ @Override
+ public void refDown(Message message) {
+
+ }
+
@Override
public void removeAddress() throws Exception {
}
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/transaction/impl/TransactionImplTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/transaction/impl/TransactionImplTest.java
index 7c0ce44ba2..471885c079 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/transaction/impl/TransactionImplTest.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/transaction/impl/TransactionImplTest.java
@@ -26,6 +26,7 @@ import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
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.Message;
import org.apache.activemq.artemis.api.core.Pair;
@@ -240,6 +241,16 @@ public class TransactionImplTest extends ActiveMQTestBase {
}
+ @Override
+ public void deleteLargeMessageBody(LargeServerMessage largeServerMessage) throws ActiveMQException {
+
+ }
+
+ @Override
+ public void addBytesToLargeMessage(SequentialFile file, long messageId, ActiveMQBuffer bytes) throws Exception {
+
+ }
+
@Override
public void pageClosed(SimpleString storeName, int pageNumber) {
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/tests/util/ActiveMQTestBase.java b/artemis-server/src/test/java/org/apache/activemq/artemis/tests/util/ActiveMQTestBase.java
index 1c86271d5b..1af3400eca 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/tests/util/ActiveMQTestBase.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/tests/util/ActiveMQTestBase.java
@@ -1942,26 +1942,16 @@ public abstract class ActiveMQTestBase extends Assert {
return false;
}
+ protected int getNumberOfFiles(File directory) {
+ return directory.listFiles().length;
+ }
/**
* Deleting a file on LargeDir is an asynchronous process. We need to keep looking for a while if
* the file hasn't been deleted yet.
*/
protected void validateNoFilesOnLargeDir(final String directory, final int expect) throws Exception {
File largeMessagesFileDir = new File(directory);
-
- // Deleting the file is async... we keep looking for a period of the time until the file is really gone
- long timeout = System.currentTimeMillis() + 5000;
- while (timeout > System.currentTimeMillis() && largeMessagesFileDir.listFiles().length != expect) {
- Thread.sleep(100);
- }
-
- if (expect != largeMessagesFileDir.listFiles().length) {
- for (File file : largeMessagesFileDir.listFiles()) {
- System.out.println("File " + file + " still on ");
- }
- }
-
- Assert.assertEquals(expect, largeMessagesFileDir.listFiles().length);
+ Wait.assertEquals(expect, () -> getNumberOfFiles(largeMessagesFileDir));
}
/**
diff --git a/docs/user-manual/en/large-messages.md b/docs/user-manual/en/large-messages.md
index 26188af19a..37b03c4a50 100644
--- a/docs/user-manual/en/large-messages.md
+++ b/docs/user-manual/en/large-messages.md
@@ -1,24 +1,11 @@
# Large Messages
-Apache ActiveMQ Artemis supports sending and receiving of huge messages, even
-when the client and server are running with limited memory. The only realistic
-limit to the size of a message that can be sent or consumed is the amount of
-disk space you have available. We have tested sending and consuming messages up
-to 8 GiB in size with a client and server running in just 50MiB of RAM!
+Apache ActiveMQ Artemis can be configured to store messages as files when these messages are beyond a configured value.
-To send a large message, the user can set an `InputStream` on a message body,
-and when that message is sent, Apache ActiveMQ Artemis will read the
-`InputStream`. A `FileInputStream` could be used for example to send a huge
-message from a huge file on disk.
+Instead of keeping these messages in memory ActiveMQ Artemis will hold just a thin object on the queues with a
+reference to a file into a specific folder configured as large-messages-directory.
-As the `InputStream` is read the data is sent to the server as a stream of
-fragments. The server persists these fragments to disk as it receives them and
-when the time comes to deliver them to a consumer they are read back of the
-disk, also in fragments and sent down the wire. When the consumer receives a
-large message it initially receives just the message with an empty body, it can
-then set an `OutputStream` on the message to stream the huge message body to a
-file on disk or elsewhere. At no time is the entire message body stored fully
-in memory, either on the client or the server.
+This is supported on Core Protocol and on the AMQP Protocol.
## Configuring the server
@@ -48,7 +35,7 @@ For the best performance we recommend using file store with large messages
directory stored on a different physical volume to the message journal or
paging directory.
-## Configuring the Client
+## Configuring the Core Client
Any message larger than a certain size is considered a large message. Large
messages will be split up and sent in fragments. This is determined by the URL
@@ -70,7 +57,7 @@ side](configuring-transports.md#configuring-the-transport-directly-from-the-clie
will provide more information on how to instantiate the core session factory or
JMS connection factory.
-## Compressed Large Messages
+## Compressed Large Messages on Core Protocol
You can choose to send large messages in compressed form using
`compressLargeMessages` URL parameter.
@@ -86,7 +73,7 @@ sent to server as regular messages. This means that the message won't be
written into the server's large-message data directory, thus reducing the disk
I/O.
-## Streaming large messages
+## Streaming large messages from Core Protocol
Apache ActiveMQ Artemis supports setting the body of messages using input and
output streams (`java.lang.io`)
@@ -193,7 +180,7 @@ messageReceived.setObjectProperty("JMS_AMQ_OutputStream", bufferedOutput);
> When using JMS, Streaming large messages are only supported on
> `StreamMessage` and `BytesMessage`.
-### Streaming Alternative
+### Streaming Alternative on Core Protocol
If you choose not to use the `InputStream` or `OutputStream` capability of
Apache ActiveMQ Artemis You could still access the data directly in an
@@ -227,6 +214,26 @@ for (int i = 0; i < rm.getBodyLength(); i += 1024)
}
```
+## Configuring AMQP Acceptor
+
+You can configure the property ``amqpMinLargeMessageSize`` at the acceptor.
+
+The default value is 102400 (100KBytes).
+
+Setting it to -1 will disable large message support.
+
+**Warning:** setting amqpMinLargeMessageSize to -1, your AMQP message might be stored as a Core Large Message if the
+size of the message does not fit into the journal. This is the former semantic of the broker and it is kept this way for
+compatibility reasons.
+
+```xml
+
+
+ tcp://0.0.0.0:5672?; ..... amqpMinLargeMessageSize=102400; ....
+
+
+```
+
## Large message example
Please see the [Large Message Example](examples.md#large-message) which shows
diff --git a/tests/extra-tests/src/test/java/org/apache/activemq/artemis/tests/extras/byteman/RaceOnCursorIteratorTest.java b/tests/extra-tests/src/test/java/org/apache/activemq/artemis/tests/extras/byteman/RaceOnCursorIteratorTest.java
index 285078ee81..b7e29f1f8c 100644
--- a/tests/extra-tests/src/test/java/org/apache/activemq/artemis/tests/extras/byteman/RaceOnCursorIteratorTest.java
+++ b/tests/extra-tests/src/test/java/org/apache/activemq/artemis/tests/extras/byteman/RaceOnCursorIteratorTest.java
@@ -188,8 +188,6 @@ public class RaceOnCursorIteratorTest extends ActiveMQTestBase {
msg.setAddress(ADDRESS);
- msg.setContext(pagingStore);
-
msg.getBodyBuffer().resetReaderIndex();
msg.getBodyBuffer().resetWriterIndex();
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/AmqpBridgeClusterRedistributionTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/AmqpBridgeClusterRedistributionTest.java
index 56b9c37318..1ba439ce05 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/AmqpBridgeClusterRedistributionTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/AmqpBridgeClusterRedistributionTest.java
@@ -59,15 +59,15 @@ public class AmqpBridgeClusterRedistributionTest extends AmqpClientTestSupport {
private SimpleString bridgeNotificationsQueue;
private SimpleString notificationsQueue;
- private String getServer0URL() {
+ protected String getServer0URL() {
return "tcp://localhost:61616";
}
- private String getServer1URL() {
+ protected String getServer1URL() {
return "tcp://localhost:61617";
}
- private String getServer2URL() {
+ protected String getServer2URL() {
return "tcp://localhost:61618";
}
@@ -105,9 +105,9 @@ public class AmqpBridgeClusterRedistributionTest extends AmqpClientTestSupport {
@Before
public void setUp() throws Exception {
super.setUp();
- server0 = createServer(false, createBasicConfig());
- server1 = createServer(false, createBasicConfig());
- server2 = createServer(false, createBasicConfig());
+ server0 = createServer(true, createBasicConfig(0));
+ server1 = createServer(true, createBasicConfig(1));
+ server2 = createServer(true, createBasicConfig(2));
servers[0] = server0;
servers[1] = server1;
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/AmqpClientTestSupport.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/AmqpClientTestSupport.java
index ca34c23ce5..a4b63a3917 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/AmqpClientTestSupport.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/AmqpClientTestSupport.java
@@ -323,6 +323,9 @@ public class AmqpClientTestSupport extends AmqpTestSupport {
sendMessages(destinationName, count, routingType, durable, Collections.emptyMap());
}
+ protected void setData(AmqpMessage amqpMessage) throws Exception {
+ }
+
protected void sendMessages(String destinationName,
int count,
RoutingType routingType,
@@ -344,6 +347,7 @@ public class AmqpClientTestSupport extends AmqpTestSupport {
if (routingType != null) {
message.setMessageAnnotation(AMQPMessageSupport.ROUTING_TYPE.toString(), routingType.getType());
}
+ setData(message);
sender.send(message);
}
} finally {
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/AmqpLargeMessageTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/AmqpLargeMessageTest.java
index 10ccc95be5..f20c933a20 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/AmqpLargeMessageTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/AmqpLargeMessageTest.java
@@ -16,7 +16,6 @@
*/
package org.apache.activemq.artemis.tests.integration.amqp;
-import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Arrays;
@@ -370,51 +369,6 @@ public class AmqpLargeMessageTest extends AmqpClientTestSupport {
return payload;
}
- @Test(timeout = 60000)
- public void testSendHugeHeader() throws Exception {
- doTestSendHugeHeader(PAYLOAD);
- }
-
- @Test(timeout = 60000)
- public void testSendLargeMessageWithHugeHeader() throws Exception {
- doTestSendHugeHeader(1024 * 1024);
- }
-
- public void doTestSendHugeHeader(int expectedSize) throws Exception {
- server.getAddressSettingsRepository().addMatch("#", new AddressSettings().setDefaultAddressRoutingType(RoutingType.ANYCAST));
-
- AmqpClient client = createAmqpClient();
- AmqpConnection connection = addConnection(client.connect());
- try {
-
- connection.connect();
-
- final int strLength = 512 * 1024;
- AmqpSession session = connection.createSession();
- AmqpSender sender = session.createSender(testQueueName);
-
- AmqpMessage message = createAmqpMessage((byte) 'A', expectedSize);
- StringBuffer buffer = new StringBuffer();
- for (int i = 0; i < strLength; i++) {
- buffer.append(" ");
- }
- message.setApplicationProperty("str", buffer.toString());
- message.setDurable(true);
-
- try {
- sender.send(message);
- fail();
- } catch (IOException e) {
- Assert.assertTrue(e.getCause() instanceof JMSException);
- Assert.assertTrue(e.getMessage().contains("AMQ149005"));
- }
-
- session.close();
- } finally {
- connection.close();
- }
- }
-
@Test(timeout = 60000)
public void testSendSmallerMessages() throws Exception {
for (int i = 512; i <= (8 * 1024); i += 512) {
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/QueueAutoCreationTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/QueueAutoCreationTest.java
index 5de4fb460c..30c177b077 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/QueueAutoCreationTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/QueueAutoCreationTest.java
@@ -107,11 +107,7 @@ public class QueueAutoCreationTest extends JMSClientTestSupport {
@Test(timeout = 30000)
public void testHugeString() throws Exception {
- //amqp doesn't support large message receive.
- //using core to receive, it can verify
- //that the large message is indeed stored in core
- //via amqp send.
- sendStringOfSize(1024 * 1024, true);
+ sendStringOfSize(1024 * 1024, false);
}
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/largemessages/AmqpLargeMessageRedistributionTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/largemessages/AmqpLargeMessageRedistributionTest.java
new file mode 100644
index 0000000000..a53807eddb
--- /dev/null
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/largemessages/AmqpLargeMessageRedistributionTest.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.activemq.artemis.tests.integration.amqp.largemessages;
+
+import org.apache.activemq.artemis.tests.integration.amqp.AmqpBridgeClusterRedistributionTest;
+import org.apache.activemq.transport.amqp.client.AmqpMessage;
+
+public class AmqpLargeMessageRedistributionTest extends AmqpBridgeClusterRedistributionTest {
+ int frameSize = 1024 * 1024;
+ @Override
+ protected String getServer0URL() {
+ return "tcp://localhost:61616?maxFrameSize=" + frameSize;
+ }
+
+ @Override
+ protected String getServer1URL() {
+ return "tcp://localhost:61617?maxFrameSize=" + frameSize;
+ }
+
+ @Override
+ protected String getServer2URL() {
+ return "tcp://localhost:61618?maxFrameSize=" + frameSize;
+ }
+
+ @Override
+ protected void setData(AmqpMessage amqpMessage) throws Exception {
+ amqpMessage.setBytes(new byte[110 * 1024]);
+ }
+}
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/largemessages/AmqpReplicatedLargeMessageTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/largemessages/AmqpReplicatedLargeMessageTest.java
new file mode 100644
index 0000000000..1fb8db65a2
--- /dev/null
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/largemessages/AmqpReplicatedLargeMessageTest.java
@@ -0,0 +1,163 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.activemq.artemis.tests.integration.amqp.largemessages;
+
+import java.net.URI;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.activemq.artemis.api.core.RoutingType;
+import org.apache.activemq.artemis.api.core.SimpleString;
+import org.apache.activemq.artemis.api.core.TransportConfiguration;
+import org.apache.activemq.artemis.core.server.ActiveMQServer;
+import org.apache.activemq.artemis.core.server.Queue;
+import org.apache.activemq.artemis.core.server.impl.AddressInfo;
+import org.apache.activemq.artemis.tests.util.TransportConfigurationUtils;
+import org.apache.activemq.artemis.tests.util.Wait;
+import org.apache.activemq.transport.amqp.client.AmqpClient;
+import org.apache.activemq.transport.amqp.client.AmqpConnection;
+import org.apache.activemq.transport.amqp.client.AmqpMessage;
+import org.apache.activemq.transport.amqp.client.AmqpReceiver;
+import org.apache.activemq.transport.amqp.client.AmqpSender;
+import org.apache.activemq.transport.amqp.client.AmqpSession;
+import org.apache.qpid.proton.amqp.messaging.Data;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class AmqpReplicatedLargeMessageTest extends AmqpReplicatedTestSupport {
+
+ private String smallFrameLive = new String("tcp://localhost:" + (AMQP_PORT + 10));
+ private String smallFrameBackup = new String("tcp://localhost:" + (AMQP_PORT + 10));
+
+ @Override
+ protected TransportConfiguration getAcceptorTransportConfiguration(final boolean live) {
+ return TransportConfigurationUtils.getInVMAcceptor(live);
+ }
+
+ @Override
+ protected TransportConfiguration getConnectorTransportConfiguration(final boolean live) {
+ return TransportConfigurationUtils.getInVMConnector(live);
+ }
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+
+ createReplicatedConfigs();
+ liveConfig.addAcceptorConfiguration("amqp", smallFrameLive + "?protocols=AMQP;useEpoll=false;maxFrameSize=512");
+ backupConfig.addAcceptorConfiguration("amqp", smallFrameBackup + "?protocols=AMQP;useEpoll=false;maxFrameSize=512");
+ liveServer.start();
+ backupServer.start();
+
+ liveServer.getServer().addAddressInfo(new AddressInfo(getQueueName(), RoutingType.ANYCAST));
+ liveServer.getServer().createQueue(getQueueName(), RoutingType.ANYCAST, getQueueName(), null, true, false, -1, false, true);
+
+
+ waitForRemoteBackupSynchronization(backupServer.getServer());
+ }
+
+ public SimpleString getQueueName() {
+ return SimpleString.toSimpleString("replicatedTest");
+ }
+
+
+ @Test
+ public void testSimpleSend() throws Exception {
+ try {
+
+ ActiveMQServer server = liveServer.getServer();
+
+ boolean crashServer = true;
+ int size = 100 * 1024;
+ AmqpClient client = createAmqpClient(new URI(smallFrameLive));
+ AmqpConnection connection = client.createConnection();
+ addConnection(connection);
+ connection.setMaxFrameSize(2 * 1024);
+ connection.connect();
+
+ AmqpSession session = connection.createSession();
+
+ AmqpSender sender = session.createSender(getQueueName().toString());
+
+ Queue queueView = server.locateQueue(getQueueName());
+ assertNotNull(queueView);
+ assertEquals(0, queueView.getMessageCount());
+
+ session.begin();
+ for (int m = 0; m < 10; m++) {
+ AmqpMessage message = new AmqpMessage();
+ message.setDurable(true);
+ message.setApplicationProperty("i", "m " + m);
+ byte[] bytes = new byte[size];
+ for (int i = 0; i < bytes.length; i++) {
+ bytes[i] = (byte) 'z';
+ }
+
+ message.setBytes(bytes);
+ sender.send(message);
+ }
+ session.commit();
+
+ if (crashServer) {
+ connection.close();
+ liveServer.crash();
+
+ Wait.assertTrue(backupServer::isActive);
+
+ server = backupServer.getServer();
+
+ client = createAmqpClient(new URI(smallFrameBackup));
+ connection = client.createConnection();
+ addConnection(connection);
+ connection.setMaxFrameSize(2 * 1024);
+ connection.connect();
+ session = connection.createSession();
+ }
+
+ queueView = server.locateQueue(getQueueName());
+ Wait.assertEquals(10, queueView::getMessageCount);
+
+ AmqpReceiver receiver = session.createReceiver(getQueueName().toString());
+ receiver.flow(10);
+ for (int i = 0; i < 10; i++) {
+ AmqpMessage msgReceived = receiver.receive(10, TimeUnit.SECONDS);
+ Assert.assertNotNull(msgReceived);
+ Data body = (Data)msgReceived.getWrappedMessage().getBody();
+ byte[] bodyArray = body.getValue().getArray();
+ for (int bI = 0; bI < size; bI++) {
+ Assert.assertEquals((byte)'z', bodyArray[bI]);
+ }
+ msgReceived.accept(true);
+ }
+
+ receiver.flow(1);
+ Assert.assertNull(receiver.receiveNoWait());
+
+
+ receiver.close();
+
+ connection.close();
+
+ Wait.assertEquals(0, queueView::getMessageCount);
+ validateNoFilesOnLargeDir(getLargeMessagesDir(0, true), 0);
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw e;
+ }
+ }
+
+}
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/largemessages/AmqpReplicatedTestSupport.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/largemessages/AmqpReplicatedTestSupport.java
new file mode 100644
index 0000000000..37772b332a
--- /dev/null
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/largemessages/AmqpReplicatedTestSupport.java
@@ -0,0 +1,97 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.activemq.artemis.tests.integration.amqp.largemessages;
+
+import org.apache.activemq.artemis.api.core.TransportConfiguration;
+import org.apache.activemq.artemis.core.config.Configuration;
+import org.apache.activemq.artemis.core.config.ha.ReplicaPolicyConfiguration;
+import org.apache.activemq.artemis.core.config.ha.SharedStoreSlavePolicyConfiguration;
+import org.apache.activemq.artemis.core.server.NodeManager;
+import org.apache.activemq.artemis.core.server.impl.InVMNodeManager;
+import org.apache.activemq.artemis.tests.integration.amqp.AmqpTestSupport;
+import org.apache.activemq.artemis.tests.integration.cluster.util.SameProcessActiveMQServer;
+import org.apache.activemq.artemis.tests.integration.cluster.util.TestableServer;
+import org.apache.activemq.artemis.tests.util.ReplicatedBackupUtils;
+
+public abstract class AmqpReplicatedTestSupport extends AmqpTestSupport {
+
+ protected TestableServer liveServer;
+
+ protected TestableServer backupServer;
+
+ protected Configuration backupConfig;
+
+ protected Configuration liveConfig;
+
+ protected abstract TransportConfiguration getAcceptorTransportConfiguration(boolean live);
+
+ protected abstract TransportConfiguration getConnectorTransportConfiguration(boolean live);
+
+ protected NodeManager nodeManager;
+
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+
+ createReplicatedConfigs();
+ }
+
+ protected void createReplicatedConfigs() throws Exception {
+ final TransportConfiguration liveConnector = getConnectorTransportConfiguration(true);
+ final TransportConfiguration backupConnector = getConnectorTransportConfiguration(false);
+ final TransportConfiguration backupAcceptor = getAcceptorTransportConfiguration(false);
+
+ backupConfig = createDefaultInVMConfig();
+ liveConfig = createDefaultInVMConfig();
+
+ ReplicatedBackupUtils.configureReplicationPair(backupConfig, backupConnector, backupAcceptor, liveConfig, liveConnector, null);
+
+ backupConfig.setBindingsDirectory(getBindingsDir(0, true)).setJournalDirectory(getJournalDir(0, true)).setPagingDirectory(getPageDir(0, true)).setLargeMessagesDirectory(getLargeMessagesDir(0, true)).setSecurityEnabled(false);
+
+ setupHAPolicyConfiguration();
+ nodeManager = createReplicatedBackupNodeManager(backupConfig);
+
+ backupServer = createTestableServer(backupConfig);
+
+ liveConfig.clearAcceptorConfigurations().addAcceptorConfiguration(getAcceptorTransportConfiguration(true));
+
+ liveServer = createTestableServer(liveConfig);
+ }
+
+ /**
+ * Override this if is needed a different implementation of {@link NodeManager} to be used into {@link #createReplicatedConfigs()}.
+ */
+ protected NodeManager createReplicatedBackupNodeManager(Configuration backupConfig) {
+ return new InVMNodeManager(true, backupConfig.getJournalLocation());
+ }
+
+ protected void setupHAPolicyConfiguration() {
+ ((ReplicaPolicyConfiguration) backupConfig.getHAPolicyConfiguration()).setMaxSavedReplicatedJournalsSize(-1).setAllowFailBack(true);
+ ((ReplicaPolicyConfiguration) backupConfig.getHAPolicyConfiguration()).setRestartBackup(false);
+ }
+
+ protected TestableServer createTestableServer(Configuration config) throws Exception {
+ return createTestableServer(config, nodeManager);
+ }
+
+ protected TestableServer createTestableServer(Configuration config, NodeManager nodeManager) throws Exception {
+ boolean isBackup = config.getHAPolicyConfiguration() instanceof ReplicaPolicyConfiguration || config.getHAPolicyConfiguration() instanceof SharedStoreSlavePolicyConfiguration;
+ return new SameProcessActiveMQServer(createInVMFailoverServer(true, config, nodeManager, isBackup ? 2 : 1));
+ }
+
+}
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/largemessages/SimpleStreamingLargeMessageTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/largemessages/SimpleStreamingLargeMessageTest.java
new file mode 100644
index 0000000000..b54ad8be0e
--- /dev/null
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/largemessages/SimpleStreamingLargeMessageTest.java
@@ -0,0 +1,348 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.activemq.artemis.tests.integration.amqp.largemessages;
+
+import javax.jms.BytesMessage;
+import javax.jms.Connection;
+import javax.jms.DeliveryMode;
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageProducer;
+import javax.jms.Session;
+import java.net.URI;
+import java.util.Arrays;
+import java.util.concurrent.ThreadLocalRandom;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.activemq.artemis.core.server.ActiveMQServer;
+import org.apache.activemq.artemis.core.server.Queue;
+import org.apache.activemq.artemis.tests.integration.amqp.AmqpClientTestSupport;
+import org.apache.activemq.artemis.tests.util.Wait;
+import org.apache.activemq.transport.amqp.client.AmqpClient;
+import org.apache.activemq.transport.amqp.client.AmqpConnection;
+import org.apache.activemq.transport.amqp.client.AmqpMessage;
+import org.apache.activemq.transport.amqp.client.AmqpReceiver;
+import org.apache.activemq.transport.amqp.client.AmqpSender;
+import org.apache.activemq.transport.amqp.client.AmqpSession;
+import org.apache.qpid.jms.JmsConnectionFactory;
+import org.apache.qpid.proton.amqp.messaging.Data;
+import org.hamcrest.core.IsInstanceOf;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+/**
+ * Test broker behavior when creating AMQP senders
+ */
+@RunWith(value = Parameterized.class)
+public class SimpleStreamingLargeMessageTest extends AmqpClientTestSupport {
+ private String smallFrameAcceptor = new String("tcp://localhost:" + (AMQP_PORT + 8));
+
+ int frameSize;
+
+
+
+ @Parameterized.Parameters(name = "frameSize = {0}")
+ public static Iterable extends Object> persistenceEnabled() {
+ // The reason I use two frames sizes here
+ // is because a message that wasn't broken into frames
+ // but still beyond 50K, should still be considered large when storing
+ return Arrays.asList(new Object[][]{{512}, {1024 * 1024}});
+ }
+
+ public SimpleStreamingLargeMessageTest(int frameSize) {
+ this.frameSize = frameSize;
+ }
+
+
+ @Override
+ protected void addAdditionalAcceptors(ActiveMQServer server) throws Exception {
+ server.getConfiguration().addAcceptorConfiguration("flow", smallFrameAcceptor + "?protocols=AMQP;useEpoll=false;maxFrameSize=" + frameSize + ";amqpMinLargeMessageSize=50000");
+ }
+
+ @Test(timeout = 60000)
+ public void testSendNonPersistent() throws Exception {
+ testSend(false, false);
+ }
+
+ @Test(timeout = 60000)
+ public void testSendPersistent() throws Exception {
+ testSend(true, false);
+ }
+
+ @Test(timeout = 60000)
+ public void testSendPersistentRestartServer() throws Exception {
+ testSend(true, true);
+ }
+
+ public void testSend(boolean persistent, boolean restartServer) throws Exception {
+ try {
+ int size = 100 * 1024;
+ AmqpClient client = createAmqpClient(new URI(smallFrameAcceptor));
+ AmqpConnection connection = client.createConnection();
+ addConnection(connection);
+ connection.setMaxFrameSize(2 * 1024);
+ connection.connect();
+
+ AmqpSession session = connection.createSession();
+
+ AmqpSender sender = session.createSender(getQueueName());
+
+ Queue queueView = getProxyToQueue(getQueueName());
+ assertNotNull(queueView);
+ assertEquals(0, queueView.getMessageCount());
+
+ session.begin();
+ for (int m = 0; m < 10; m++) {
+ AmqpMessage message = new AmqpMessage();
+ message.setDurable(persistent);
+ byte[] bytes = new byte[size];
+ for (int i = 0; i < bytes.length; i++) {
+ bytes[i] = (byte) 'z';
+ }
+
+ message.setBytes(bytes);
+ sender.send(message);
+ }
+ session.commit();
+
+ if (restartServer) {
+ connection.close();
+ server.stop();
+ server.start();
+
+ connection = client.createConnection();
+ addConnection(connection);
+ connection.setMaxFrameSize(2 * 1024);
+ connection.connect();
+ session = connection.createSession();
+ }
+
+ queueView = getProxyToQueue(getQueueName());
+ Wait.assertEquals(10, queueView::getMessageCount);
+
+ AmqpReceiver receiver = session.createReceiver(getQueueName());
+ receiver.flow(10);
+ for (int i = 0; i < 10; i++) {
+ AmqpMessage msgReceived = receiver.receive(10, TimeUnit.SECONDS);
+ Assert.assertNotNull(msgReceived);
+ Data body = (Data)msgReceived.getWrappedMessage().getBody();
+ byte[] bodyArray = body.getValue().getArray();
+ for (int bI = 0; bI < size; bI++) {
+ Assert.assertEquals((byte)'z', bodyArray[bI]);
+ }
+ msgReceived.accept(true);
+ }
+
+ receiver.flow(1);
+ Assert.assertNull(receiver.receiveNoWait());
+
+
+ receiver.close();
+
+ connection.close();
+
+ Wait.assertEquals(0, queueView::getMessageCount);
+ validateNoFilesOnLargeDir();
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw e;
+ }
+ }
+
+ @Test
+ public void testSendWithPropertiesAndFilterPersistentRestart() throws Exception {
+ testSendWithPropertiesAndFilter(true, true);
+
+ }
+
+ @Test
+ public void testSendWithPropertiesAndFilterPersistentNoRestart() throws Exception {
+ testSendWithPropertiesAndFilter(true, false);
+
+ }
+
+ @Test
+ public void testSendWithPropertiesNonPersistent() throws Exception {
+ testSendWithPropertiesAndFilter(true, false);
+
+ }
+
+ public void testSendWithPropertiesAndFilter(boolean persistent, boolean restartServer) throws Exception {
+ try {
+
+ int size = 100 * 1024;
+ AmqpClient client = createAmqpClient(new URI(smallFrameAcceptor));
+ AmqpConnection connection = client.createConnection();
+ addConnection(connection);
+ connection.setMaxFrameSize(2 * 1024);
+ connection.connect();
+
+ AmqpSession session = connection.createSession();
+
+ AmqpSender sender = session.createSender(getQueueName());
+
+ Queue queueView = getProxyToQueue(getQueueName());
+ assertNotNull(queueView);
+ assertEquals(0, queueView.getMessageCount());
+
+ session.begin();
+ for (int m = 0; m < 10; m++) {
+ AmqpMessage message = new AmqpMessage();
+ message.setDurable(persistent);
+ message.setApplicationProperty("odd", (m % 2 == 0));
+ byte[] bytes = new byte[size];
+ for (int i = 0; i < bytes.length; i++) {
+ bytes[i] = (byte) 'z';
+ }
+
+ message.setBytes(bytes);
+ sender.send(message);
+ if (m == 5) {
+ // we will send half transactionally, half normally
+ session.commit();
+ }
+ }
+
+ if (restartServer) {
+ connection.close();
+ server.stop();
+ server.start();
+
+ connection = client.createConnection();
+ addConnection(connection);
+ connection.setMaxFrameSize(2 * 1024);
+ connection.connect();
+ session = connection.createSession();
+ }
+
+ queueView = getProxyToQueue(getQueueName());
+ Wait.assertEquals(10, queueView::getMessageCount);
+
+ AmqpReceiver receiver = session.createReceiver(getQueueName(), "odd=true");
+ receiver.flow(10);
+ for (int i = 0; i < 5; i++) {
+ System.out.println("Receiving " + i);
+ AmqpMessage msgReceived = receiver.receive(10, TimeUnit.SECONDS);
+ Assert.assertNotNull(msgReceived);
+ System.out.println("Received " + msgReceived);
+ Data body = (Data)msgReceived.getWrappedMessage().getBody();
+ byte[] bodyArray = body.getValue().getArray();
+ for (int bI = 0; bI < size; bI++) {
+ Assert.assertEquals((byte)'z', bodyArray[bI]);
+ }
+ msgReceived.accept(true);
+ }
+
+ receiver.flow(1);
+ Assert.assertNull(receiver.receiveNoWait());
+
+
+ receiver.close();
+
+ connection.close();
+
+ validateNoFilesOnLargeDir(getLargeMessagesDir(), 5);
+ } catch (Exception e) {
+ e.printStackTrace();
+ throw e;
+ }
+
+ }
+
+
+ @Test
+ public void testJMSPersistentTX() throws Exception {
+
+ boolean persistent = true;
+ boolean tx = true;
+
+ jmsTest(persistent, tx);
+ }
+
+ @Test
+ public void testJMSPersistentNonTX() throws Exception {
+
+ boolean persistent = true;
+ boolean tx = false;
+
+ jmsTest(persistent, tx);
+ }
+
+
+ @Test
+ public void testJMSNonPersistentTX() throws Exception {
+
+ boolean persistent = false;
+ boolean tx = true;
+
+ jmsTest(persistent, tx);
+ }
+
+ @Test
+ public void testJMSNonPersistentNonTX() throws Exception {
+
+ boolean persistent = false;
+ boolean tx = false;
+
+ jmsTest(persistent, tx);
+ }
+
+ private void jmsTest(boolean persistent, boolean tx) throws JMSException {
+ int MESSAGE_SIZE = 100 * 1024;
+ int MESSAGES = 10;
+ String producerUri = "amqp://localhost:5672";
+ final JmsConnectionFactory producerFactory = new JmsConnectionFactory(producerUri);
+ try (Connection producerConnection = producerFactory.createConnection(); Session producerSession = producerConnection.createSession(tx, tx ? Session.SESSION_TRANSACTED : Session.AUTO_ACKNOWLEDGE)) {
+ producerConnection.start();
+ final Destination queue = producerSession.createQueue(getQueueName());
+ String consumerUri = "amqp://localhost:5672";
+ final JmsConnectionFactory consumerConnectionFactory = new JmsConnectionFactory(consumerUri);
+ try (Connection consumerConnection = consumerConnectionFactory.createConnection(); Session consumerSession = consumerConnection.createSession(tx, tx ? Session.SESSION_TRANSACTED : Session.AUTO_ACKNOWLEDGE); MessageConsumer consumer = consumerSession.createConsumer(queue); MessageProducer producer = producerSession.createProducer(queue)) {
+ if (persistent) {
+ producer.setDeliveryMode(DeliveryMode.PERSISTENT);
+ } else {
+ producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
+ }
+ consumerConnection.start();
+ final byte[] largeMessageContent = new byte[MESSAGE_SIZE];
+ final byte[] receivedContent = new byte[largeMessageContent.length];
+ ThreadLocalRandom.current().nextBytes(largeMessageContent);
+ for (int i = 0; i < MESSAGES; i++) {
+ final BytesMessage sentMessage = producerSession.createBytesMessage();
+ sentMessage.writeBytes(largeMessageContent);
+ producer.send(sentMessage);
+ if (tx) {
+ producerSession.commit();
+ }
+ final Message receivedMessage = consumer.receive(5000);
+ Assert.assertNotNull("A message should be received in 5000 ms", receivedMessage);
+ if (tx) {
+ consumerSession.commit();
+ }
+ Assert.assertThat(receivedMessage, IsInstanceOf.instanceOf(sentMessage.getClass()));
+ Assert.assertEquals(largeMessageContent.length, ((BytesMessage) receivedMessage).readBytes(receivedContent));
+ Assert.assertArrayEquals(largeMessageContent, receivedContent);
+ }
+ }
+ }
+ }
+
+}
\ No newline at end of file
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/AcknowledgeTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/AcknowledgeTest.java
index dc23bc935a..ce6a2290ef 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/AcknowledgeTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/AcknowledgeTest.java
@@ -27,7 +27,6 @@ import org.apache.activemq.artemis.api.core.ActiveMQException;
import org.apache.activemq.artemis.api.core.ActiveMQPropertyConversionException;
import org.apache.activemq.artemis.api.core.ICoreMessage;
import org.apache.activemq.artemis.api.core.Message;
-import org.apache.activemq.artemis.api.core.RefCountMessage;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.api.core.client.ClientConsumer;
import org.apache.activemq.artemis.api.core.client.ClientMessage;
@@ -37,7 +36,7 @@ import org.apache.activemq.artemis.api.core.client.ClientSessionFactory;
import org.apache.activemq.artemis.api.core.client.MessageHandler;
import org.apache.activemq.artemis.api.core.client.ServerLocator;
import org.apache.activemq.artemis.core.client.impl.ClientSessionInternal;
-import org.apache.activemq.artemis.core.message.impl.CoreMessageObjectPools;
+import org.apache.activemq.artemis.core.persistence.CoreMessageObjectPools;
import org.apache.activemq.artemis.core.persistence.Persister;
import org.apache.activemq.artemis.core.protocol.core.impl.ActiveMQConsumerContext;
import org.apache.activemq.artemis.core.server.ActiveMQServer;
@@ -337,7 +336,7 @@ public class AcknowledgeTest extends ActiveMQTestBase {
}
}
- class FakeMessageWithID extends RefCountMessage {
+ class FakeMessageWithID implements Message {
final long id;
@@ -366,12 +365,17 @@ public class AcknowledgeTest extends ActiveMQTestBase {
return 0;
}
+ @Override
+ public int getDurableCount() {
+ return 0;
+ }
+
@Override
public void persist(ActiveMQBuffer targetRecord) {
}
@Override
- public Persister getPersister() {
+ public Persister getPersister() {
return null;
}
@@ -435,22 +439,37 @@ public class AcknowledgeTest extends ActiveMQTestBase {
}
@Override
- public int incrementRefCount() throws Exception {
+ public int getUsage() {
return 0;
}
@Override
- public int decrementRefCount() throws Exception {
+ public int usageUp() {
return 0;
}
@Override
- public int incrementDurableRefCount() {
+ public int usageDown() {
return 0;
}
@Override
- public int decrementDurableRefCount() {
+ public int refUp() {
+ return 0;
+ }
+
+ @Override
+ public int refDown() {
+ return 0;
+ }
+
+ @Override
+ public int durableUp() {
+ return 0;
+ }
+
+ @Override
+ public int durableDown() {
return 0;
}
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/ExpiryLargeMessageTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/ExpiryLargeMessageTest.java
index fd15537895..84885d3804 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/ExpiryLargeMessageTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/ExpiryLargeMessageTest.java
@@ -19,6 +19,7 @@ package org.apache.activemq.artemis.tests.integration.client;
import java.io.File;
import org.apache.activemq.artemis.api.core.Message;
+import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.api.core.client.ClientConsumer;
import org.apache.activemq.artemis.api.core.client.ClientMessage;
@@ -28,11 +29,11 @@ import org.apache.activemq.artemis.api.core.client.ClientSessionFactory;
import org.apache.activemq.artemis.api.core.client.ServerLocator;
import org.apache.activemq.artemis.core.server.ActiveMQServer;
import org.apache.activemq.artemis.core.server.Queue;
-import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.core.settings.impl.AddressFullMessagePolicy;
import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
import org.apache.activemq.artemis.tests.integration.IntegrationTestLogger;
import org.apache.activemq.artemis.tests.util.ActiveMQTestBase;
+import org.apache.activemq.artemis.tests.util.Wait;
import org.junit.Test;
/**
@@ -126,14 +127,10 @@ public class ExpiryLargeMessageTest extends ActiveMQTestBase {
Thread.sleep(1500);
- long timeout = System.currentTimeMillis() + 5000;
- while (timeout > System.currentTimeMillis() && getMessageCount(queueExpiry) != numberOfMessages) {
- // What the Expiry Scan would be doing
+ Wait.assertEquals(numberOfMessages, () -> {
myQueue.expireReferences();
- Thread.sleep(50);
- }
-
- assertEquals(50, getMessageCount(queueExpiry));
+ return getMessageCount(queueExpiry);
+ });
session = sf.createSession(false, false);
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/HangConsumerTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/HangConsumerTest.java
index 3e64ac5fc7..a8e36ba6ae 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/HangConsumerTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/HangConsumerTest.java
@@ -236,7 +236,7 @@ public class HangConsumerTest extends ActiveMQTestBase {
final StorageManager storageManager,
final HierarchicalRepository addressSettingsRepository,
final ArtemisExecutor executor, final ActiveMQServer server) {
- super(id, address, name, filter, pageSubscription, user, durable, temporary, autoCreated, deliveryMode,
+ super(id, address, name, filter, pageSubscription != null ? pageSubscription.getPagingStore() : null, pageSubscription, user, durable, temporary, autoCreated, deliveryMode,
maxConsumers, purgeOnNoConsumers, scheduledExecutor, postOffice, storageManager,
addressSettingsRepository, executor, server, null);
}
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/InterruptedLargeMessageTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/InterruptedLargeMessageTest.java
index 1218852b9b..8ffaedab05 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/InterruptedLargeMessageTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/InterruptedLargeMessageTest.java
@@ -519,7 +519,7 @@ public class InterruptedLargeMessageTest extends LargeMessageTestBase {
StorageManager storageManager,
HierarchicalRepository addressSettingsRepository,
ArtemisExecutor executor) {
- super(id, address, name, filter, pageSubscription, user, durable, temporary, autoCreated, scheduledExecutor,
+ super(id, address, name, filter, pageSubscription != null ? pageSubscription.getPagingStore() : null, pageSubscription, user, durable, temporary, autoCreated, scheduledExecutor,
postOffice, storageManager, addressSettingsRepository, executor, null, null);
}
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/SendAckFailTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/SendAckFailTest.java
index a5c30cfe00..f2f63f5242 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/SendAckFailTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/SendAckFailTest.java
@@ -29,6 +29,8 @@ import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
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.Message;
import org.apache.activemq.artemis.api.core.Pair;
import org.apache.activemq.artemis.api.core.RoutingType;
@@ -803,6 +805,16 @@ public class SendAckFailTest extends SpawnedTestBase {
manager.injectMonitor(monitor);
}
+ @Override
+ public void deleteLargeMessageBody(LargeServerMessage largeServerMessage) throws ActiveMQException {
+ manager.deleteLargeMessageBody(largeServerMessage);
+ }
+
+ @Override
+ public void addBytesToLargeMessage(SequentialFile file, long messageId, ActiveMQBuffer bytes) throws Exception {
+ manager.addBytesToLargeMessage(file, messageId, bytes);
+ }
+
private final StorageManager manager;
StorageManagerDelegate(StorageManager manager) {
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/distribution/AMQPLargeMessageClusterTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/distribution/AMQPLargeMessageClusterTest.java
index e8ac13edcd..e1fa39f5b8 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/distribution/AMQPLargeMessageClusterTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/distribution/AMQPLargeMessageClusterTest.java
@@ -48,22 +48,22 @@ public class AMQPLargeMessageClusterTest extends ClusterTestBase {
private static final int MESSAGES = 1;
private final boolean persistenceEnabled;
- private final boolean compressLargeMessages;
- @Parameterized.Parameters(name = "persistenceEnabled = {0}, compressLargeMessages = {1}")
+ @Parameterized.Parameters(name = "persistenceEnabled = {0}")
public static Iterable extends Object> persistenceEnabled() {
- return Arrays.asList(new Object[][]{{true, false}, {false, false}, {true, true}, {false, true}});
+ return Arrays.asList(new Object[][]{{true}, {false}});
}
- public AMQPLargeMessageClusterTest(boolean persistenceEnabled, boolean compressLargeMessages) {
+ public AMQPLargeMessageClusterTest(boolean persistenceEnabled) {
this.persistenceEnabled = persistenceEnabled;
- this.compressLargeMessages = compressLargeMessages;
}
@Override
@Before
public void setUp() throws Exception {
super.setUp();
+ deleteDirectory(temporaryFolder.getRoot());
+ temporaryFolder.getRoot().mkdirs();
start();
}
@@ -96,21 +96,16 @@ public class AMQPLargeMessageClusterTest extends ClusterTestBase {
waitForBindings(0, queueName, /**/1, 0, false);
waitForBindings(1, queueName, 1, 0, false);
+
String producerUri = "amqp://localhost:61616";
- if (compressLargeMessages) {
- producerUri = producerUri + "?compressLargeMessages=true";
- }
final JmsConnectionFactory producerFactory = new JmsConnectionFactory(producerUri);
try (Connection producerConnection = producerFactory.createConnection(); Session producerSession = producerConnection.createSession(false, Session.AUTO_ACKNOWLEDGE)) {
producerConnection.start();
final Destination queue = producerSession.createQueue(queueName);
String consumerUri = "amqp://localhost:61617";
- if (compressLargeMessages) {
- consumerUri = consumerUri + "?compressLargeMessages=true";
- }
final JmsConnectionFactory consumerConnectionFactory = new JmsConnectionFactory(consumerUri);
try (Connection consumerConnection = consumerConnectionFactory.createConnection(); Session consumerSession = consumerConnection.createSession(false, Session.AUTO_ACKNOWLEDGE); MessageConsumer consumer = consumerSession.createConsumer(queue); MessageProducer producer = producerSession.createProducer(queue)) {
- producer.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
+ producer.setDeliveryMode(DeliveryMode.PERSISTENT);
consumerConnection.start();
final byte[] largeMessageContent = new byte[MESSAGE_SIZE];
final byte[] receivedContent = new byte[largeMessageContent.length];
@@ -122,11 +117,18 @@ public class AMQPLargeMessageClusterTest extends ClusterTestBase {
final Message receivedMessage = consumer.receive(RECEIVE_TIMEOUT_MILLIS);
Assert.assertNotNull("A message should be received in " + RECEIVE_TIMEOUT_MILLIS + " ms", receivedMessage);
Assert.assertThat(receivedMessage, IsInstanceOf.instanceOf(sentMessage.getClass()));
- Assert.assertEquals(largeMessageContent.length, ((BytesMessage) receivedMessage).readBytes(receivedContent));
- Assert.assertArrayEquals(largeMessageContent, receivedContent);
+ try {
+ Assert.assertEquals(largeMessageContent.length, ((BytesMessage) receivedMessage).readBytes(receivedContent));
+ Assert.assertArrayEquals(largeMessageContent, receivedContent);
+ } catch (Throwable e) {
+ e.printStackTrace();
+ System.exit(-1);
+ }
}
}
}
+
+ stopServers(0, 1);
}
protected void setupCluster(final MessageLoadBalancingType messageLoadBalancingType) throws Exception {
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/distribution/ClusterTestBase.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/distribution/ClusterTestBase.java
index 15b96dbb4c..4f92cfdd65 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/distribution/ClusterTestBase.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/distribution/ClusterTestBase.java
@@ -1928,6 +1928,12 @@ public abstract class ClusterTestBase extends ActiveMQTestBase {
log.info("started server " + servers[node]);
waitForServerToStart(servers[node]);
+
+ for (int i = 0; i < node * 1000; i++) {
+ // it is common to have messages landing with similar IDs on separate nodes, which could hide a few issues.
+ // so we make them unequal
+ servers[node].getStorageManager().generateID();
+ }
}
}
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/distribution/LargeMessageRedistributionTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/distribution/LargeMessageRedistributionTest.java
index 888fe3fc9a..07bcbf9c06 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/distribution/LargeMessageRedistributionTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/distribution/LargeMessageRedistributionTest.java
@@ -52,7 +52,7 @@ public class LargeMessageRedistributionTest extends MessageRedistributionTest {
waitForBindings(0, "queues.testaddress", 1, 0, false);
waitForBindings(1, "queues.testaddress", 1, 0, false);
- send(0, "queues.testaddress", numMessages, false, null);
+ send(0, "queues.testaddress", numMessages, true, null);
addConsumer(0, 0, "queue0", null);
verifyReceiveAll(numMessages, 0);
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/journal/MessageJournalTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/journal/MessageJournalTest.java
index 9516771d1b..ff87cd3bf6 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/journal/MessageJournalTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/journal/MessageJournalTest.java
@@ -27,7 +27,7 @@ import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import org.apache.activemq.artemis.core.persistence.impl.journal.JournalStorageManager;
import org.apache.activemq.artemis.core.protocol.core.impl.CoreProtocolManagerFactory;
import org.apache.activemq.artemis.core.server.ActiveMQServer;
-import org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessage;
+import org.apache.activemq.artemis.protocol.amqp.broker.AMQPStandardMessage;
import org.apache.activemq.artemis.protocol.amqp.broker.ProtonProtocolManagerFactory;
import org.apache.activemq.artemis.protocol.amqp.util.NettyReadable;
import org.apache.activemq.artemis.protocol.amqp.util.NettyWritable;
@@ -95,7 +95,7 @@ public class MessageJournalTest extends ActiveMQTestBase {
MessageImpl protonJMessage = (MessageImpl) Message.Factory.create();
- AMQPMessage message = encodeAndCreateAMQPMessage(protonJMessage);
+ AMQPStandardMessage message = encodeAndCreateAMQPMessage(protonJMessage);
message.setMessageID(333);
@@ -127,12 +127,12 @@ public class MessageJournalTest extends ActiveMQTestBase {
}
}
- private AMQPMessage encodeAndCreateAMQPMessage(MessageImpl message) {
+ private AMQPStandardMessage encodeAndCreateAMQPMessage(MessageImpl message) {
NettyWritable encoded = new NettyWritable(Unpooled.buffer(1024));
message.encode(encoded);
NettyReadable readable = new NettyReadable(encoded.getByteBuf());
- return new AMQPMessage(AMQPMessage.DEFAULT_MESSAGE_FORMAT, readable, null, null);
+ return new AMQPStandardMessage(AMQPStandardMessage.DEFAULT_MESSAGE_FORMAT, readable, null, null);
}
}
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/largemessage/ServerLargeMessageTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/largemessage/ServerLargeMessageTest.java
index fcf30b335c..a4c256e638 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/largemessage/ServerLargeMessageTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/largemessage/ServerLargeMessageTest.java
@@ -19,7 +19,6 @@ package org.apache.activemq.artemis.tests.integration.largemessage;
import java.io.File;
import java.io.IOException;
import java.lang.management.ManagementFactory;
-import java.lang.reflect.Field;
import java.net.URL;
import java.nio.ByteBuffer;
import java.util.HashSet;
@@ -230,6 +229,11 @@ public class ServerLargeMessageTest extends ActiveMQTestBase {
return 0;
}
+ @Override
+ public ByteBuffer map(int position, long size) throws IOException {
+ return null;
+ }
+
@Override
public String getFileName() {
return null;
@@ -363,12 +367,10 @@ public class ServerLargeMessageTest extends ActiveMQTestBase {
}
private void replaceFile(LargeServerMessageImpl largeMessage) throws Exception {
- SequentialFile originalFile = largeMessage.getFile();
+ SequentialFile originalFile = largeMessage.getAppendFile();
MockSequentialFile mockFile = new MockSequentialFile(originalFile);
- Field fileField = LargeServerMessageImpl.class.getDeclaredField("file");
- fileField.setAccessible(true);
- fileField.set(largeMessage, mockFile);
+ largeMessage.getLargeBody().replaceFile(mockFile);
mockFile.close();
}
@@ -400,6 +402,11 @@ public class ServerLargeMessageTest extends ActiveMQTestBase {
public void open(int maxIO, boolean useExecutor) throws Exception {
}
+ @Override
+ public ByteBuffer map(int position, long size) throws IOException {
+ return null;
+ }
+
@Override
public boolean isOpen() {
return originalFile.isOpen();
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/paging/PagingTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/paging/PagingTest.java
index cda5311f74..496b1628ae 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/paging/PagingTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/paging/PagingTest.java
@@ -1524,7 +1524,7 @@ public class PagingTest extends ActiveMQTestBase {
Wait.assertEquals(numberOfMessages, queue::getMessageCount);
- ClientMessage msg = consumer.receive(5000);
+ ClientMessage msg = consumer.receiveImmediate();
if (msg != null) {
while (true) {
ClientMessage msg2 = consumer.receive(1000);
@@ -2984,6 +2984,8 @@ public class PagingTest extends ActiveMQTestBase {
}
numberOfMessages++;
+ Assert.assertTrue("something is not letting the system to enter page mode, the test became invalid", numberOfMessages < 2000);
+
producer.send(message);
}
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/replication/SharedNothingReplicationTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/replication/SharedNothingReplicationTest.java
index f05552b0eb..d6fa59dbf6 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/replication/SharedNothingReplicationTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/replication/SharedNothingReplicationTest.java
@@ -39,7 +39,7 @@ import org.apache.activemq.artemis.core.journal.LoaderCallback;
import org.apache.activemq.artemis.core.journal.PreparedTransactionInfo;
import org.apache.activemq.artemis.core.journal.RecordInfo;
import org.apache.activemq.artemis.core.journal.impl.JournalImpl;
-import org.apache.activemq.artemis.core.message.impl.CoreMessageObjectPools;
+import org.apache.activemq.artemis.core.persistence.CoreMessageObjectPools;
import org.apache.activemq.artemis.core.message.impl.CoreMessagePersister;
import org.apache.activemq.artemis.core.persistence.Persister;
import org.apache.activemq.artemis.core.persistence.impl.journal.JournalRecordIds;
@@ -295,7 +295,7 @@ public class SharedNothingReplicationTest extends ActiveMQTestBase {
return conf;
}
- static class SlowMessagePersister extends CoreMessagePersister implements Persister {
+ static class SlowMessagePersister extends CoreMessagePersister implements Persister {
boolean used = false;
@@ -344,8 +344,8 @@ public class SharedNothingReplicationTest extends ActiveMQTestBase {
}
@Override
- public Message decode(ActiveMQBuffer buffer, CoreMessageObjectPools pool) {
- return persister.decode(buffer, pool);
+ public Message decode(ActiveMQBuffer buffer, Message message, CoreMessageObjectPools pool) {
+ return persister.decode(buffer, message, pool);
}
}
diff --git a/tests/performance-tests/src/test/java/org/apache/activemq/artemis/tests/performance/storage/PersistMultiThreadTest.java b/tests/performance-tests/src/test/java/org/apache/activemq/artemis/tests/performance/storage/PersistMultiThreadTest.java
index 30aa4c361e..09c883184f 100644
--- a/tests/performance-tests/src/test/java/org/apache/activemq/artemis/tests/performance/storage/PersistMultiThreadTest.java
+++ b/tests/performance-tests/src/test/java/org/apache/activemq/artemis/tests/performance/storage/PersistMultiThreadTest.java
@@ -189,7 +189,6 @@ public class PersistMultiThreadTest extends ActiveMQTestBase {
private void storeMessage(long txID, long id) throws Exception {
Message message = new CoreMessage(id, 10 * 1024);
- message.setContext(fakePagingStore);
message.getBodyBuffer().writeBytes(new byte[104]);
message.putStringProperty("hello", "" + id);
@@ -197,7 +196,7 @@ public class PersistMultiThreadTest extends ActiveMQTestBase {
storage.storeMessageTransactional(txID, message);
storage.storeReferenceTransactional(txID, 1, id);
- message.decrementRefCount();
+ message.refDown();
}
}
@@ -258,12 +257,12 @@ public class PersistMultiThreadTest extends ActiveMQTestBase {
}
@Override
- public void nonDurableUp(Message message, int nonDurableCoun) {
+ public void refUp(Message message, int nonDurableCoun) {
}
@Override
- public void nonDurableDown(Message message, int nonDurableCoun) {
+ public void refDown(Message message, int nonDurableCoun) {
}
diff --git a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/journal/impl/fakes/FakeSequentialFileFactory.java b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/journal/impl/fakes/FakeSequentialFileFactory.java
index 83681776e3..9091c81a3c 100644
--- a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/journal/impl/fakes/FakeSequentialFileFactory.java
+++ b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/journal/impl/fakes/FakeSequentialFileFactory.java
@@ -305,6 +305,11 @@ public class FakeSequentialFileFactory implements SequentialFileFactory {
notifyAll();
}
+ @Override
+ public ByteBuffer map(int position, long size) throws IOException {
+ return null;
+ }
+
@Override
public void delete() {
if (open) {
diff --git a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/paging/impl/PagingStoreImplTest.java b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/paging/impl/PagingStoreImplTest.java
index b0e8915343..70ab16e6a4 100644
--- a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/paging/impl/PagingStoreImplTest.java
+++ b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/paging/impl/PagingStoreImplTest.java
@@ -832,8 +832,6 @@ public class PagingStoreImplTest extends ActiveMQTestBase {
msg.setAddress(destination);
- msg.setContext(store);
-
msg.getBodyBuffer().resetReaderIndex();
msg.getBodyBuffer().resetWriterIndex();
diff --git a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/FakeQueue.java b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/FakeQueue.java
index 57953432f9..d3a2050444 100644
--- a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/FakeQueue.java
+++ b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/FakeQueue.java
@@ -27,6 +27,7 @@ import org.apache.activemq.artemis.api.core.Pair;
import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.filter.Filter;
+import org.apache.activemq.artemis.core.paging.PagingStore;
import org.apache.activemq.artemis.core.paging.cursor.PageSubscription;
import org.apache.activemq.artemis.core.persistence.OperationContext;
import org.apache.activemq.artemis.core.postoffice.Binding;
@@ -49,6 +50,31 @@ public class FakeQueue extends CriticalComponentImpl implements Queue {
}
+ @Override
+ public PagingStore getPagingStore() {
+ return null;
+ }
+
+ @Override
+ public int durableUp(Message message) {
+ return 1;
+ }
+
+ @Override
+ public int durableDown(Message message) {
+ return 1;
+ }
+
+ @Override
+ public void refUp(Message message) {
+
+ }
+
+ @Override
+ public void refDown(Message message) {
+
+ }
+
@Override
public int getConsumersBeforeDispatch() {
return 0;
diff --git a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/server/impl/QueueImplTest.java b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/server/impl/QueueImplTest.java
index f20cce3d56..a92d0a49fa 100644
--- a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/server/impl/QueueImplTest.java
+++ b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/server/impl/QueueImplTest.java
@@ -460,6 +460,7 @@ public class QueueImplTest extends ActiveMQTestBase {
cons1.getReferences().clear();
for (MessageReference ref : refs) {
+ ref.getMessage().refUp();
queue.acknowledge(ref);
}
diff --git a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/server/impl/fakes/FakePostOffice.java b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/server/impl/fakes/FakePostOffice.java
index 406b40cdc3..fceb3b7911 100644
--- a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/server/impl/fakes/FakePostOffice.java
+++ b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/server/impl/fakes/FakePostOffice.java
@@ -230,10 +230,10 @@ public class FakePostOffice implements PostOffice {
}
@Override
- public MessageReference reroute(final Message message,
+ public MessageReference reload(final Message message,
final Queue queue,
final Transaction tx) throws Exception {
- message.incrementRefCount();
+ message.refUp();
return new MessageReferenceImpl();
}
diff --git a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/server/impl/fakes/FakeQueueFactory.java b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/server/impl/fakes/FakeQueueFactory.java
index 88f0019fa2..70b2eb4cd4 100644
--- a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/server/impl/fakes/FakeQueueFactory.java
+++ b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/server/impl/fakes/FakeQueueFactory.java
@@ -41,7 +41,7 @@ public final class FakeQueueFactory implements QueueFactory {
@Override
public Queue createQueueWith(final QueueConfig config) {
- return new QueueImpl(config.id(), config.address(), config.name(), config.filter(), config.pageSubscription(),
+ return new QueueImpl(config.id(), config.address(), config.name(), config.filter(), config.getPagingStore(), config.pageSubscription(),
config.user(), config.isDurable(), config.isTemporary(), config.isAutoCreated(),
scheduledExecutor, postOffice, null, null, ArtemisExecutor.delegate(executor), null, this);
}
@@ -57,7 +57,7 @@ public final class FakeQueueFactory implements QueueFactory {
final boolean durable,
final boolean temporary,
final boolean autoCreated) {
- return new QueueImpl(persistenceID, address, name, filter, subscription, user, durable, temporary, autoCreated,
+ return new QueueImpl(persistenceID, address, name, filter, subscription != null ? subscription.getPagingStore() : null, subscription, user, durable, temporary, autoCreated,
scheduledExecutor, postOffice, null, null, ArtemisExecutor.delegate(executor), null, this);
}