You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@activemq.apache.org by cl...@apache.org on 2017/03/05 16:50:02 UTC
[01/17] activemq-artemis git commit: ARTEMIS-1009 Pure Message
Encoding. [Forced Update!]
Repository: activemq-artemis
Updated Branches:
refs/heads/artemis-1009 4ade9b212 -> 0a7eee6f5 (forced update)
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/server/FakeStorageManager.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/server/FakeStorageManager.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/server/FakeStorageManager.java
index c3670c5..67cfe18 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/server/FakeStorageManager.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/server/FakeStorageManager.java
@@ -19,8 +19,8 @@ package org.apache.activemq.artemis.tests.integration.server;
import java.util.ArrayList;
import java.util.List;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.core.persistence.impl.nullpm.NullStorageManager;
-import org.apache.activemq.artemis.core.server.ServerMessage;
public class FakeStorageManager extends NullStorageManager {
@@ -29,12 +29,12 @@ public class FakeStorageManager extends NullStorageManager {
List<Long> ackIds = new ArrayList<>();
@Override
- public void storeMessage(final ServerMessage message) throws Exception {
+ public void storeMessage(final Message message) throws Exception {
messageIds.add(message.getMessageID());
}
@Override
- public void storeMessageTransactional(final long txID, final ServerMessage message) throws Exception {
+ public void storeMessageTransactional(final long txID, final Message message) throws Exception {
messageIds.add(message.getMessageID());
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/server/ScaleDownTest.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/server/ScaleDownTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/server/ScaleDownTest.java
index cba3008..ec49ece 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/server/ScaleDownTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/server/ScaleDownTest.java
@@ -425,7 +425,7 @@ public class ScaleDownTest extends ClusterTestBase {
while (!servers[0].getPagingManager().getPageStore(new SimpleString(addressName)).isPaging()) {
for (int i = 0; i < CHUNK_SIZE; i++) {
- Message message = session.createMessage(true);
+ ClientMessage message = session.createMessage(true);
message.getBodyBuffer().writeBytes(new byte[1024]);
producer.send(message);
messageCount++;
@@ -463,7 +463,7 @@ public class ScaleDownTest extends ClusterTestBase {
while (!servers[0].getPagingManager().getPageStore(new SimpleString(addressName)).isPaging()) {
for (int i = 0; i < CHUNK_SIZE; i++) {
- Message message = session.createMessage(true);
+ ClientMessage message = session.createMessage(true);
message.getBodyBuffer().writeBytes(new byte[1024]);
message.putIntProperty("order", i);
producer.send(message);
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/ssl/CoreClientOverOneWaySSLTest.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/ssl/CoreClientOverOneWaySSLTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/ssl/CoreClientOverOneWaySSLTest.java
index 89f7a60..141a6b8 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/ssl/CoreClientOverOneWaySSLTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/ssl/CoreClientOverOneWaySSLTest.java
@@ -27,6 +27,7 @@ import org.apache.activemq.artemis.api.core.ActiveMQConnectionTimedOutException;
import org.apache.activemq.artemis.api.core.ActiveMQException;
import org.apache.activemq.artemis.api.core.ActiveMQNotConnectedException;
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.TransportConfiguration;
import org.apache.activemq.artemis.api.core.client.ActiveMQClient;
@@ -41,7 +42,6 @@ import org.apache.activemq.artemis.core.remoting.impl.netty.NettyAcceptor;
import org.apache.activemq.artemis.core.remoting.impl.netty.TransportConstants;
import org.apache.activemq.artemis.core.remoting.impl.ssl.SSLSupport;
import org.apache.activemq.artemis.core.server.ActiveMQServer;
-import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.tests.integration.IntegrationTestLogger;
import org.apache.activemq.artemis.tests.util.ActiveMQTestBase;
import org.apache.activemq.artemis.utils.RandomUtil;
@@ -127,7 +127,7 @@ public class CoreClientOverOneWaySSLTest extends ActiveMQTestBase {
ClientConsumer consumer = addClientConsumer(session.createConsumer(CoreClientOverOneWaySSLTest.QUEUE));
session.start();
- Message m = consumer.receive(1000);
+ ClientMessage m = consumer.receive(1000);
Assert.assertNotNull(m);
Assert.assertEquals(text, m.getBodyBuffer().readString());
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/ssl/CoreClientOverTwoWaySSLTest.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/ssl/CoreClientOverTwoWaySSLTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/ssl/CoreClientOverTwoWaySSLTest.java
index 772e44d..11b3b0b 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/ssl/CoreClientOverTwoWaySSLTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/ssl/CoreClientOverTwoWaySSLTest.java
@@ -26,7 +26,6 @@ import io.netty.handler.ssl.SslHandler;
import org.apache.activemq.artemis.api.core.ActiveMQException;
import org.apache.activemq.artemis.api.core.ActiveMQNotConnectedException;
import org.apache.activemq.artemis.api.core.Interceptor;
-import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.api.core.TransportConfiguration;
import org.apache.activemq.artemis.api.core.client.ActiveMQClient;
@@ -151,7 +150,7 @@ public class CoreClientOverTwoWaySSLTest extends ActiveMQTestBase {
ClientConsumer consumer = session.createConsumer(CoreClientOverTwoWaySSLTest.QUEUE);
session.start();
- Message m = consumer.receive(1000);
+ ClientMessage m = consumer.receive(1000);
Assert.assertNotNull(m);
Assert.assertEquals(text, m.getBodyBuffer().readString());
}
@@ -189,7 +188,7 @@ public class CoreClientOverTwoWaySSLTest extends ActiveMQTestBase {
ClientConsumer consumer = session.createConsumer(CoreClientOverTwoWaySSLTest.QUEUE);
session.start();
- Message m = consumer.receive(1000);
+ ClientMessage m = consumer.receive(1000);
Assert.assertNotNull(m);
Assert.assertEquals(text, m.getBodyBuffer().readString());
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/performance-tests/src/test/java/org/apache/activemq/artemis/tests/performance/storage/PersistMultiThreadTest.java
----------------------------------------------------------------------
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 0ee92e9..0c4dbf5 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
@@ -26,7 +26,9 @@ import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.apache.activemq.artemis.api.config.ActiveMQDefaultConfiguration;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import org.apache.activemq.artemis.core.paging.PagingManager;
import org.apache.activemq.artemis.core.paging.PagingStore;
import org.apache.activemq.artemis.core.paging.cursor.PageCursorProvider;
@@ -37,8 +39,6 @@ import org.apache.activemq.artemis.core.replication.ReplicationManager;
import org.apache.activemq.artemis.core.server.ActiveMQServer;
import org.apache.activemq.artemis.core.server.JournalType;
import org.apache.activemq.artemis.core.server.RouteContextList;
-import org.apache.activemq.artemis.core.server.ServerMessage;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
import org.apache.activemq.artemis.core.settings.impl.AddressFullMessagePolicy;
import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
import org.apache.activemq.artemis.core.transaction.Transaction;
@@ -188,8 +188,9 @@ public class PersistMultiThreadTest extends ActiveMQTestBase {
}
private void storeMessage(long txID, long id) throws Exception {
- ServerMessage message = new ServerMessageImpl(id, 10 * 1024);
- message.setPagingStore(fakePagingStore);
+ Message message = new CoreMessage(id, 10 * 1024);
+ // TODO-now: fix this
+ message.setContext(fakePagingStore);
message.getBodyBuffer().writeBytes(new byte[104]);
message.putStringProperty("hello", "" + id);
@@ -248,6 +249,26 @@ public class PersistMultiThreadTest extends ActiveMQTestBase {
class FakePagingStore implements PagingStore {
@Override
+ public void durableDown(Message message, int durableCount) {
+
+ }
+
+ @Override
+ public void durableUp(Message message, int durableCount) {
+
+ }
+
+ @Override
+ public void nonDurableUp(Message message, int nonDurableCoun) {
+
+ }
+
+ @Override
+ public void nonDurableDown(Message message, int nonDurableCoun) {
+
+ }
+
+ @Override
public SimpleString getAddress() {
return null;
}
@@ -328,7 +349,7 @@ public class PersistMultiThreadTest extends ActiveMQTestBase {
}
@Override
- public boolean page(ServerMessage message,
+ public boolean page(Message message,
Transaction tx,
RouteContextList listCtx,
ReentrantReadWriteLock.ReadLock readLock) throws Exception {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/stress-tests/src/test/java/org/apache/activemq/artemis/tests/stress/paging/PageCursorStressTest.java
----------------------------------------------------------------------
diff --git a/tests/stress-tests/src/test/java/org/apache/activemq/artemis/tests/stress/paging/PageCursorStressTest.java b/tests/stress-tests/src/test/java/org/apache/activemq/artemis/tests/stress/paging/PageCursorStressTest.java
index d902d3c..61c8d30 100644
--- a/tests/stress-tests/src/test/java/org/apache/activemq/artemis/tests/stress/paging/PageCursorStressTest.java
+++ b/tests/stress-tests/src/test/java/org/apache/activemq/artemis/tests/stress/paging/PageCursorStressTest.java
@@ -25,9 +25,12 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
+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.config.Configuration;
import org.apache.activemq.artemis.core.filter.Filter;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import org.apache.activemq.artemis.core.paging.cursor.PageCache;
import org.apache.activemq.artemis.core.paging.cursor.PageCursorProvider;
import org.apache.activemq.artemis.core.paging.cursor.PageSubscription;
@@ -39,10 +42,7 @@ import org.apache.activemq.artemis.core.persistence.impl.journal.OperationContex
import org.apache.activemq.artemis.core.server.ActiveMQServer;
import org.apache.activemq.artemis.core.server.Queue;
import org.apache.activemq.artemis.core.server.RoutingContext;
-import org.apache.activemq.artemis.api.core.RoutingType;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.impl.RoutingContextImpl;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
import org.apache.activemq.artemis.core.transaction.Transaction;
import org.apache.activemq.artemis.core.transaction.impl.TransactionImpl;
@@ -147,7 +147,7 @@ public class PageCursorStressTest extends ActiveMQTestBase {
PageSubscription cursorEven = createNonPersistentCursor(new Filter() {
@Override
- public boolean match(ServerMessage message) {
+ public boolean match(Message message) {
Boolean property = message.getBooleanProperty("even");
if (property == null) {
return false;
@@ -166,7 +166,7 @@ public class PageCursorStressTest extends ActiveMQTestBase {
PageSubscription cursorOdd = createNonPersistentCursor(new Filter() {
@Override
- public boolean match(ServerMessage message) {
+ public boolean match(Message message) {
Boolean property = message.getBooleanProperty("even");
if (property == null) {
return false;
@@ -382,7 +382,7 @@ public class PageCursorStressTest extends ActiveMQTestBase {
ActiveMQBuffer buffer = RandomUtil.randomBuffer(messageSize, i + 1L);
- ServerMessage msg = new ServerMessageImpl(i, buffer.writerIndex());
+ Message msg = new CoreMessage(i, buffer.writerIndex());
msg.putIntProperty("key", i);
msg.getBodyBuffer().writeBytes(buffer, 0, buffer.writerIndex());
@@ -415,7 +415,7 @@ public class PageCursorStressTest extends ActiveMQTestBase {
ActiveMQBuffer buffer = RandomUtil.randomBuffer(messageSize, i + 1L);
- ServerMessage msg = new ServerMessageImpl(i, buffer.writerIndex());
+ Message msg = new CoreMessage(i, buffer.writerIndex());
msg.putIntProperty("key", i);
msg.getBodyBuffer().writeBytes(buffer, 0, buffer.writerIndex());
@@ -445,7 +445,7 @@ public class PageCursorStressTest extends ActiveMQTestBase {
ActiveMQBuffer buffer = RandomUtil.randomBuffer(messageSize, i + 1L);
- ServerMessage msg = new ServerMessageImpl(i, buffer.writerIndex());
+ Message msg = new CoreMessage(i, buffer.writerIndex());
msg.putIntProperty("key", i + 1);
msg.getBodyBuffer().writeBytes(buffer, 0, buffer.writerIndex());
@@ -530,7 +530,7 @@ public class PageCursorStressTest extends ActiveMQTestBase {
//System.out.println("Sending " + count);
ActiveMQBuffer buffer = RandomUtil.randomBuffer(messageSize, count);
- ServerMessage msg = new ServerMessageImpl(i, buffer.writerIndex());
+ Message msg = new CoreMessage(i, buffer.writerIndex());
msg.putIntProperty("key", count++);
msg.getBodyBuffer().writeBytes(buffer, 0, buffer.writerIndex());
@@ -666,7 +666,7 @@ public class PageCursorStressTest extends ActiveMQTestBase {
}
- private int tstProperty(ServerMessage msg) {
+ private int tstProperty(Message msg) {
return msg.getIntProperty("key").intValue();
}
@@ -747,7 +747,7 @@ public class PageCursorStressTest extends ActiveMQTestBase {
System.out.println("Paged " + i);
ActiveMQBuffer buffer = RandomUtil.randomBuffer(messageSize, i + 1L);
- ServerMessage msg = new ServerMessageImpl(i, buffer.writerIndex());
+ Message msg = new CoreMessage(i, buffer.writerIndex());
msg.putIntProperty("key", i);
// to be used on tests that are validating filters
msg.putBooleanProperty("even", i % 2 == 0);
@@ -850,7 +850,7 @@ public class PageCursorStressTest extends ActiveMQTestBase {
for (int i = start; i < start + NUM_MESSAGES; i++) {
ActiveMQBuffer buffer = RandomUtil.randomBuffer(messageSize, i + 1L);
- ServerMessage msg = new ServerMessageImpl(storage.generateID(), buffer.writerIndex());
+ Message msg = new CoreMessage(storage.generateID(), buffer.writerIndex());
msg.getBodyBuffer().writeBytes(buffer, 0, buffer.writerIndex());
msg.putIntProperty("key", i);
pageStore.page(msg, ctx.getTransaction(), ctx.getContextListing(ADDRESS), lock);
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/timing-tests/src/test/java/org/apache/activemq/artemis/tests/timing/core/server/impl/QueueConcurrentTest.java
----------------------------------------------------------------------
diff --git a/tests/timing-tests/src/test/java/org/apache/activemq/artemis/tests/timing/core/server/impl/QueueConcurrentTest.java b/tests/timing-tests/src/test/java/org/apache/activemq/artemis/tests/timing/core/server/impl/QueueConcurrentTest.java
index 34ce7ac..6d73cfd 100644
--- a/tests/timing-tests/src/test/java/org/apache/activemq/artemis/tests/timing/core/server/impl/QueueConcurrentTest.java
+++ b/tests/timing-tests/src/test/java/org/apache/activemq/artemis/tests/timing/core/server/impl/QueueConcurrentTest.java
@@ -19,12 +19,12 @@ package org.apache.activemq.artemis.tests.timing.core.server.impl;
import java.util.ArrayList;
import java.util.List;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.server.HandleStatus;
import org.apache.activemq.artemis.core.server.MessageReference;
import org.apache.activemq.artemis.core.server.Queue;
import org.apache.activemq.artemis.core.server.QueueConfig;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.impl.QueueImpl;
import org.apache.activemq.artemis.tests.unit.UnitTestLogger;
import org.apache.activemq.artemis.tests.unit.core.server.impl.fakes.FakeConsumer;
@@ -138,9 +138,9 @@ public class QueueConcurrentTest extends ActiveMQTestBase {
long start = System.currentTimeMillis();
while (System.currentTimeMillis() - start < testTime) {
- ServerMessage message = generateMessage(i);
+ Message message = generateMessage(i);
- MessageReference ref = message.createReference(queue);
+ MessageReference ref = MessageReference.Factory.createReference(message, queue);
queue.addTail(ref, false);
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/unit-tests/pom.xml
----------------------------------------------------------------------
diff --git a/tests/unit-tests/pom.xml b/tests/unit-tests/pom.xml
index 32ca63b..803bf39 100644
--- a/tests/unit-tests/pom.xml
+++ b/tests/unit-tests/pom.xml
@@ -54,6 +54,12 @@
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
+ <artifactId>artemis-amqp-protocol</artifactId>
+ <version>${project.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.activemq</groupId>
<artifactId>artemis-jms-server</artifactId>
<version>${project.version}</version>
</dependency>
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/journal/impl/JournalImplTestUnit.java
----------------------------------------------------------------------
diff --git a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/journal/impl/JournalImplTestUnit.java b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/journal/impl/JournalImplTestUnit.java
index d1536d4..39507aa 100644
--- a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/journal/impl/JournalImplTestUnit.java
+++ b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/journal/impl/JournalImplTestUnit.java
@@ -2426,7 +2426,7 @@ public abstract class JournalImplTestUnit extends JournalImplTestBase {
}
@Test
- public void testTransactionChangesNotVisibleOutsideTX() throws Exception {
+ public void testTransactionChangesNotVisibleOutsideTXtestTransactionChangesNotVisibleOutsideTX() throws Exception {
setup(10, 10 * 1024, true);
createJournal();
startJournal();
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/message/impl/MessageImplTest.java
----------------------------------------------------------------------
diff --git a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/message/impl/MessageImplTest.java b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/message/impl/MessageImplTest.java
index 252b0eb..e88097a 100644
--- a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/message/impl/MessageImplTest.java
+++ b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/message/impl/MessageImplTest.java
@@ -21,11 +21,12 @@ import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicInteger;
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.client.impl.ClientMessageImpl;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionSendMessage;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
import org.apache.activemq.artemis.tests.util.ActiveMQTestBase;
import org.apache.activemq.artemis.utils.RandomUtil;
import org.junit.Assert;
@@ -46,9 +47,9 @@ public class MessageImplTest extends ActiveMQTestBase {
final long expiration = RandomUtil.randomLong();
final long timestamp = RandomUtil.randomLong();
final byte priority = RandomUtil.randomByte();
- Message message1 = new ClientMessageImpl(type, durable, expiration, timestamp, priority, 100);
+ ICoreMessage message1 = new ClientMessageImpl(type, durable, expiration, timestamp, priority, 100);
- Message message = message1;
+ ICoreMessage message = message1;
Assert.assertEquals(type, message.getType());
Assert.assertEquals(durable, message.isDurable());
@@ -63,7 +64,7 @@ public class MessageImplTest extends ActiveMQTestBase {
final byte priority2 = RandomUtil.randomByte();
message.setAddress(destination);
- Assert.assertEquals(destination, message.getAddress());
+ Assert.assertEquals(destination, message.getAddressSimpleString());
message.setDurable(durable2);
Assert.assertEquals(durable2, message.isDurable());
@@ -232,10 +233,9 @@ public class MessageImplTest extends ActiveMQTestBase {
private void internalMessageCopy() throws Exception {
final long RUNS = 2;
- final ServerMessageImpl msg = new ServerMessageImpl(123, 18);
+ final CoreMessage msg = new CoreMessage(123, 18);
msg.setMessageID(RandomUtil.randomLong());
- msg.encodeMessageIDToBuffer();
msg.setAddress(new SimpleString("Batatantkashf aksjfh aksfjh askfdjh askjfh "));
final AtomicInteger errors = new AtomicInteger(0);
@@ -257,7 +257,7 @@ public class MessageImplTest extends ActiveMQTestBase {
for (int i = 0; i < RUNS; i++) {
try {
- ServerMessageImpl newMsg = (ServerMessageImpl) msg.copy();
+ Message newMsg = msg.copy();
} catch (Throwable e) {
e.printStackTrace();
errors.incrementAndGet();
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/paging/impl/PageTest.java
----------------------------------------------------------------------
diff --git a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/paging/impl/PageTest.java b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/paging/impl/PageTest.java
index d6e0f72..847e8b7 100644
--- a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/paging/impl/PageTest.java
+++ b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/paging/impl/PageTest.java
@@ -17,23 +17,26 @@
package org.apache.activemq.artemis.tests.unit.core.paging.impl;
import java.nio.ByteBuffer;
-import java.util.ArrayList;
import java.util.List;
-import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
+import org.apache.activemq.artemis.api.core.ICoreMessage;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.io.SequentialFile;
import org.apache.activemq.artemis.core.io.SequentialFileFactory;
import org.apache.activemq.artemis.core.io.nio.NIOSequentialFileFactory;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
+import org.apache.activemq.artemis.core.message.impl.CoreMessagePersister;
import org.apache.activemq.artemis.core.paging.PagedMessage;
import org.apache.activemq.artemis.core.paging.impl.Page;
import org.apache.activemq.artemis.core.paging.impl.PagedMessageImpl;
import org.apache.activemq.artemis.core.persistence.impl.nullpm.NullStorageManager;
-import org.apache.activemq.artemis.core.server.ServerMessage;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
+import org.apache.activemq.artemis.core.protocol.core.impl.CoreProtocolManagerFactory;
+import org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessagePersister;
+import org.apache.activemq.artemis.spi.core.protocol.MessagePersister;
import org.apache.activemq.artemis.tests.unit.core.journal.impl.fakes.FakeSequentialFileFactory;
import org.apache.activemq.artemis.tests.util.ActiveMQTestBase;
import org.junit.Assert;
+import org.junit.Before;
import org.junit.Test;
public class PageTest extends ActiveMQTestBase {
@@ -47,6 +50,12 @@ public class PageTest extends ActiveMQTestBase {
// Public --------------------------------------------------------
+ @Before
+ public void registerProtocols() {
+ MessagePersister.registerPersister(CoreProtocolManagerFactory.ID, CoreMessagePersister.getInstance());
+ MessagePersister.registerPersister((byte)2, AMQPMessagePersister.getInstance());
+ }
+
@Test
public void testPageWithNIO() throws Exception {
recreateDirectory(getTestDir());
@@ -64,6 +73,11 @@ public class PageTest extends ActiveMQTestBase {
testAdd(new FakeSequentialFileFactory(1, false), 10);
}
+ @Test
+ public void testAddCore() throws Exception {
+ testAdd(new NIOSequentialFileFactory(getTestDirfile(), 1), 1);
+ }
+
/**
* Validate if everything we add is recovered
*/
@@ -89,7 +103,7 @@ public class PageTest extends ActiveMQTestBase {
SimpleString simpleDestination = new SimpleString("Test");
- ArrayList<ActiveMQBuffer> buffers = addPageElements(simpleDestination, impl, numberOfElements);
+ addPageElements(simpleDestination, impl, numberOfElements);
impl.sync();
impl.close();
@@ -105,9 +119,7 @@ public class PageTest extends ActiveMQTestBase {
Assert.assertEquals(numberOfElements, impl.getNumberOfMessages());
for (int i = 0; i < msgs.size(); i++) {
- Assert.assertEquals(simpleDestination, msgs.get(i).getMessage().getAddress());
-
- ActiveMQTestBase.assertEqualsByteArrays(buffers.get(i).toByteBuffer().array(), msgs.get(i).getMessage().getBodyBuffer().toByteBuffer().array());
+ Assert.assertEquals(simpleDestination, msgs.get(i).getMessage().getAddressSimpleString());
}
impl.delete(null);
@@ -130,7 +142,7 @@ public class PageTest extends ActiveMQTestBase {
SimpleString simpleDestination = new SimpleString("Test");
- ArrayList<ActiveMQBuffer> buffers = addPageElements(simpleDestination, impl, numberOfElements);
+ addPageElements(simpleDestination, impl, numberOfElements);
impl.sync();
@@ -170,9 +182,7 @@ public class PageTest extends ActiveMQTestBase {
Assert.assertEquals(numberOfElements, impl.getNumberOfMessages());
for (int i = 0; i < msgs.size(); i++) {
- Assert.assertEquals(simpleDestination, msgs.get(i).getMessage().getAddress());
-
- ActiveMQTestBase.assertEqualsByteArrays(buffers.get(i).toByteBuffer().array(), msgs.get(i).getMessage().getBodyBuffer().toByteBuffer().array());
+ Assert.assertEquals(simpleDestination, msgs.get(i).getMessage().getAddressSimpleString());
}
impl.delete(null);
@@ -190,29 +200,25 @@ public class PageTest extends ActiveMQTestBase {
* @return
* @throws Exception
*/
- protected ArrayList<ActiveMQBuffer> addPageElements(final SimpleString simpleDestination,
+ protected void addPageElements(final SimpleString simpleDestination,
final Page page,
final int numberOfElements) throws Exception {
- ArrayList<ActiveMQBuffer> buffers = new ArrayList<>();
int initialNumberOfMessages = page.getNumberOfMessages();
for (int i = 0; i < numberOfElements; i++) {
- ServerMessage msg = new ServerMessageImpl(i, 100);
+ ICoreMessage msg = new CoreMessage().initBuffer(100);
for (int j = 0; j < 10; j++) {
msg.getBodyBuffer().writeByte((byte) 'b');
}
- buffers.add(msg.getBodyBuffer());
-
msg.setAddress(simpleDestination);
page.write(new PagedMessageImpl(msg, new long[0]));
Assert.assertEquals(initialNumberOfMessages + i + 1, page.getNumberOfMessages());
}
- return buffers;
}
// Package protected ---------------------------------------------
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/paging/impl/PagingManagerImplTest.java
----------------------------------------------------------------------
diff --git a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/paging/impl/PagingManagerImplTest.java b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/paging/impl/PagingManagerImplTest.java
index 10b9a06..60f7a15 100644
--- a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/paging/impl/PagingManagerImplTest.java
+++ b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/paging/impl/PagingManagerImplTest.java
@@ -22,7 +22,9 @@ import java.util.List;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
+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.paging.PagedMessage;
import org.apache.activemq.artemis.core.paging.PagingStore;
import org.apache.activemq.artemis.core.paging.impl.Page;
@@ -30,9 +32,7 @@ import org.apache.activemq.artemis.core.paging.impl.PagingManagerImpl;
import org.apache.activemq.artemis.core.paging.impl.PagingStoreFactoryNIO;
import org.apache.activemq.artemis.core.persistence.StorageManager;
import org.apache.activemq.artemis.core.persistence.impl.nullpm.NullStorageManager;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.impl.RoutingContextImpl;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
import org.apache.activemq.artemis.core.settings.HierarchicalRepository;
import org.apache.activemq.artemis.core.settings.impl.AddressFullMessagePolicy;
import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
@@ -63,7 +63,7 @@ public class PagingManagerImplTest extends ActiveMQTestBase {
PagingStore store = managerImpl.getPageStore(new SimpleString("simple-test"));
- ServerMessage msg = createMessage(1L, new SimpleString("simple-test"), createRandomBuffer(10));
+ ICoreMessage msg = createMessage(1L, new SimpleString("simple-test"), createRandomBuffer(10));
final RoutingContextImpl ctx = new RoutingContextImpl(null);
Assert.assertFalse(store.page(msg, ctx.getTransaction(), ctx.getContextListing(store.getStoreName()), lock));
@@ -82,7 +82,7 @@ public class PagingManagerImplTest extends ActiveMQTestBase {
Assert.assertEquals(1, msgs.size());
- ActiveMQTestBase.assertEqualsByteArrays(msg.getBodyBuffer().writerIndex(), msg.getBodyBuffer().toByteBuffer().array(), msgs.get(0).getMessage().getBodyBuffer().toByteBuffer().array());
+ ActiveMQTestBase.assertEqualsByteArrays(msg.getBodyBuffer().writerIndex(), msg.getBodyBuffer().toByteBuffer().array(), (msgs.get(0).getMessage()).toCore().getBodyBuffer().toByteBuffer().array());
Assert.assertTrue(store.isPaging());
@@ -104,10 +104,10 @@ public class PagingManagerImplTest extends ActiveMQTestBase {
pageDirDir.mkdirs();
}
- protected ServerMessage createMessage(final long messageId,
- final SimpleString destination,
- final ByteBuffer buffer) {
- ServerMessage msg = new ServerMessageImpl(messageId, 200);
+ protected ICoreMessage createMessage(final long messageId,
+ final SimpleString destination,
+ final ByteBuffer buffer) {
+ ICoreMessage msg = new CoreMessage(messageId, 200);
msg.setAddress(destination);
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/paging/impl/PagingStoreImplTest.java
----------------------------------------------------------------------
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 923e719..af58a53 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
@@ -33,10 +33,12 @@ import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
import org.apache.activemq.artemis.api.core.ActiveMQBuffers;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.io.SequentialFile;
import org.apache.activemq.artemis.core.io.SequentialFileFactory;
import org.apache.activemq.artemis.core.io.nio.NIOSequentialFileFactory;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import org.apache.activemq.artemis.core.paging.PageTransactionInfo;
import org.apache.activemq.artemis.core.paging.PagedMessage;
import org.apache.activemq.artemis.core.paging.PagingManager;
@@ -49,10 +51,8 @@ import org.apache.activemq.artemis.core.paging.impl.PageTransactionInfoImpl;
import org.apache.activemq.artemis.core.paging.impl.PagingStoreImpl;
import org.apache.activemq.artemis.core.persistence.StorageManager;
import org.apache.activemq.artemis.core.persistence.impl.nullpm.NullStorageManager;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.files.FileStoreMonitor;
import org.apache.activemq.artemis.core.server.impl.RoutingContextImpl;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
import org.apache.activemq.artemis.core.settings.HierarchicalRepository;
import org.apache.activemq.artemis.core.settings.impl.AddressFullMessagePolicy;
import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
@@ -152,7 +152,7 @@ public class PagingStoreImplTest extends ActiveMQTestBase {
buffers.add(buffer);
SimpleString destination = new SimpleString("test");
- ServerMessage msg = createMessage(1, storeImpl, destination, buffer);
+ Message msg = createMessage(1, storeImpl, destination, buffer);
Assert.assertTrue(storeImpl.isPaging());
@@ -197,7 +197,7 @@ public class PagingStoreImplTest extends ActiveMQTestBase {
buffers.add(buffer);
- ServerMessage msg = createMessage(i, storeImpl, destination, buffer);
+ Message msg = createMessage(i, storeImpl, destination, buffer);
final RoutingContextImpl ctx = new RoutingContextImpl(null);
Assert.assertTrue(storeImpl.page(msg, ctx.getTransaction(), ctx.getContextListing(storeImpl.getStoreName()), lock));
@@ -224,7 +224,7 @@ public class PagingStoreImplTest extends ActiveMQTestBase {
for (int i = 0; i < numMessages; i++) {
ActiveMQBuffer horn1 = buffers.get(i);
- ActiveMQBuffer horn2 = msg.get(i).getMessage().getBodyBuffer();
+ ActiveMQBuffer horn2 = msg.get(i).getMessage().toCore().getBodyBuffer();
horn1.resetReaderIndex();
horn2.resetReaderIndex();
for (int j = 0; j < horn1.writerIndex(); j++) {
@@ -263,7 +263,7 @@ public class PagingStoreImplTest extends ActiveMQTestBase {
store.forceAnotherPage();
}
- ServerMessage msg = createMessage(i, store, destination, buffer);
+ Message msg = createMessage(i, store, destination, buffer);
final RoutingContextImpl ctx = new RoutingContextImpl(null);
Assert.assertTrue(store.page(msg, ctx.getTransaction(), ctx.getContextListing(store.getStoreName()), lock));
@@ -290,7 +290,7 @@ public class PagingStoreImplTest extends ActiveMQTestBase {
for (int i = 0; i < 5; i++) {
Assert.assertEquals(sequence++, msg.get(i).getMessage().getMessageID());
- ActiveMQTestBase.assertEqualsBuffers(18, buffers.get(pageNr * 5 + i), msg.get(i).getMessage().getBodyBuffer());
+ ActiveMQTestBase.assertEqualsBuffers(18, buffers.get(pageNr * 5 + i), msg.get(i).getMessage().toCore().getBodyBuffer());
}
}
@@ -298,7 +298,7 @@ public class PagingStoreImplTest extends ActiveMQTestBase {
Assert.assertTrue(store.isPaging());
- ServerMessage msg = createMessage(1, store, destination, buffers.get(0));
+ Message msg = createMessage(1, store, destination, buffers.get(0));
final RoutingContextImpl ctx = new RoutingContextImpl(null);
Assert.assertTrue(store.page(msg, ctx.getTransaction(), ctx.getContextListing(store.getStoreName()), lock));
@@ -341,7 +341,7 @@ public class PagingStoreImplTest extends ActiveMQTestBase {
Assert.assertEquals(1L, msgs.get(0).getMessage().getMessageID());
- ActiveMQTestBase.assertEqualsBuffers(18, buffers.get(0), msgs.get(0).getMessage().getBodyBuffer());
+ ActiveMQTestBase.assertEqualsBuffers(18, buffers.get(0), msgs.get(0).getMessage().toCore().getBodyBuffer());
Assert.assertEquals(1, store.getNumberOfPages());
@@ -374,7 +374,7 @@ public class PagingStoreImplTest extends ActiveMQTestBase {
final CountDownLatch latchStart = new CountDownLatch(numberOfThreads);
- final ConcurrentHashMap<Long, ServerMessage> buffers = new ConcurrentHashMap<>();
+ final ConcurrentHashMap<Long, Message> buffers = new ConcurrentHashMap<>();
final ArrayList<Page> readPages = new ArrayList<>();
@@ -408,7 +408,7 @@ public class PagingStoreImplTest extends ActiveMQTestBase {
// Each thread will Keep paging until all the messages are depaged.
// This is possible because the depage thread is not actually reading the pages.
// Just using the internal API to remove it from the page file system
- ServerMessage msg = createMessage(id, storeImpl, destination, createRandomBuffer(id, 5));
+ Message msg = createMessage(id, storeImpl, destination, createRandomBuffer(id, 5));
final RoutingContextImpl ctx2 = new RoutingContextImpl(null);
if (storeImpl.page(msg, ctx2.getTransaction(), ctx2.getContextListing(storeImpl.getStoreName()), lock)) {
buffers.put(id, msg);
@@ -477,7 +477,7 @@ public class PagingStoreImplTest extends ActiveMQTestBase {
throw consumer.e;
}
- final ConcurrentMap<Long, ServerMessage> buffers2 = new ConcurrentHashMap<>();
+ final ConcurrentMap<Long, Message> buffers2 = new ConcurrentHashMap<>();
for (Page page : readPages) {
page.open();
@@ -485,14 +485,14 @@ public class PagingStoreImplTest extends ActiveMQTestBase {
page.close();
for (PagedMessage msg : msgs) {
- long id = msg.getMessage().getBodyBuffer().readLong();
- msg.getMessage().getBodyBuffer().resetReaderIndex();
+ long id = msg.getMessage().toCore().getBodyBuffer().readLong();
+ msg.getMessage().toCore().getBodyBuffer().resetReaderIndex();
- ServerMessage msgWritten = buffers.remove(id);
+ Message msgWritten = buffers.remove(id);
buffers2.put(id, msg.getMessage());
Assert.assertNotNull(msgWritten);
- Assert.assertEquals(msg.getMessage().getAddress(), msgWritten.getAddress());
- ActiveMQTestBase.assertEqualsBuffers(10, msgWritten.getBodyBuffer(), msg.getMessage().getBodyBuffer());
+ Assert.assertEquals(msg.getMessage().getAddress(), msgWritten.getAddressSimpleString());
+ ActiveMQTestBase.assertEqualsBuffers(10, msgWritten.toCore().getBodyBuffer(), msg.getMessage().toCore().getBodyBuffer());
}
}
@@ -522,7 +522,7 @@ public class PagingStoreImplTest extends ActiveMQTestBase {
Assert.assertEquals(numberOfPages, storeImpl2.getNumberOfPages());
long lastMessageId = messageIdGenerator.incrementAndGet();
- ServerMessage lastMsg = createMessage(lastMessageId, storeImpl, destination, createRandomBuffer(lastMessageId, 5));
+ Message lastMsg = createMessage(lastMessageId, storeImpl, destination, createRandomBuffer(lastMessageId, 5));
storeImpl2.forceAnotherPage();
@@ -547,11 +547,11 @@ public class PagingStoreImplTest extends ActiveMQTestBase {
for (PagedMessage msg : msgs) {
- long id = msg.getMessage().getBodyBuffer().readLong();
- ServerMessage msgWritten = buffers2.remove(id);
+ long id = msg.getMessage().toCore().getBodyBuffer().readLong();
+ Message msgWritten = buffers2.remove(id);
Assert.assertNotNull(msgWritten);
- Assert.assertEquals(msg.getMessage().getAddress(), msgWritten.getAddress());
- ActiveMQTestBase.assertEqualsByteArrays(msgWritten.getBodyBuffer().writerIndex(), msgWritten.getBodyBuffer().toByteBuffer().array(), msg.getMessage().getBodyBuffer().toByteBuffer().array());
+ Assert.assertEquals(msg.getMessage().getAddress(), msgWritten.getAddressSimpleString());
+ ActiveMQTestBase.assertEqualsByteArrays(msgWritten.toCore().getBodyBuffer().writerIndex(), msgWritten.toCore().getBodyBuffer().toByteBuffer().array(), msg.getMessage().toCore().getBodyBuffer().toByteBuffer().array());
}
}
@@ -560,8 +560,8 @@ public class PagingStoreImplTest extends ActiveMQTestBase {
lastPage.close();
Assert.assertEquals(1, lastMessages.size());
- lastMessages.get(0).getMessage().getBodyBuffer().resetReaderIndex();
- Assert.assertEquals(lastMessages.get(0).getMessage().getBodyBuffer().readLong(), lastMessageId);
+ lastMessages.get(0).getMessage().toCore().getBodyBuffer().resetReaderIndex();
+ Assert.assertEquals(lastMessages.get(0).getMessage().toCore().getBodyBuffer().readLong(), lastMessageId);
Assert.assertEquals(0, buffers2.size());
@@ -643,7 +643,7 @@ public class PagingStoreImplTest extends ActiveMQTestBase {
// Each thread will Keep paging until all the messages are depaged.
// This is possible because the depage thread is not actually reading the pages.
// Just using the internal API to remove it from the page file system
- ServerMessage msg = createMessage(i, store, destination, createRandomBuffer(i, 1024));
+ Message msg = createMessage(i, store, destination, createRandomBuffer(i, 1024));
msg.putLongProperty("count", i);
final RoutingContextImpl ctx2 = new RoutingContextImpl(null);
@@ -681,7 +681,7 @@ public class PagingStoreImplTest extends ActiveMQTestBase {
List<PagedMessage> messages = page.read(new NullStorageManager());
for (PagedMessage pgmsg : messages) {
- ServerMessage msg = pgmsg.getMessage();
+ Message msg = pgmsg.getMessage();
Assert.assertEquals(msgsRead++, msg.getMessageID());
@@ -739,15 +739,15 @@ public class PagingStoreImplTest extends ActiveMQTestBase {
};
}
- private ServerMessage createMessage(final long id,
+ private CoreMessage createMessage(final long id,
final PagingStore store,
final SimpleString destination,
final ActiveMQBuffer buffer) {
- ServerMessage msg = new ServerMessageImpl(id, 50 + buffer.capacity());
+ CoreMessage msg = new CoreMessage(id, 50 + buffer.capacity());
msg.setAddress(destination);
- msg.setPagingStore(store);
+ msg.setContext(store);
msg.getBodyBuffer().resetReaderIndex();
msg.getBodyBuffer().resetWriterIndex();
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/BindingsImplTest.java
----------------------------------------------------------------------
diff --git a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/BindingsImplTest.java b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/BindingsImplTest.java
index 8cc138d..830e61f 100644
--- a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/BindingsImplTest.java
+++ b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/BindingsImplTest.java
@@ -22,8 +22,10 @@ import java.util.List;
import java.util.Set;
import org.apache.activemq.artemis.api.core.ActiveMQException;
+import org.apache.activemq.artemis.api.core.Message;
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.postoffice.Binding;
import org.apache.activemq.artemis.core.postoffice.BindingType;
import org.apache.activemq.artemis.core.postoffice.Bindings;
@@ -31,10 +33,8 @@ import org.apache.activemq.artemis.core.postoffice.impl.BindingsImpl;
import org.apache.activemq.artemis.core.server.Bindable;
import org.apache.activemq.artemis.core.server.Queue;
import org.apache.activemq.artemis.core.server.RoutingContext;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.impl.RefsOperation;
import org.apache.activemq.artemis.core.server.impl.RoutingContextImpl;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
import org.apache.activemq.artemis.core.transaction.Transaction;
import org.apache.activemq.artemis.core.transaction.TransactionOperation;
import org.apache.activemq.artemis.tests.util.ActiveMQTestBase;
@@ -91,9 +91,9 @@ public class BindingsImplTest extends ActiveMQTestBase {
for (int i = 0; i < 100; i++) {
if (route) {
- bind.route(new ServerMessageImpl(i, 100), new RoutingContextImpl(new FakeTransaction()));
+ bind.route(new CoreMessage(i, 100), new RoutingContextImpl(new FakeTransaction()));
} else {
- bind.redistribute(new ServerMessageImpl(i, 100), queue, new RoutingContextImpl(new FakeTransaction()));
+ bind.redistribute(new CoreMessage(i, 100), queue, new RoutingContextImpl(new FakeTransaction()));
}
}
}
@@ -273,7 +273,7 @@ public class BindingsImplTest extends ActiveMQTestBase {
* @see org.apache.activemq.artemis.core.filter.Filter#match(org.apache.activemq.artemis.core.server.ServerMessage)
*/
@Override
- public boolean match(final ServerMessage message) {
+ public boolean match(final Message message) {
return false;
}
@@ -372,12 +372,12 @@ public class BindingsImplTest extends ActiveMQTestBase {
}
@Override
- public boolean isHighAcceptPriority(final ServerMessage message) {
+ public boolean isHighAcceptPriority(final Message message) {
return false;
}
@Override
- public void route(final ServerMessage message, final RoutingContext context) throws Exception {
+ public void route(final Message message, final RoutingContext context) throws Exception {
}
@@ -395,7 +395,7 @@ public class BindingsImplTest extends ActiveMQTestBase {
}
@Override
- public void routeWithAck(ServerMessage message, RoutingContext context) {
+ public void routeWithAck(Message message, RoutingContext context) {
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/FakeQueue.java
----------------------------------------------------------------------
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 8171e39..66bdddb 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
@@ -22,6 +22,8 @@ import java.util.Set;
import java.util.concurrent.Executor;
import org.apache.activemq.artemis.api.config.ActiveMQDefaultConfiguration;
+
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.filter.Filter;
import org.apache.activemq.artemis.core.paging.cursor.PageSubscription;
@@ -30,7 +32,6 @@ import org.apache.activemq.artemis.core.server.MessageReference;
import org.apache.activemq.artemis.core.server.Queue;
import org.apache.activemq.artemis.core.server.RoutingContext;
import org.apache.activemq.artemis.api.core.RoutingType;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.impl.AckReason;
import org.apache.activemq.artemis.core.transaction.Transaction;
import org.apache.activemq.artemis.utils.LinkedListIterator;
@@ -539,18 +540,18 @@ public class FakeQueue implements Queue {
}
@Override
- public void route(final ServerMessage message, final RoutingContext context) throws Exception {
+ public void route(final Message message, final RoutingContext context) throws Exception {
// no-op
}
@Override
- public void routeWithAck(ServerMessage message, RoutingContext context) {
+ public void routeWithAck(Message message, RoutingContext context) {
}
@Override
- public boolean hasMatchingConsumer(final ServerMessage message) {
+ public boolean hasMatchingConsumer(final Message message) {
// no-op
return false;
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/WildcardAddressManagerUnitTest.java
----------------------------------------------------------------------
diff --git a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/WildcardAddressManagerUnitTest.java b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/WildcardAddressManagerUnitTest.java
index 3718afb..b74a4c0 100644
--- a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/WildcardAddressManagerUnitTest.java
+++ b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/postoffice/impl/WildcardAddressManagerUnitTest.java
@@ -19,6 +19,7 @@ package org.apache.activemq.artemis.tests.unit.core.postoffice.impl;
import java.util.ArrayList;
import java.util.Collection;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.filter.Filter;
import org.apache.activemq.artemis.core.postoffice.Binding;
@@ -29,7 +30,6 @@ import org.apache.activemq.artemis.core.postoffice.impl.WildcardAddressManager;
import org.apache.activemq.artemis.core.server.Bindable;
import org.apache.activemq.artemis.core.server.Queue;
import org.apache.activemq.artemis.core.server.RoutingContext;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.cluster.impl.MessageLoadBalancingType;
import org.apache.activemq.artemis.tests.util.ActiveMQTestBase;
import org.junit.Test;
@@ -132,7 +132,7 @@ public class WildcardAddressManagerUnitTest extends ActiveMQTestBase {
}
@Override
- public boolean isHighAcceptPriority(ServerMessage message) {
+ public boolean isHighAcceptPriority(Message message) {
return false;
}
@@ -152,7 +152,7 @@ public class WildcardAddressManagerUnitTest extends ActiveMQTestBase {
}
@Override
- public void route(ServerMessage message, RoutingContext context) throws Exception {
+ public void route(Message message, RoutingContext context) throws Exception {
}
@Override
@@ -170,7 +170,7 @@ public class WildcardAddressManagerUnitTest extends ActiveMQTestBase {
}
@Override
- public void routeWithAck(ServerMessage message, RoutingContext context) {
+ public void routeWithAck(Message message, RoutingContext context) {
}
}
@@ -204,14 +204,14 @@ public class WildcardAddressManagerUnitTest extends ActiveMQTestBase {
}
@Override
- public boolean redistribute(ServerMessage message,
+ public boolean redistribute(Message message,
Queue originatingQueue,
RoutingContext context) throws Exception {
return false;
}
@Override
- public void route(ServerMessage message, RoutingContext context) throws Exception {
+ public void route(Message message, RoutingContext context) throws Exception {
System.out.println("routing message: " + message);
}
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/server/impl/QueueImplTest.java
----------------------------------------------------------------------
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 804429f..78179a8 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
@@ -25,6 +25,7 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.api.core.client.ClientMessage;
import org.apache.activemq.artemis.api.core.client.ClientProducer;
@@ -40,7 +41,6 @@ import org.apache.activemq.artemis.core.server.Consumer;
import org.apache.activemq.artemis.core.server.HandleStatus;
import org.apache.activemq.artemis.core.server.MessageReference;
import org.apache.activemq.artemis.core.server.Queue;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.impl.QueueImpl;
import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
import org.apache.activemq.artemis.tests.unit.core.server.impl.fakes.FakeConsumer;
@@ -157,7 +157,7 @@ public class QueueImplTest extends ActiveMQTestBase {
Filter filter = new Filter() {
@Override
- public boolean match(final ServerMessage message) {
+ public boolean match(final Message message) {
return false;
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/server/impl/fakes/FakeFilter.java
----------------------------------------------------------------------
diff --git a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/server/impl/fakes/FakeFilter.java b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/server/impl/fakes/FakeFilter.java
index 9d7f0e1..8f394e2 100644
--- a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/server/impl/fakes/FakeFilter.java
+++ b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/server/impl/fakes/FakeFilter.java
@@ -16,9 +16,10 @@
*/
package org.apache.activemq.artemis.tests.unit.core.server.impl.fakes;
+
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.filter.Filter;
-import org.apache.activemq.artemis.core.server.ServerMessage;
public class FakeFilter implements Filter {
@@ -36,9 +37,9 @@ public class FakeFilter implements Filter {
}
@Override
- public boolean match(final ServerMessage message) {
+ public boolean match(final Message message) {
if (headerName != null) {
- Object value = message.getObjectProperty(new SimpleString(headerName));
+ Object value = message.getObjectProperty(headerName);
if (value instanceof SimpleString) {
value = ((SimpleString) value).toString();
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/server/impl/fakes/FakeJournalLoader.java
----------------------------------------------------------------------
diff --git a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/server/impl/fakes/FakeJournalLoader.java b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/server/impl/fakes/FakeJournalLoader.java
index 547d669..a84d2d0 100644
--- a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/server/impl/fakes/FakeJournalLoader.java
+++ b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/server/impl/fakes/FakeJournalLoader.java
@@ -20,6 +20,7 @@ import javax.transaction.xa.Xid;
import java.util.List;
import java.util.Map;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.Pair;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.journal.Journal;
@@ -29,7 +30,6 @@ import org.apache.activemq.artemis.core.persistence.QueueBindingInfo;
import org.apache.activemq.artemis.core.persistence.impl.PageCountPending;
import org.apache.activemq.artemis.core.persistence.impl.journal.AddMessageRecord;
import org.apache.activemq.artemis.core.server.MessageReference;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.impl.JournalLoader;
import org.apache.activemq.artemis.core.transaction.ResourceManager;
import org.apache.activemq.artemis.core.transaction.Transaction;
@@ -37,7 +37,7 @@ import org.apache.activemq.artemis.core.transaction.Transaction;
public class FakeJournalLoader implements JournalLoader {
@Override
- public void handleNoMessageReferences(Map<Long, ServerMessage> messages) {
+ public void handleNoMessageReferences(Map<Long, Message> messages) {
}
@Override
@@ -69,7 +69,7 @@ public class FakeJournalLoader implements JournalLoader {
}
@Override
- public void handlePreparedSendMessage(ServerMessage message, Transaction tx, long queueID) {
+ public void handlePreparedSendMessage(Message message, Transaction tx, long queueID) {
}
@Override
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/core/server/impl/fakes/FakePostOffice.java
----------------------------------------------------------------------
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 6602df5..109a336 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
@@ -21,6 +21,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.Pair;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.persistence.impl.nullpm.NullStorageManager;
@@ -35,7 +36,6 @@ import org.apache.activemq.artemis.core.server.MessageReference;
import org.apache.activemq.artemis.core.server.Queue;
import org.apache.activemq.artemis.core.server.RoutingContext;
import org.apache.activemq.artemis.api.core.RoutingType;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.impl.AddressInfo;
import org.apache.activemq.artemis.core.server.impl.MessageReferenceImpl;
import org.apache.activemq.artemis.core.transaction.Transaction;
@@ -173,14 +173,14 @@ public class FakePostOffice implements PostOffice {
}
@Override
- public Pair<RoutingContext, ServerMessage> redistribute(final ServerMessage message,
- final Queue originatingQueue,
- final Transaction tx) throws Exception {
+ public Pair<RoutingContext, Message> redistribute(final Message message,
+ final Queue originatingQueue,
+ final Transaction tx) throws Exception {
return null;
}
@Override
- public MessageReference reroute(final ServerMessage message,
+ public MessageReference reroute(final Message message,
final Queue queue,
final Transaction tx) throws Exception {
message.incrementRefCount();
@@ -188,14 +188,14 @@ public class FakePostOffice implements PostOffice {
}
@Override
- public RoutingStatus route(ServerMessage message,
+ public RoutingStatus route(Message message,
Transaction tx,
boolean direct) throws Exception {
return RoutingStatus.OK;
}
@Override
- public RoutingStatus route(ServerMessage message,
+ public RoutingStatus route(Message message,
Transaction tx,
boolean direct,
boolean rejectDuplicates) throws Exception {
@@ -203,12 +203,12 @@ public class FakePostOffice implements PostOffice {
}
@Override
- public RoutingStatus route(ServerMessage message, RoutingContext context, boolean direct) throws Exception {
+ public RoutingStatus route(Message message, RoutingContext context, boolean direct) throws Exception {
return null;
}
@Override
- public RoutingStatus route(ServerMessage message,
+ public RoutingStatus route(Message message,
RoutingContext context,
boolean direct,
boolean rejectDuplicates) throws Exception {
@@ -216,11 +216,11 @@ public class FakePostOffice implements PostOffice {
}
@Override
- public void processRoute(ServerMessage message, RoutingContext context, boolean direct) throws Exception {
+ public void processRoute(Message message, RoutingContext context, boolean direct) throws Exception {
}
@Override
- public RoutingStatus route(ServerMessage message, boolean direct) throws Exception {
+ public RoutingStatus route(Message message, boolean direct) throws Exception {
return RoutingStatus.OK;
}
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/util/FakePagingManager.java
----------------------------------------------------------------------
diff --git a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/util/FakePagingManager.java b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/util/FakePagingManager.java
index 500a81f..d1012a6 100644
--- a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/util/FakePagingManager.java
+++ b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/util/FakePagingManager.java
@@ -19,11 +19,12 @@ package org.apache.activemq.artemis.tests.unit.util;
import java.util.Collection;
import java.util.Map;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.paging.PageTransactionInfo;
import org.apache.activemq.artemis.core.paging.PagingManager;
import org.apache.activemq.artemis.core.paging.PagingStore;
-import org.apache.activemq.artemis.core.server.ServerMessage;
+
import org.apache.activemq.artemis.core.server.files.FileStoreMonitor;
public final class FakePagingManager implements PagingManager {
@@ -64,11 +65,11 @@ public final class FakePagingManager implements PagingManager {
return false;
}
- public boolean page(final ServerMessage message, final boolean duplicateDetection) throws Exception {
+ public boolean page(final Message message, final boolean duplicateDetection) throws Exception {
return false;
}
- public boolean page(final ServerMessage message,
+ public boolean page(final Message message,
final long transactionId,
final boolean duplicateDetection) throws Exception {
return false;
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/util/MemorySizeTest.java
----------------------------------------------------------------------
diff --git a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/util/MemorySizeTest.java b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/util/MemorySizeTest.java
index 3fa2df8..2b5205e 100644
--- a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/util/MemorySizeTest.java
+++ b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/util/MemorySizeTest.java
@@ -16,8 +16,8 @@
*/
package org.apache.activemq.artemis.tests.unit.util;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import org.apache.activemq.artemis.core.server.impl.MessageReferenceImpl;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
import org.apache.activemq.artemis.tests.unit.UnitTestLogger;
import org.apache.activemq.artemis.utils.MemorySize;
import org.junit.Assert;
@@ -30,7 +30,7 @@ public class MemorySizeTest extends Assert {
UnitTestLogger.LOGGER.info("Server message size is " + MemorySize.calculateSize(new MemorySize.ObjectFactory() {
@Override
public Object createObject() {
- return new ServerMessageImpl(1, 1000);
+ return new CoreMessage(1, 1000);
}
}));
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/util/UTF8Test.java
----------------------------------------------------------------------
diff --git a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/util/UTF8Test.java b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/util/UTF8Test.java
index b07f5bf..570c791 100644
--- a/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/util/UTF8Test.java
+++ b/tests/unit-tests/src/test/java/org/apache/activemq/artemis/tests/unit/util/UTF8Test.java
@@ -44,7 +44,7 @@ public class UTF8Test extends ActiveMQTestBase {
String str = new String(bytes);
- UTF8Util.saveUTF(buffer, str);
+ UTF8Util.saveUTF(buffer.byteBuf(), str);
String newStr = UTF8Util.readUTF(buffer);
@@ -72,7 +72,7 @@ public class UTF8Test extends ActiveMQTestBase {
}
private void testValidateUTFOnDataInputStream(final String str, final ActiveMQBuffer wrap) throws Exception {
- UTF8Util.saveUTF(wrap, str);
+ UTF8Util.saveUTF(wrap.byteBuf(), str);
DataInputStream data = new DataInputStream(new ByteArrayInputStream(wrap.toByteBuffer().array()));
@@ -106,7 +106,7 @@ public class UTF8Test extends ActiveMQTestBase {
ActiveMQBuffer buffer = ActiveMQBuffers.fixedBuffer(0xffff + 4);
try {
- UTF8Util.saveUTF(buffer, str);
+ UTF8Util.saveUTF(buffer.byteBuf(), str);
Assert.fail("String is too big, supposed to throw an exception");
} catch (Exception ignored) {
}
@@ -122,7 +122,7 @@ public class UTF8Test extends ActiveMQTestBase {
str = new String(chars);
try {
- UTF8Util.saveUTF(buffer, str);
+ UTF8Util.saveUTF(buffer.byteBuf(), str);
Assert.fail("Encoded String is too big, supposed to throw an exception");
} catch (Exception ignored) {
}
@@ -138,7 +138,7 @@ public class UTF8Test extends ActiveMQTestBase {
str = new String(chars);
- UTF8Util.saveUTF(buffer, str);
+ UTF8Util.saveUTF(buffer.byteBuf(), str);
Assert.assertEquals(0xffff + DataConstants.SIZE_SHORT, buffer.writerIndex());
[07/17] activemq-artemis git commit: ARTEMIS-1009 Pure Message
Encoding.
Posted by cl...@apache.org.
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenwireMessage.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..186900b
--- /dev/null
+++ b/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenwireMessage.java
@@ -0,0 +1,504 @@
+/**
+ * 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.protocol.openwire;
+
+import java.util.Set;
+
+import io.netty.buffer.ByteBuf;
+import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
+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.RoutingType;
+import org.apache.activemq.artemis.api.core.SimpleString;
+import org.apache.activemq.artemis.core.persistence.Persister;
+
+// TODO: Implement this
+public class OpenwireMessage implements Message {
+
+ @Override
+ public boolean containsProperty(SimpleString key) {
+ return false;
+ }
+
+ @Override
+ public void messageChanged() {
+
+ }
+
+ @Override
+ public RoutingType getRouteType() {
+ return null;
+ }
+
+ @Override
+ public SimpleString getReplyTo() {
+ return null;
+ }
+
+ @Override
+ public Message setReplyTo(SimpleString address) {
+ return null;
+ }
+
+ @Override
+ public boolean containsDeliveryAnnotationProperty(SimpleString property) {
+ return false;
+ }
+
+ @Override
+ public Object removeDeliveryAnnoationProperty(SimpleString key) {
+ return null;
+ }
+
+ @Override
+ public Object getDeliveryAnnotationProperty(SimpleString key) {
+ return null;
+ }
+
+ @Override
+ public Long getScheduledDeliveryTime() {
+ 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 ByteBuf getBuffer() {
+ return null;
+ }
+
+ @Override
+ public Message copy() {
+ return null;
+ }
+
+ @Override
+ public Message copy(long newID) {
+ return null;
+ }
+
+ @Override
+ public long getMessageID() {
+ return 0;
+ }
+
+ @Override
+ public Message setMessageID(long id) {
+ return null;
+ }
+
+ @Override
+ public long getExpiration() {
+ return 0;
+ }
+
+ @Override
+ public Message setExpiration(long expiration) {
+ return null;
+ }
+
+ @Override
+ public Object getUserID() {
+ return null;
+ }
+
+ @Override
+ public Message setUserID(Object userID) {
+ return null;
+ }
+
+ @Override
+ public void copyHeadersAndProperties(Message msg) {
+
+ }
+
+ @Override
+ public boolean isDurable() {
+ return false;
+ }
+
+ @Override
+ public Message setDurable(boolean durable) {
+ return null;
+ }
+
+ @Override
+ public Persister<Message> getPersister() {
+ return null;
+ }
+
+ @Override
+ public String getAddress() {
+ return null;
+ }
+
+ @Override
+ public Message setAddress(String address) {
+ return null;
+ }
+
+ @Override
+ public SimpleString getAddressSimpleString() {
+ return null;
+ }
+
+ @Override
+ public Message setAddress(SimpleString address) {
+ return null;
+ }
+
+ @Override
+ public long getTimestamp() {
+ return 0;
+ }
+
+ @Override
+ public Message setTimestamp(long timestamp) {
+ return null;
+ }
+
+ @Override
+ public byte getPriority() {
+ return 0;
+ }
+
+ @Override
+ public Message setPriority(byte priority) {
+ return null;
+ }
+
+ @Override
+ public void receiveBuffer(ByteBuf buffer) {
+
+ }
+
+ @Override
+ public void sendBuffer(ByteBuf buffer, int deliveryCount) {
+
+ }
+
+ @Override
+ public int getPersistSize() {
+ return 0;
+ }
+
+ @Override
+ public void persist(ActiveMQBuffer targetRecord) {
+
+ }
+
+ @Override
+ public void reloadPersistence(ActiveMQBuffer record) {
+
+ }
+
+ @Override
+ public Message putBooleanProperty(String key, boolean value) {
+ return null;
+ }
+
+ @Override
+ public Message putByteProperty(String key, byte value) {
+ return null;
+ }
+
+ @Override
+ public Message putBytesProperty(String key, byte[] value) {
+ return null;
+ }
+
+ @Override
+ public Message putShortProperty(String key, short value) {
+ return null;
+ }
+
+ @Override
+ public Message putCharProperty(String key, char value) {
+ return null;
+ }
+
+ @Override
+ public Message putIntProperty(String key, int value) {
+ return null;
+ }
+
+ @Override
+ public Message putLongProperty(String key, long value) {
+ return null;
+ }
+
+ @Override
+ public Message putFloatProperty(String key, float value) {
+ return null;
+ }
+
+ @Override
+ public Message putDoubleProperty(String key, double value) {
+ return null;
+ }
+
+ @Override
+ public Message putBooleanProperty(SimpleString key, boolean value) {
+ return null;
+ }
+
+ @Override
+ public Message putByteProperty(SimpleString key, byte value) {
+ return null;
+ }
+
+ @Override
+ public Message putBytesProperty(SimpleString key, byte[] value) {
+ return null;
+ }
+
+ @Override
+ public Message putShortProperty(SimpleString key, short value) {
+ return null;
+ }
+
+ @Override
+ public Message putCharProperty(SimpleString key, char value) {
+ return null;
+ }
+
+ @Override
+ public Message putIntProperty(SimpleString key, int value) {
+ return null;
+ }
+
+ @Override
+ public Message putLongProperty(SimpleString key, long value) {
+ return null;
+ }
+
+ @Override
+ public Message putFloatProperty(SimpleString key, float value) {
+ return null;
+ }
+
+ @Override
+ public Message putDoubleProperty(SimpleString key, double value) {
+ return null;
+ }
+
+ @Override
+ public Message putStringProperty(String key, String value) {
+ return null;
+ }
+
+ @Override
+ public Message putObjectProperty(String key, Object value) throws ActiveMQPropertyConversionException {
+ return null;
+ }
+
+ @Override
+ public Message putObjectProperty(SimpleString key, Object value) throws ActiveMQPropertyConversionException {
+ return null;
+ }
+
+ @Override
+ public Object removeProperty(String key) {
+ return null;
+ }
+
+ @Override
+ public boolean containsProperty(String key) {
+ return false;
+ }
+
+ @Override
+ public Boolean getBooleanProperty(String key) throws ActiveMQPropertyConversionException {
+ return null;
+ }
+
+ @Override
+ public Byte getByteProperty(String key) throws ActiveMQPropertyConversionException {
+ return null;
+ }
+
+ @Override
+ public Double getDoubleProperty(String key) throws ActiveMQPropertyConversionException {
+ return null;
+ }
+
+ @Override
+ public Integer getIntProperty(String key) throws ActiveMQPropertyConversionException {
+ return null;
+ }
+
+ @Override
+ public Long getLongProperty(String key) throws ActiveMQPropertyConversionException {
+ return null;
+ }
+
+ @Override
+ public Object getObjectProperty(String key) {
+ return null;
+ }
+
+ @Override
+ public Short getShortProperty(String key) throws ActiveMQPropertyConversionException {
+ return null;
+ }
+
+ @Override
+ public Float getFloatProperty(String key) throws ActiveMQPropertyConversionException {
+ return null;
+ }
+
+ @Override
+ public String getStringProperty(String key) throws ActiveMQPropertyConversionException {
+ return null;
+ }
+
+ @Override
+ public SimpleString getSimpleStringProperty(String key) throws ActiveMQPropertyConversionException {
+ return null;
+ }
+
+ @Override
+ public byte[] getBytesProperty(String key) throws ActiveMQPropertyConversionException {
+ return new byte[0];
+ }
+
+ @Override
+ public Object removeProperty(SimpleString key) {
+ return null;
+ }
+
+ @Override
+ public Boolean getBooleanProperty(SimpleString key) throws ActiveMQPropertyConversionException {
+ return null;
+ }
+
+ @Override
+ public Byte getByteProperty(SimpleString key) throws ActiveMQPropertyConversionException {
+ return null;
+ }
+
+ @Override
+ public Double getDoubleProperty(SimpleString key) throws ActiveMQPropertyConversionException {
+ return null;
+ }
+
+ @Override
+ public Integer getIntProperty(SimpleString key) throws ActiveMQPropertyConversionException {
+ return null;
+ }
+
+ @Override
+ public Long getLongProperty(SimpleString key) throws ActiveMQPropertyConversionException {
+ return null;
+ }
+
+ @Override
+ public Object getObjectProperty(SimpleString key) {
+ return null;
+ }
+
+ @Override
+ public Short getShortProperty(SimpleString key) throws ActiveMQPropertyConversionException {
+ return null;
+ }
+
+ @Override
+ public Float getFloatProperty(SimpleString key) throws ActiveMQPropertyConversionException {
+ return null;
+ }
+
+ @Override
+ public String getStringProperty(SimpleString key) throws ActiveMQPropertyConversionException {
+ return null;
+ }
+
+ @Override
+ public SimpleString getSimpleStringProperty(SimpleString key) throws ActiveMQPropertyConversionException {
+ return null;
+ }
+
+ @Override
+ public byte[] getBytesProperty(SimpleString key) throws ActiveMQPropertyConversionException {
+ return new byte[0];
+ }
+
+ @Override
+ public Message putStringProperty(SimpleString key, SimpleString value) {
+ return null;
+ }
+
+ @Override
+ public int getEncodeSize() {
+ return 0;
+ }
+
+ @Override
+ public Set<SimpleString> getPropertyNames() {
+ return null;
+ }
+
+ @Override
+ public int getRefCount() {
+ return 0;
+ }
+
+ @Override
+ public int incrementRefCount() throws Exception {
+ return 0;
+ }
+
+ @Override
+ public int decrementRefCount() throws Exception {
+ return 0;
+ }
+
+ @Override
+ public int incrementDurableRefCount() {
+ return 0;
+ }
+
+ @Override
+ public int decrementDurableRefCount() {
+ return 0;
+ }
+
+ @Override
+ public ICoreMessage toCore() {
+ return null;
+ }
+
+ @Override
+ public int getMemoryEstimate() {
+ return 0;
+ }
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/amq/AMQConsumer.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/amq/AMQConsumer.java b/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/amq/AMQConsumer.java
index f471a2a..3bdee8b 100644
--- a/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/amq/AMQConsumer.java
+++ b/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/amq/AMQConsumer.java
@@ -27,15 +27,16 @@ import java.util.concurrent.atomic.AtomicInteger;
import org.apache.activemq.advisory.AdvisorySupport;
import org.apache.activemq.artemis.api.core.ActiveMQQueueExistsException;
+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;
import org.apache.activemq.artemis.core.client.impl.ClientConsumerImpl;
import org.apache.activemq.artemis.core.protocol.openwire.OpenWireMessageConverter;
import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
import org.apache.activemq.artemis.core.server.MessageReference;
import org.apache.activemq.artemis.core.server.QueueQueryResult;
-import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.core.server.ServerConsumer;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.SlowConsumerDetectionListener;
import org.apache.activemq.artemis.core.server.impl.AddressInfo;
import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
@@ -208,7 +209,7 @@ public class AMQConsumer {
}
- public int handleDeliver(MessageReference reference, ServerMessage message, int deliveryCount) {
+ public int handleDeliver(MessageReference reference, ICoreMessage message, int deliveryCount) {
MessageDispatch dispatch;
try {
if (messagePullHandler != null && !messagePullHandler.checkForcedConsumer(message)) {
@@ -394,7 +395,7 @@ public class AMQConsumer {
}
}
- public boolean checkForcedConsumer(ServerMessage message) {
+ public boolean checkForcedConsumer(Message message) {
if (message.containsProperty(ClientConsumerImpl.FORCED_DELIVERY_MESSAGE)) {
if (next >= 0) {
if (timeout <= 0) {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/amq/AMQSession.java
----------------------------------------------------------------------
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 79004ae..b5d2c86 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
@@ -23,6 +23,7 @@ import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
+import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.paging.PagingStore;
import org.apache.activemq.artemis.core.postoffice.RoutingStatus;
@@ -34,9 +35,7 @@ import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
import org.apache.activemq.artemis.core.server.BindingQueryResult;
import org.apache.activemq.artemis.core.server.MessageReference;
import org.apache.activemq.artemis.core.server.QueueQueryResult;
-import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.core.server.ServerConsumer;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.ServerSession;
import org.apache.activemq.artemis.core.server.SlowConsumerDetectionListener;
import org.apache.activemq.artemis.reader.MessageUtil;
@@ -231,16 +230,17 @@ public class AMQSession implements SessionCallback {
@Override
public int sendMessage(MessageReference reference,
- ServerMessage message,
+ org.apache.activemq.artemis.api.core.Message message,
ServerConsumer consumer,
int deliveryCount) {
AMQConsumer theConsumer = (AMQConsumer) consumer.getProtocolData();
- return theConsumer.handleDeliver(reference, message, deliveryCount);
+ // TODO: use encoders and proper conversions here
+ return theConsumer.handleDeliver(reference, message.toCore(), deliveryCount);
}
@Override
public int sendLargeMessage(MessageReference reference,
- ServerMessage message,
+ org.apache.activemq.artemis.api.core.Message message,
ServerConsumer consumerID,
long bodySize,
int deliveryCount) {
@@ -296,7 +296,7 @@ public class AMQSession implements SessionCallback {
actualDestinations = new ActiveMQDestination[]{destination};
}
- ServerMessage originalCoreMsg = getConverter().inbound(messageSend);
+ org.apache.activemq.artemis.api.core.Message originalCoreMsg = getConverter().inbound(messageSend);
if (connection.isNoLocal()) {
//Note: advisory messages are dealt with in
@@ -324,7 +324,7 @@ public class AMQSession implements SessionCallback {
for (int i = 0; i < actualDestinations.length; i++) {
ActiveMQDestination dest = actualDestinations[i];
SimpleString address = new SimpleString(dest.getPhysicalName());
- ServerMessage coreMsg = originalCoreMsg.copy();
+ org.apache.activemq.artemis.api.core.Message coreMsg = originalCoreMsg.copy();
coreMsg.setAddress(address);
if (actualDestinations[i].isQueue()) {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/util/OpenWireUtil.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/util/OpenWireUtil.java b/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/util/OpenWireUtil.java
index 5355c63..c84776b 100644
--- a/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/util/OpenWireUtil.java
+++ b/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/util/OpenWireUtil.java
@@ -18,8 +18,9 @@ package org.apache.activemq.artemis.core.protocol.openwire.util;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
import org.apache.activemq.artemis.api.core.ActiveMQBuffers;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.core.config.WildcardConfiguration;
-import org.apache.activemq.artemis.core.server.ServerMessage;
+
import org.apache.activemq.artemis.core.transaction.impl.XidImpl;
import org.apache.activemq.command.ActiveMQDestination;
import org.apache.activemq.command.ActiveMQQueue;
@@ -53,9 +54,14 @@ public class OpenWireUtil {
* set on publish/send so a divert or wildcard may mean thats its different to the destination subscribed to by the
* consumer
*/
- public static ActiveMQDestination toAMQAddress(ServerMessage message, ActiveMQDestination actualDestination) {
- String address = message.getAddress().toString();
+ public static ActiveMQDestination toAMQAddress(Message message, ActiveMQDestination actualDestination) {
+ String address = message.getAddress();
String strippedAddress = address;//.replace(JMS_QUEUE_ADDRESS_PREFIX, "").replace(JMS_TEMP_QUEUE_ADDRESS_PREFIX, "").replace(JMS_TOPIC_ADDRESS_PREFIX, "").replace(JMS_TEMP_TOPIC_ADDRESS_PREFIX, "");
+
+ if (address == null) {
+ return actualDestination;
+ }
+
if (actualDestination.isQueue()) {
return new ActiveMQQueue(strippedAddress);
} else {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/ActiveMQStompProtocolMessageBundle.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/ActiveMQStompProtocolMessageBundle.java b/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/ActiveMQStompProtocolMessageBundle.java
index 861c524..d377abd 100644
--- a/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/ActiveMQStompProtocolMessageBundle.java
+++ b/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/ActiveMQStompProtocolMessageBundle.java
@@ -16,7 +16,6 @@
*/
package org.apache.activemq.artemis.core.protocol.stomp;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
import org.jboss.logging.Messages;
import org.jboss.logging.annotations.Cause;
import org.jboss.logging.annotations.Message;
@@ -71,7 +70,7 @@ public interface ActiveMQStompProtocolMessageBundle {
ActiveMQStompException invalidConnection();
@Message(id = 339011, value = "Error sending message {0}", format = Message.Format.MESSAGE_FORMAT)
- ActiveMQStompException errorSendMessage(ServerMessageImpl message, @Cause Exception e);
+ ActiveMQStompException errorSendMessage(org.apache.activemq.artemis.api.core.Message message, @Cause Exception e);
@Message(id = 339012, value = "Error beginning a transaction {0}", format = Message.Format.MESSAGE_FORMAT)
ActiveMQStompException errorBeginTx(String txID, @Cause Exception e);
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/StompConnection.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/StompConnection.java b/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/StompConnection.java
index c004a0e..56067f1 100644
--- a/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/StompConnection.java
+++ b/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/StompConnection.java
@@ -30,18 +30,18 @@ import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
import org.apache.activemq.artemis.api.core.ActiveMQBuffers;
import org.apache.activemq.artemis.api.core.ActiveMQException;
import org.apache.activemq.artemis.api.core.ActiveMQQueueExistsException;
+import org.apache.activemq.artemis.api.core.ICoreMessage;
+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.message.impl.CoreMessage;
import org.apache.activemq.artemis.core.protocol.stomp.v10.StompFrameHandlerV10;
import org.apache.activemq.artemis.core.protocol.stomp.v12.StompFrameHandlerV12;
import org.apache.activemq.artemis.core.remoting.CloseListener;
import org.apache.activemq.artemis.core.remoting.FailureListener;
import org.apache.activemq.artemis.core.remoting.impl.netty.TransportConstants;
import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
-import org.apache.activemq.artemis.api.core.RoutingType;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.ServerSession;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
import org.apache.activemq.artemis.spi.core.remoting.Acceptor;
@@ -569,7 +569,7 @@ public final class StompConnection implements RemotingConnection {
return valid;
}
- public ServerMessageImpl createServerMessage() {
+ public CoreMessage createServerMessage() {
return manager.createServerMessage();
}
@@ -598,7 +598,7 @@ public final class StompConnection implements RemotingConnection {
}
}
- protected void sendServerMessage(ServerMessageImpl message, String txID) throws ActiveMQStompException {
+ protected void sendServerMessage(ICoreMessage message, String txID) throws ActiveMQStompException {
StompSession stompSession = getSession(txID);
if (stompSession.isNoLocal()) {
@@ -611,7 +611,7 @@ public final class StompConnection implements RemotingConnection {
if (minLargeMessageSize == -1 || (message.getBodyBuffer().writerIndex() < minLargeMessageSize)) {
stompSession.sendInternal(message, false);
} else {
- stompSession.sendInternalLarge(message, false);
+ stompSession.sendInternalLarge((CoreMessage)message, false);
}
} catch (Exception e) {
throw BUNDLE.errorSendMessage(message, e).setHandler(frameHandler);
@@ -726,10 +726,11 @@ public final class StompConnection implements RemotingConnection {
return SERVER_NAME;
}
- public StompFrame createStompMessage(ServerMessage serverMessage,
+ public StompFrame createStompMessage(ICoreMessage serverMessage,
+ ActiveMQBuffer bodyBuffer,
StompSubscription subscription,
int deliveryCount) throws Exception {
- return frameHandler.createMessageFrame(serverMessage, subscription, deliveryCount);
+ return frameHandler.createMessageFrame(serverMessage, bodyBuffer, subscription, deliveryCount);
}
public void addStompEventListener(FrameEventListener listener) {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/StompProtocolManager.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/StompProtocolManager.java b/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/StompProtocolManager.java
index 54339a4..39d2fe9 100644
--- a/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/StompProtocolManager.java
+++ b/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/StompProtocolManager.java
@@ -33,15 +33,14 @@ import org.apache.activemq.artemis.api.core.BaseInterceptor;
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.CoreMessage;
import org.apache.activemq.artemis.core.remoting.impl.netty.NettyServerConnection;
import org.apache.activemq.artemis.core.remoting.impl.netty.TransportConstants;
import org.apache.activemq.artemis.core.server.ActiveMQServer;
import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
import org.apache.activemq.artemis.core.server.ServerSession;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
import org.apache.activemq.artemis.spi.core.protocol.AbstractProtocolManager;
import org.apache.activemq.artemis.spi.core.protocol.ConnectionEntry;
-import org.apache.activemq.artemis.spi.core.protocol.MessageConverter;
import org.apache.activemq.artemis.spi.core.protocol.ProtocolManagerFactory;
import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
import org.apache.activemq.artemis.spi.core.remoting.Acceptor;
@@ -109,13 +108,6 @@ public class StompProtocolManager extends AbstractProtocolManager<StompFrame, St
}
@Override
- public MessageConverter getConverter() {
- return null;
- }
-
- // ProtocolManager implementation --------------------------------
-
- @Override
public ConnectionEntry createConnectionEntry(final Acceptor acceptorUsed, final Connection connection) {
StompConnection conn = new StompConnection(acceptorUsed, connection, this, server.getScheduledPool(), server.getExecutorFactory());
@@ -345,8 +337,8 @@ public class StompProtocolManager extends AbstractProtocolManager<StompFrame, St
return validated;
}
- public ServerMessageImpl createServerMessage() {
- return new ServerMessageImpl(server.getStorageManager().generateID(), 512);
+ public CoreMessage createServerMessage() {
+ return new CoreMessage(server.getStorageManager().generateID(), 512);
}
public void commitTransaction(StompConnection connection, String txID) throws Exception {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/StompSession.java
----------------------------------------------------------------------
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 1e103e9..797a966 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
@@ -25,23 +25,24 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.zip.Inflater;
+import io.netty.buffer.UnpooledByteBufAllocator;
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.Pair;
+import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.api.core.SimpleString;
-import org.apache.activemq.artemis.core.message.BodyEncoder;
-import org.apache.activemq.artemis.core.message.impl.MessageImpl;
+import org.apache.activemq.artemis.core.buffers.impl.ChannelBufferWrapper;
+import org.apache.activemq.artemis.core.message.LargeBodyEncoder;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import org.apache.activemq.artemis.core.persistence.OperationContext;
import org.apache.activemq.artemis.core.persistence.StorageManager;
import org.apache.activemq.artemis.core.persistence.impl.journal.LargeServerMessageImpl;
import org.apache.activemq.artemis.core.remoting.impl.netty.TransportConstants;
-import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.core.server.LargeServerMessage;
import org.apache.activemq.artemis.core.server.MessageReference;
import org.apache.activemq.artemis.core.server.ServerConsumer;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.ServerSession;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
import org.apache.activemq.artemis.core.server.impl.ServerSessionImpl;
import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
import org.apache.activemq.artemis.spi.core.protocol.SessionCallback;
@@ -127,32 +128,35 @@ public class StompSession implements SessionCallback {
@Override
public int sendMessage(MessageReference ref,
- ServerMessage serverMessage,
+ Message serverMessage,
final ServerConsumer consumer,
int deliveryCount) {
+
+ ICoreMessage coreMessage = serverMessage.toCore();
+
LargeServerMessageImpl largeMessage = null;
- ServerMessage newServerMessage = serverMessage;
+ ICoreMessage newServerMessage = serverMessage.toCore();
try {
StompSubscription subscription = subscriptions.get(consumer.getID());
- StompFrame frame = null;
- if (serverMessage.isLargeMessage()) {
- newServerMessage = serverMessage.copy();
+ StompFrame frame;
+ ActiveMQBuffer buffer;
- largeMessage = (LargeServerMessageImpl) serverMessage;
- BodyEncoder encoder = largeMessage.getBodyEncoder();
+ if (coreMessage.isLargeMessage()) {
+ LargeBodyEncoder encoder = coreMessage.getBodyEncoder();
encoder.open();
int bodySize = (int) encoder.getLargeBodySize();
- //large message doesn't have a body.
- ((ServerMessageImpl) newServerMessage).createBody(bodySize);
- encoder.encode(newServerMessage.getBodyBuffer(), bodySize);
+ buffer = new ChannelBufferWrapper(UnpooledByteBufAllocator.DEFAULT.heapBuffer(bodySize));
+
+ encoder.encode(buffer, bodySize);
encoder.close();
+ } else {
+ buffer = coreMessage.getReadOnlyBodyBuffer();
}
if (serverMessage.getBooleanProperty(Message.HDR_LARGE_COMPRESSED)) {
- //decompress
- ActiveMQBuffer qbuff = newServerMessage.getBodyBuffer();
- int bytesToRead = qbuff.writerIndex() - MessageImpl.BODY_OFFSET;
+ ActiveMQBuffer qbuff = buffer;
+ int bytesToRead = qbuff.readerIndex();
Inflater inflater = new Inflater();
inflater.setInput(ByteUtil.getActiveArray(qbuff.readBytes(bytesToRead).toByteBuffer()));
@@ -165,9 +169,10 @@ public class StompSession implements SessionCallback {
qbuff.resetReaderIndex();
qbuff.resetWriterIndex();
qbuff.writeBytes(data);
+ buffer = qbuff;
}
- frame = connection.createStompMessage(newServerMessage, subscription, deliveryCount);
+ frame = connection.createStompMessage(newServerMessage, buffer, subscription, deliveryCount);
int length = frame.getEncodedSize();
@@ -219,7 +224,7 @@ public class StompSession implements SessionCallback {
@Override
public int sendLargeMessage(MessageReference ref,
- ServerMessage msg,
+ Message msg,
ServerConsumer consumer,
long bodySize,
int deliveryCount) {
@@ -370,11 +375,11 @@ public class StompSession implements SessionCallback {
this.noLocal = noLocal;
}
- public void sendInternal(ServerMessageImpl message, boolean direct) throws Exception {
+ public void sendInternal(Message message, boolean direct) throws Exception {
session.send(message, direct);
}
- public void sendInternalLarge(ServerMessageImpl message, boolean direct) throws Exception {
+ public void sendInternalLarge(CoreMessage message, boolean direct) throws Exception {
int headerSize = message.getHeadersAndPropertiesEncodeSize();
if (headerSize >= connection.getMinLargeMessageSize()) {
throw BUNDLE.headerTooBig();
@@ -384,7 +389,7 @@ public class StompSession implements SessionCallback {
long id = storageManager.generateID();
LargeServerMessage largeMessage = storageManager.createLargeMessage(id, message);
- byte[] bytes = new byte[message.getBodyBuffer().writerIndex() - MessageImpl.BODY_OFFSET];
+ byte[] bytes = new byte[message.getBodyBuffer().writerIndex() - CoreMessage.BODY_OFFSET];
message.getBodyBuffer().readBytes(bytes);
largeMessage.addBytes(bytes);
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/StompUtils.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/StompUtils.java b/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/StompUtils.java
index affab84..7db9d82 100644
--- a/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/StompUtils.java
+++ b/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/StompUtils.java
@@ -24,8 +24,6 @@ import java.util.Set;
import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.client.impl.ClientMessageImpl;
-import org.apache.activemq.artemis.core.message.impl.MessageInternal;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
import org.apache.activemq.artemis.reader.MessageUtil;
public class StompUtils {
@@ -37,7 +35,7 @@ public class StompUtils {
// Static --------------------------------------------------------
- public static void copyStandardHeadersFromFrameToMessage(StompFrame frame, ServerMessageImpl msg) throws Exception {
+ public static void copyStandardHeadersFromFrameToMessage(StompFrame frame, Message msg) throws Exception {
Map<String, String> headers = new HashMap<>(frame.getHeadersMap());
String priority = headers.remove(Stomp.Headers.Send.PRIORITY);
@@ -79,7 +77,7 @@ public class StompUtils {
}
}
- public static void copyStandardHeadersFromMessageToFrame(MessageInternal message,
+ public static void copyStandardHeadersFromMessageToFrame(Message message,
StompFrame command,
int deliveryCount) throws Exception {
command.addHeader(Stomp.Headers.Message.MESSAGE_ID, String.valueOf(message.getMessageID()));
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/VersionedStompFrameHandler.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/VersionedStompFrameHandler.java b/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/VersionedStompFrameHandler.java
index f91ba82..3f68c6f 100644
--- a/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/VersionedStompFrameHandler.java
+++ b/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/VersionedStompFrameHandler.java
@@ -20,17 +20,15 @@ import java.nio.charset.StandardCharsets;
import java.util.concurrent.ScheduledExecutorService;
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.RoutingType;
import org.apache.activemq.artemis.api.core.SimpleString;
-import org.apache.activemq.artemis.core.message.impl.MessageImpl;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import org.apache.activemq.artemis.core.protocol.stomp.Stomp.Headers;
import org.apache.activemq.artemis.core.protocol.stomp.v10.StompFrameHandlerV10;
import org.apache.activemq.artemis.core.protocol.stomp.v11.StompFrameHandlerV11;
import org.apache.activemq.artemis.core.protocol.stomp.v12.StompFrameHandlerV12;
-import org.apache.activemq.artemis.api.core.RoutingType;
-import org.apache.activemq.artemis.core.server.ServerMessage;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
-import org.apache.activemq.artemis.utils.DataConstants;
import org.apache.activemq.artemis.utils.ExecutorFactory;
import static org.apache.activemq.artemis.core.protocol.stomp.ActiveMQStompProtocolMessageBundle.BUNDLE;
@@ -180,7 +178,7 @@ public abstract class VersionedStompFrameHandler {
long timestamp = System.currentTimeMillis();
- ServerMessageImpl message = connection.createServerMessage();
+ CoreMessage message = connection.createServerMessage();
if (routingType != null) {
message.putByteProperty(Message.HDR_ROUTING_TYPE, routingType.getType());
}
@@ -289,7 +287,8 @@ public abstract class VersionedStompFrameHandler {
return response;
}
- public StompFrame createMessageFrame(ServerMessage serverMessage,
+ public StompFrame createMessageFrame(ICoreMessage serverMessage,
+ ActiveMQBuffer bodyBuffer,
StompSubscription subscription,
int deliveryCount) throws Exception {
StompFrame frame = createStompFrame(Stomp.Responses.MESSAGE);
@@ -298,13 +297,11 @@ public abstract class VersionedStompFrameHandler {
frame.addHeader(Stomp.Headers.Message.SUBSCRIPTION, subscription.getID());
}
- ActiveMQBuffer buffer = serverMessage.getBodyBufferDuplicate();
-
- int bodyPos = serverMessage.getEndOfBodyPosition() == -1 ? buffer.writerIndex() : serverMessage.getEndOfBodyPosition();
+ ActiveMQBuffer buffer = bodyBuffer != null ? bodyBuffer : serverMessage.getReadOnlyBodyBuffer();
- buffer.readerIndex(MessageImpl.BUFFER_HEADER_SPACE + DataConstants.SIZE_INT);
+ int bodyPos = (serverMessage).getEndOfBodyPosition() == -1 ? buffer.writerIndex() : (serverMessage).getEndOfBodyPosition();
- int size = bodyPos - buffer.readerIndex();
+ int size = buffer.writerIndex();
byte[] data = new byte[size];
@@ -321,7 +318,7 @@ public abstract class VersionedStompFrameHandler {
}
frame.setByteBody(data);
- StompUtils.copyStandardHeadersFromMessageToFrame(serverMessage, frame, deliveryCount);
+ StompUtils.copyStandardHeadersFromMessageToFrame((serverMessage), frame, deliveryCount);
return frame;
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/v12/StompFrameHandlerV12.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/v12/StompFrameHandlerV12.java b/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/v12/StompFrameHandlerV12.java
index 6b211d2..77a9225 100644
--- a/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/v12/StompFrameHandlerV12.java
+++ b/artemis-protocols/artemis-stomp-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/stomp/v12/StompFrameHandlerV12.java
@@ -18,6 +18,8 @@ package org.apache.activemq.artemis.core.protocol.stomp.v12;
import java.util.concurrent.ScheduledExecutorService;
+import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
+import org.apache.activemq.artemis.api.core.ICoreMessage;
import org.apache.activemq.artemis.core.protocol.stomp.ActiveMQStompException;
import org.apache.activemq.artemis.core.protocol.stomp.Stomp;
import org.apache.activemq.artemis.core.protocol.stomp.StompConnection;
@@ -27,7 +29,6 @@ import org.apache.activemq.artemis.core.protocol.stomp.StompSubscription;
import org.apache.activemq.artemis.core.protocol.stomp.v11.StompFrameHandlerV11;
import org.apache.activemq.artemis.core.protocol.stomp.v11.StompFrameV11;
import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.utils.ExecutorFactory;
import static org.apache.activemq.artemis.core.protocol.stomp.ActiveMQStompProtocolMessageBundle.BUNDLE;
@@ -48,10 +49,11 @@ public class StompFrameHandlerV12 extends StompFrameHandlerV11 {
}
@Override
- public StompFrame createMessageFrame(ServerMessage serverMessage,
+ public StompFrame createMessageFrame(ICoreMessage serverMessage,
+ ActiveMQBuffer bodyBuffer,
StompSubscription subscription,
int deliveryCount) throws Exception {
- StompFrame frame = super.createMessageFrame(serverMessage, subscription, deliveryCount);
+ StompFrame frame = super.createMessageFrame(serverMessage, bodyBuffer, subscription, deliveryCount);
if (!subscription.getAck().equals(Stomp.Headers.Subscribe.AckModeValues.AUTO)) {
frame.addHeader(Stomp.Headers.Message.ACK, String.valueOf(serverMessage.getMessageID()));
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/Configuration.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/Configuration.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/Configuration.java
index 7881470..30d6668 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/Configuration.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/Configuration.java
@@ -750,10 +750,6 @@ public interface Configuration {
Configuration setLogJournalWriteRate(boolean rate);
- int getJournalPerfBlastPages();
-
- Configuration setJournalPerfBlastPages(int pages);
-
long getServerDumpInterval();
Configuration setServerDumpInterval(long interval);
@@ -766,10 +762,6 @@ public interface Configuration {
Configuration setMemoryMeasureInterval(long memoryMeasureInterval);
- boolean isRunSyncSpeedTest();
-
- Configuration setRunSyncSpeedTest(boolean run);
-
// Paging Properties --------------------------------------------------------------------
/**
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java
index f4eda91..329f654 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImpl.java
@@ -193,10 +193,6 @@ public class ConfigurationImpl implements Configuration, Serializable {
protected boolean logJournalWriteRate = ActiveMQDefaultConfiguration.isDefaultJournalLogWriteRate();
- protected int journalPerfBlastPages = ActiveMQDefaultConfiguration.getDefaultJournalPerfBlastPages();
-
- protected boolean runSyncSpeedTest = ActiveMQDefaultConfiguration.isDefaultRunSyncSpeedTest();
-
private WildcardConfiguration wildcardConfiguration = new WildcardConfiguration();
private boolean messageCounterEnabled = ActiveMQDefaultConfiguration.isDefaultMessageCounterEnabled();
@@ -854,28 +850,6 @@ public class ConfigurationImpl implements Configuration, Serializable {
}
@Override
- public int getJournalPerfBlastPages() {
- return journalPerfBlastPages;
- }
-
- @Override
- public ConfigurationImpl setJournalPerfBlastPages(final int journalPerfBlastPages) {
- this.journalPerfBlastPages = journalPerfBlastPages;
- return this;
- }
-
- @Override
- public boolean isRunSyncSpeedTest() {
- return runSyncSpeedTest;
- }
-
- @Override
- public ConfigurationImpl setRunSyncSpeedTest(final boolean run) {
- runSyncSpeedTest = run;
- return this;
- }
-
- @Override
public boolean isCreateBindingsDir() {
return createBindingsDir;
}
@@ -1556,7 +1530,6 @@ public class ConfigurationImpl implements Configuration, Serializable {
result = prime * result + journalMaxIO_AIO;
result = prime * result + journalMaxIO_NIO;
result = prime * result + journalMinFiles;
- result = prime * result + journalPerfBlastPages;
result = prime * result + (journalSyncNonTransactional ? 1231 : 1237);
result = prime * result + (journalSyncTransactional ? 1231 : 1237);
result = prime * result + ((journalType == null) ? 0 : journalType.hashCode());
@@ -1580,7 +1553,6 @@ public class ConfigurationImpl implements Configuration, Serializable {
result = prime * result + (persistIDCache ? 1231 : 1237);
result = prime * result + (persistenceEnabled ? 1231 : 1237);
result = prime * result + ((queueConfigurations == null) ? 0 : queueConfigurations.hashCode());
- result = prime * result + (runSyncSpeedTest ? 1231 : 1237);
result = prime * result + scheduledThreadPoolMaxSize;
result = prime * result + (securityEnabled ? 1231 : 1237);
result = prime * result + (populateValidatedUser ? 1231 : 1237);
@@ -1723,8 +1695,6 @@ public class ConfigurationImpl implements Configuration, Serializable {
return false;
if (journalMinFiles != other.journalMinFiles)
return false;
- if (journalPerfBlastPages != other.journalPerfBlastPages)
- return false;
if (journalSyncNonTransactional != other.journalSyncNonTransactional)
return false;
if (journalSyncTransactional != other.journalSyncTransactional)
@@ -1793,8 +1763,6 @@ public class ConfigurationImpl implements Configuration, Serializable {
return false;
} else if (!queueConfigurations.equals(other.queueConfigurations))
return false;
- if (runSyncSpeedTest != other.runSyncSpeedTest)
- return false;
if (scheduledThreadPoolMaxSize != other.scheduledThreadPoolMaxSize)
return false;
if (securityEnabled != other.securityEnabled)
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
index cea0598..4055b5c 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/deployers/impl/FileConfigurationParser.java
@@ -548,10 +548,6 @@ public final class FileConfigurationParser extends XMLConfigurationUtil {
config.setLogJournalWriteRate(getBoolean(e, "log-journal-write-rate", ActiveMQDefaultConfiguration.isDefaultJournalLogWriteRate()));
- config.setJournalPerfBlastPages(getInteger(e, "perf-blast-pages", ActiveMQDefaultConfiguration.getDefaultJournalPerfBlastPages(), Validators.MINUS_ONE_OR_GT_ZERO));
-
- config.setRunSyncSpeedTest(getBoolean(e, "run-sync-speed-test", config.isRunSyncSpeedTest()));
-
if (e.hasAttribute("wild-card-routing-enabled")) {
config.setWildcardRoutingEnabled(getBoolean(e, "wild-card-routing-enabled", config.isWildcardRoutingEnabled()));
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/filter/Filter.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/filter/Filter.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/filter/Filter.java
index 41d5e54..3737e19 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/filter/Filter.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/filter/Filter.java
@@ -16,8 +16,8 @@
*/
package org.apache.activemq.artemis.core.filter;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
-import org.apache.activemq.artemis.core.server.ServerMessage;
public interface Filter {
@@ -31,7 +31,7 @@ public interface Filter {
*/
String GENERIC_IGNORED_FILTER = "__AMQX=-1";
- boolean match(ServerMessage message);
+ boolean match(Message message);
SimpleString getFilterString();
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/filter/impl/FilterImpl.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/filter/impl/FilterImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/filter/impl/FilterImpl.java
index 0a459c9..33a1187 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/filter/impl/FilterImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/filter/impl/FilterImpl.java
@@ -18,11 +18,11 @@ package org.apache.activemq.artemis.core.filter.impl;
import org.apache.activemq.artemis.api.core.ActiveMQException;
import org.apache.activemq.artemis.api.core.FilterConstants;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.filter.Filter;
import org.apache.activemq.artemis.core.server.ActiveMQMessageBundle;
import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.selector.filter.BooleanExpression;
import org.apache.activemq.artemis.selector.filter.FilterException;
import org.apache.activemq.artemis.selector.filter.Filterable;
@@ -103,7 +103,7 @@ public class FilterImpl implements Filter {
}
@Override
- public synchronized boolean match(final ServerMessage message) {
+ public synchronized boolean match(final Message message) {
try {
boolean result = booleanExpression.matches(new FilterableServerMessage(message));
return result;
@@ -148,7 +148,7 @@ public class FilterImpl implements Filter {
// Private --------------------------------------------------------------------------
- private static Object getHeaderFieldValue(final ServerMessage msg, final SimpleString fieldName) {
+ private static Object getHeaderFieldValue(final Message msg, final SimpleString fieldName) {
if (FilterConstants.ACTIVEMQ_USERID.equals(fieldName)) {
if (msg.getUserID() == null) {
// Proton stores JMSMessageID as NATIVE_MESSAGE_ID that is an arbitrary string
@@ -158,7 +158,12 @@ public class FilterImpl implements Filter {
}
}
// It's the stringified (hex) representation of a user id that can be used in a selector expression
- return new SimpleString("ID:" + msg.getUserID());
+ String userID = msg.getUserID().toString();
+ if (userID.startsWith("ID:")) {
+ return SimpleString.toSimpleString(userID);
+ } else {
+ return new SimpleString("ID:" + msg.getUserID());
+ }
} else if (FilterConstants.ACTIVEMQ_PRIORITY.equals(fieldName)) {
return Integer.valueOf(msg.getPriority());
} else if (FilterConstants.ACTIVEMQ_TIMESTAMP.equals(fieldName)) {
@@ -178,9 +183,9 @@ public class FilterImpl implements Filter {
private static class FilterableServerMessage implements Filterable {
- private final ServerMessage message;
+ private final Message message;
- private FilterableServerMessage(ServerMessage message) {
+ private FilterableServerMessage(Message message) {
this.message = message;
}
@@ -191,7 +196,7 @@ public class FilterImpl implements Filter {
result = getHeaderFieldValue(message, new SimpleString(id));
}
if (result == null) {
- result = message.getObjectProperty(new SimpleString(id));
+ result = message.getObjectProperty(id);
}
if (result != null) {
if (result.getClass() == SimpleString.class) {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/AddressControlImpl.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/AddressControlImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/AddressControlImpl.java
index 09dd702..31e056c 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/AddressControlImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/AddressControlImpl.java
@@ -25,10 +25,12 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
+import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.api.core.management.AddressControl;
import org.apache.activemq.artemis.api.core.management.QueueControl;
import org.apache.activemq.artemis.api.core.management.ResourceNames;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import org.apache.activemq.artemis.core.paging.PagingManager;
import org.apache.activemq.artemis.core.paging.PagingStore;
import org.apache.activemq.artemis.core.persistence.StorageManager;
@@ -40,9 +42,7 @@ import org.apache.activemq.artemis.core.security.CheckType;
import org.apache.activemq.artemis.core.security.Role;
import org.apache.activemq.artemis.core.security.SecurityAuth;
import org.apache.activemq.artemis.core.security.SecurityStore;
-import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.core.server.impl.AddressInfo;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
import org.apache.activemq.artemis.core.server.management.ManagementService;
import org.apache.activemq.artemis.core.settings.HierarchicalRepository;
import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
@@ -282,7 +282,7 @@ public class AddressControlImpl extends AbstractControl implements AddressContro
return null;
}
});
- ServerMessageImpl message = new ServerMessageImpl(storageManager.generateID(), 50);
+ CoreMessage message = new CoreMessage(storageManager.generateID(), 50);
for (String header : headers.keySet()) {
message.putStringProperty(new SimpleString(header), new SimpleString(headers.get(header)));
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/QueueControlImpl.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/QueueControlImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/QueueControlImpl.java
index 4b84909..5ecea64 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/QueueControlImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/QueueControlImpl.java
@@ -39,7 +39,7 @@ import org.apache.activemq.artemis.api.core.management.QueueControl;
import org.apache.activemq.artemis.core.filter.Filter;
import org.apache.activemq.artemis.core.filter.impl.FilterImpl;
import org.apache.activemq.artemis.core.management.impl.openmbean.OpenTypeSupport;
-import org.apache.activemq.artemis.core.message.impl.MessageImpl;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import org.apache.activemq.artemis.core.messagecounter.MessageCounter;
import org.apache.activemq.artemis.core.messagecounter.impl.MessageCounterHelper;
import org.apache.activemq.artemis.core.persistence.StorageManager;
@@ -53,8 +53,6 @@ import org.apache.activemq.artemis.core.server.Consumer;
import org.apache.activemq.artemis.core.server.MessageReference;
import org.apache.activemq.artemis.core.server.Queue;
import org.apache.activemq.artemis.core.server.ServerConsumer;
-import org.apache.activemq.artemis.core.server.ServerMessage;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
import org.apache.activemq.artemis.core.settings.HierarchicalRepository;
import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
@@ -609,7 +607,7 @@ public class QueueControlImpl extends AbstractControl implements QueueControl {
try {
Filter singleMessageFilter = new Filter() {
@Override
- public boolean match(ServerMessage message) {
+ public boolean match(Message message) {
return message.getMessageID() == messageID;
}
@@ -738,7 +736,7 @@ public class QueueControlImpl extends AbstractControl implements QueueControl {
return null;
}
});
- ServerMessageImpl message = new ServerMessageImpl(storageManager.generateID(), 50);
+ CoreMessage message = new CoreMessage(storageManager.generateID(), 50);
for (String header : headers.keySet()) {
message.putStringProperty(new SimpleString(header), new SimpleString(headers.get(header)));
}
@@ -755,7 +753,7 @@ public class QueueControlImpl extends AbstractControl implements QueueControl {
message.setAddress(queue.getAddress());
ByteBuffer buffer = ByteBuffer.allocate(8);
buffer.putLong(queue.getID());
- message.putBytesProperty(MessageImpl.HDR_ROUTE_TO_IDS, buffer.array());
+ message.putBytesProperty(Message.HDR_ROUTE_TO_IDS, buffer.array());
postOffice.route(message, true);
return "" + message.getMessageID();
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/openmbean/OpenTypeSupport.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/openmbean/OpenTypeSupport.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/openmbean/OpenTypeSupport.java
index ec6848b..098c61c 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/openmbean/OpenTypeSupport.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/management/impl/openmbean/OpenTypeSupport.java
@@ -32,10 +32,10 @@ import java.util.List;
import java.util.Map;
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.server.MessageReference;
-import org.apache.activemq.artemis.core.server.ServerMessage;
public final class OpenTypeSupport {
@@ -48,8 +48,10 @@ public final class OpenTypeSupport {
public static CompositeData convert(MessageReference ref) throws OpenDataException {
CompositeType ct;
+ ICoreMessage message = ref.getMessage().toCore();
+
Map<String, Object> fields;
- byte type = ref.getMessage().getType();
+ byte type = message.getType();
switch(type) {
case Message.TEXT_TYPE:
@@ -128,7 +130,7 @@ public final class OpenTypeSupport {
public Map<String, Object> getFields(MessageReference ref) throws OpenDataException {
Map<String, Object> rc = new HashMap<>();
- Message m = ref.getMessage();
+ ICoreMessage m = ref.getMessage().toCore();
rc.put(CompositeDataConstants.MESSAGE_ID, "" + m.getMessageID());
if (m.getUserID() != null) {
rc.put(CompositeDataConstants.USER_ID, "ID:" + m.getUserID().toString());
@@ -143,6 +145,11 @@ public final class OpenTypeSupport {
rc.put(CompositeDataConstants.PRIORITY, m.getPriority());
rc.put(CompositeDataConstants.REDELIVERED, ref.getDeliveryCount() > 1);
+ ActiveMQBuffer bodyCopy = m.getReadOnlyBodyBuffer();
+ byte[] bytes = new byte[bodyCopy.readableBytes()];
+ bodyCopy.readBytes(bytes);
+ rc.put(CompositeDataConstants.BODY, bytes);
+
Map<String, Object> propertyMap = m.toPropertyMap();
rc.put(CompositeDataConstants.PROPERTIES, "" + propertyMap);
@@ -264,8 +271,8 @@ public final class OpenTypeSupport {
@Override
public Map<String, Object> getFields(MessageReference ref) throws OpenDataException {
Map<String, Object> rc = super.getFields(ref);
- ServerMessage m = ref.getMessage();
- ActiveMQBuffer bodyCopy = m.getBodyBufferDuplicate();
+ ICoreMessage m = ref.getMessage().toCore();
+ ActiveMQBuffer bodyCopy = m.getReadOnlyBodyBuffer();
byte[] bytes = new byte[bodyCopy.readableBytes()];
bodyCopy.readBytes(bytes);
rc.put(CompositeDataConstants.BODY, bytes);
@@ -285,8 +292,8 @@ public final class OpenTypeSupport {
@Override
public Map<String, Object> getFields(MessageReference ref) throws OpenDataException {
Map<String, Object> rc = super.getFields(ref);
- ServerMessage m = ref.getMessage();
- SimpleString text = m.getBodyBuffer().copy().readNullableSimpleString();
+ ICoreMessage m = ref.getMessage().toCore();
+ SimpleString text = m.getReadOnlyBodyBuffer().readNullableSimpleString();
rc.put(CompositeDataConstants.TEXT_BODY, text != null ? text.toString() : "");
return rc;
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/PagedMessage.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/PagedMessage.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/PagedMessage.java
index 9b1e243..0124f09 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/PagedMessage.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/PagedMessage.java
@@ -16,9 +16,9 @@
*/
package org.apache.activemq.artemis.core.paging;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.core.journal.EncodingSupport;
import org.apache.activemq.artemis.core.persistence.StorageManager;
-import org.apache.activemq.artemis.core.server.ServerMessage;
/**
* A Paged message.
@@ -28,7 +28,7 @@ import org.apache.activemq.artemis.core.server.ServerMessage;
*/
public interface PagedMessage extends EncodingSupport {
- ServerMessage getMessage();
+ Message getMessage();
/**
* The queues that were routed during paging
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/PagingStore.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/PagingStore.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/PagingStore.java
index 5ead1a2..2d4c646 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/PagingStore.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/PagingStore.java
@@ -20,13 +20,14 @@ import java.io.File;
import java.util.Collection;
import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
+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.paging.cursor.PageCursorProvider;
import org.apache.activemq.artemis.core.paging.impl.Page;
import org.apache.activemq.artemis.core.replication.ReplicationManager;
import org.apache.activemq.artemis.core.server.ActiveMQComponent;
import org.apache.activemq.artemis.core.server.RouteContextList;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.settings.impl.AddressFullMessagePolicy;
import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
import org.apache.activemq.artemis.core.transaction.Transaction;
@@ -41,7 +42,7 @@ import org.apache.activemq.artemis.core.transaction.Transaction;
*
* @see PagingManager
*/
-public interface PagingStore extends ActiveMQComponent {
+public interface PagingStore extends ActiveMQComponent, RefCountMessageListener {
SimpleString getAddress();
@@ -90,7 +91,7 @@ public interface PagingStore extends ActiveMQComponent {
* needs to be sent to the journal
* @throws NullPointerException if {@code readLock} is null
*/
- boolean page(ServerMessage message, Transaction tx, RouteContextList listCtx, ReadLock readLock) throws Exception;
+ boolean page(Message message, Transaction tx, RouteContextList listCtx, ReadLock readLock) throws Exception;
Page createPage(final int page) throws Exception;
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/cursor/PagedReferenceImpl.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/cursor/PagedReferenceImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/cursor/PagedReferenceImpl.java
index 768b43f..823eef4 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/cursor/PagedReferenceImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/cursor/PagedReferenceImpl.java
@@ -20,11 +20,11 @@ import java.lang.ref.WeakReference;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.activemq.artemis.api.core.Message;
+
import org.apache.activemq.artemis.core.paging.PagedMessage;
import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
import org.apache.activemq.artemis.core.server.MessageReference;
import org.apache.activemq.artemis.core.server.Queue;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.impl.AckReason;
import org.apache.activemq.artemis.core.transaction.Transaction;
import org.jboss.logging.Logger;
@@ -41,7 +41,7 @@ public class PagedReferenceImpl implements PagedReference {
private int persistedCount;
- private int messageEstimate;
+ private int messageEstimate = -1;
private Long consumerId;
@@ -64,7 +64,7 @@ public class PagedReferenceImpl implements PagedReference {
}
@Override
- public ServerMessage getMessage() {
+ public Message getMessage() {
return getPagedMessage().getMessage();
}
@@ -93,12 +93,6 @@ public class PagedReferenceImpl implements PagedReference {
final PagedMessage message,
final PageSubscription subscription) {
this.position = position;
-
- if (message == null) {
- this.messageEstimate = -1;
- } else {
- this.messageEstimate = message.getMessage().getMemoryEstimate();
- }
this.message = new WeakReference<>(message);
this.subscription = subscription;
}
@@ -120,7 +114,7 @@ public class PagedReferenceImpl implements PagedReference {
@Override
public int getMessageMemoryEstimate() {
- if (messageEstimate < 0) {
+ if (messageEstimate <= 0) {
try {
messageEstimate = getMessage().getMemoryEstimate();
} catch (Throwable e) {
@@ -139,7 +133,7 @@ public class PagedReferenceImpl implements PagedReference {
public long getScheduledDeliveryTime() {
if (deliveryTime == null) {
try {
- ServerMessage msg = getMessage();
+ Message msg = getMessage();
if (msg.containsProperty(Message.HDR_SCHEDULED_DELIVERY_TIME)) {
deliveryTime = getMessage().getLongProperty(Message.HDR_SCHEDULED_DELIVERY_TIME);
} else {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/cursor/impl/PageSubscriptionImpl.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/cursor/impl/PageSubscriptionImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/cursor/impl/PageSubscriptionImpl.java
index c40d20d..ab10eb4 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/cursor/impl/PageSubscriptionImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/cursor/impl/PageSubscriptionImpl.java
@@ -33,6 +33,7 @@ import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import org.apache.activemq.artemis.api.core.ActiveMQException;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.core.filter.Filter;
import org.apache.activemq.artemis.core.io.IOCallback;
import org.apache.activemq.artemis.core.paging.PageTransactionInfo;
@@ -50,7 +51,6 @@ import org.apache.activemq.artemis.core.persistence.StorageManager;
import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
import org.apache.activemq.artemis.core.server.MessageReference;
import org.apache.activemq.artemis.core.server.Queue;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.transaction.Transaction;
import org.apache.activemq.artemis.core.transaction.TransactionOperationAbstract;
import org.apache.activemq.artemis.core.transaction.TransactionPropertyIndexes;
@@ -772,7 +772,7 @@ final class PageSubscriptionImpl implements PageSubscription {
// Protected -----------------------------------------------------
- private boolean match(final ServerMessage message) {
+ private boolean match(final Message message) {
if (filter == null) {
return true;
} else {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/impl/Page.java
----------------------------------------------------------------------
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 4993d0c..7d21316 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,6 +24,7 @@ import java.util.concurrent.atomic.AtomicInteger;
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.SimpleString;
import org.apache.activemq.artemis.core.io.SequentialFile;
import org.apache.activemq.artemis.core.io.SequentialFileFactory;
@@ -132,7 +133,7 @@ public final class Page implements Comparable<Page> {
int messageSize = fileBuffer.readInt();
int oldPos = fileBuffer.readerIndex();
if (fileBuffer.readerIndex() + messageSize < fileBuffer.capacity() && fileBuffer.getByte(oldPos + messageSize) == Page.END_BYTE) {
- PagedMessage msg = new PagedMessageImpl();
+ PagedMessage msg = new PagedMessageImpl(storageManager);
msg.decode(fileBuffer);
byte b = fileBuffer.readByte();
if (b != Page.END_BYTE) {
@@ -255,7 +256,7 @@ public final class Page implements Comparable<Page> {
if (messages != null) {
for (PagedMessage msg : messages) {
- if (msg.getMessage().isLargeMessage()) {
+ if (msg.getMessage() instanceof ICoreMessage && (msg.getMessage()).isLargeMessage()) {
LargeServerMessage lmsg = (LargeServerMessage) msg.getMessage();
// Remember, cannot call delete directly here
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/impl/PagedMessageImpl.java
----------------------------------------------------------------------
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 e40d107..7d43a2e 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
@@ -19,12 +19,13 @@ package org.apache.activemq.artemis.core.paging.impl;
import java.util.Arrays;
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.core.paging.PagedMessage;
import org.apache.activemq.artemis.core.persistence.StorageManager;
+import org.apache.activemq.artemis.core.persistence.impl.journal.codec.LargeMessagePersister;
import org.apache.activemq.artemis.core.server.LargeServerMessage;
-import org.apache.activemq.artemis.core.server.ServerMessage;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
+import org.apache.activemq.artemis.spi.core.protocol.MessagePersister;
import org.apache.activemq.artemis.utils.DataConstants;
/**
@@ -38,39 +39,37 @@ public class PagedMessageImpl implements PagedMessage {
*/
private byte[] largeMessageLazyData;
- private ServerMessage message;
+ private Message message;
private long[] queueIDs;
private long transactionID = 0;
- public PagedMessageImpl(final ServerMessage message, final long[] queueIDs, final long transactionID) {
+ private volatile StorageManager storageManager;
+
+ public PagedMessageImpl(final Message message, final long[] queueIDs, final long transactionID) {
this(message, queueIDs);
this.transactionID = transactionID;
}
- public PagedMessageImpl(final ServerMessage message, final long[] queueIDs) {
+ public PagedMessageImpl(final Message message, final long[] queueIDs) {
this.queueIDs = queueIDs;
this.message = message;
}
- public PagedMessageImpl() {
+ public PagedMessageImpl(StorageManager storageManager) {
+ this.storageManager = storageManager;
}
@Override
- public ServerMessage getMessage() {
+ public Message getMessage() {
return message;
}
@Override
public void initMessage(StorageManager storage) {
if (largeMessageLazyData != null) {
- LargeServerMessage lgMessage = storage.createLargeMessage();
- ActiveMQBuffer buffer = ActiveMQBuffers.dynamicBuffer(largeMessageLazyData);
- lgMessage.decodeHeadersAndProperties(buffer);
- lgMessage.incrementDelayDeletionCount();
- lgMessage.setPaged();
- message = lgMessage;
+ // TODO-now: use the largeMessagePersister
largeMessageLazyData = null;
}
}
@@ -96,15 +95,15 @@ public class PagedMessageImpl implements PagedMessage {
if (isLargeMessage) {
int largeMessageHeaderSize = buffer.readInt();
- largeMessageLazyData = new byte[largeMessageHeaderSize];
-
- buffer.readBytes(largeMessageLazyData);
+ if (storageManager == null) {
+ largeMessageLazyData = new byte[largeMessageHeaderSize];
+ buffer.readBytes(largeMessageLazyData);
+ } else {
+ this.message = storageManager.createLargeMessage();
+ LargeMessagePersister.getInstance().decode(buffer, (LargeServerMessage) message);
+ }
} else {
- buffer.readInt(); // This value is only used on LargeMessages for now
-
- message = new ServerMessageImpl(-1, 50);
-
- message.decode(buffer);
+ this.message = MessagePersister.getInstance().decode(buffer, null);
}
int queueIDsSize = buffer.readInt();
@@ -120,11 +119,16 @@ public class PagedMessageImpl implements PagedMessage {
public void encode(final ActiveMQBuffer buffer) {
buffer.writeLong(transactionID);
- buffer.writeBoolean(message instanceof LargeServerMessage);
+ boolean isLargeMessage = isLargeMessage();
- buffer.writeInt(message.getEncodeSize());
+ buffer.writeBoolean(isLargeMessage);
- message.encode(buffer);
+ if (isLargeMessage) {
+ buffer.writeInt(LargeMessagePersister.getInstance().getEncodeSize((LargeServerMessage)message));
+ LargeMessagePersister.getInstance().encode(buffer, (LargeServerMessage) message);
+ } else {
+ message.getPersister().encode(buffer, message);
+ }
buffer.writeInt(queueIDs.length);
@@ -133,10 +137,19 @@ public class PagedMessageImpl implements PagedMessage {
}
}
+ public boolean isLargeMessage() {
+ return message instanceof ICoreMessage && ((ICoreMessage)message).isLargeMessage();
+ }
+
@Override
public int getEncodeSize() {
- return DataConstants.SIZE_LONG + DataConstants.SIZE_BYTE + DataConstants.SIZE_INT + message.getEncodeSize() +
- DataConstants.SIZE_INT + queueIDs.length * DataConstants.SIZE_LONG;
+ if (isLargeMessage()) {
+ return DataConstants.SIZE_LONG + DataConstants.SIZE_BYTE + DataConstants.SIZE_INT + LargeMessagePersister.getInstance().getEncodeSize((LargeServerMessage)message) +
+ DataConstants.SIZE_INT + queueIDs.length * DataConstants.SIZE_LONG;
+ } else {
+ return DataConstants.SIZE_LONG + DataConstants.SIZE_BYTE + message.getPersister().getEncodeSize(message) +
+ DataConstants.SIZE_INT + queueIDs.length * DataConstants.SIZE_LONG;
+ }
}
@Override
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/paging/impl/PagingStoreImpl.java
----------------------------------------------------------------------
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 4e57c85..c300bd1 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
@@ -36,6 +36,7 @@ import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock.ReadLock;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.io.SequentialFile;
import org.apache.activemq.artemis.core.io.SequentialFileFactory;
@@ -54,7 +55,7 @@ import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
import org.apache.activemq.artemis.core.server.LargeServerMessage;
import org.apache.activemq.artemis.core.server.MessageReference;
import org.apache.activemq.artemis.core.server.RouteContextList;
-import org.apache.activemq.artemis.core.server.ServerMessage;
+import org.apache.activemq.artemis.core.server.impl.MessageReferenceImpl;
import org.apache.activemq.artemis.core.settings.impl.AddressFullMessagePolicy;
import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
import org.apache.activemq.artemis.core.transaction.Transaction;
@@ -699,7 +700,6 @@ public class PagingStoreImpl implements PagingStore {
@Override
public void addSize(final int size) {
-
boolean globalFull = pagingManager.addSize(size).isGlobalFull();
long newSize = sizeInBytes.addAndGet(size);
@@ -747,7 +747,7 @@ public class PagingStoreImpl implements PagingStore {
}
@Override
- public boolean page(ServerMessage message,
+ public boolean page(Message message,
final Transaction tx,
RouteContextList listCtx,
final ReadLock managerLock) throws Exception {
@@ -806,11 +806,12 @@ public class PagingStoreImpl implements PagingStore {
return false;
}
- if (!message.isDurable()) {
- // The address should never be transient when paging (even for non-persistent messages when paging)
- // This will force everything to be persisted
- message.forceAddress(address);
- }
+ message.setAddress(address);
+// if (!message.isDurable()) {
+// // The address should never be transient when paging (even for non-persistent messages when paging)
+// // This will force everything to be persisted
+// message.forceAddress(address);
+// }
final long transactionID = tx == null ? -1 : tx.getID();
PagedMessage pagedMessage = new PagedMessageImpl(message, routeQueues(tx, listCtx), transactionID);
@@ -920,6 +921,40 @@ public class PagingStoreImpl implements PagingStore {
}
+ @Override
+ public void durableDown(Message message, int durableCount) {
+ }
+
+ @Override
+ public void durableUp(Message message, int durableCount) {
+ }
+
+ @Override
+ public void nonDurableUp(Message message, int count) {
+ if (count == 1) {
+ this.addSize(message.getMemoryEstimate() + MessageReferenceImpl.getMemoryEstimate());
+ } else {
+ this.addSize(MessageReferenceImpl.getMemoryEstimate());
+ }
+ }
+
+ @Override
+ public void nonDurableDown(Message message, int count) {
+ if (count < 0) {
+ // this could happen on paged messages since they are not routed and incrementRefCount is never called
+ return;
+ }
+
+ if (count == 0) {
+ this.addSize(-message.getMemoryEstimate() - MessageReferenceImpl.getMemoryEstimate());
+
+ } else {
+ this.addSize(-MessageReferenceImpl.getMemoryEstimate());
+ }
+
+
+ }
+
private void installPageTransaction(final Transaction tx, final RouteContextList listCtx) throws Exception {
FinishPageMessageOperation pgOper = (FinishPageMessageOperation) tx.getProperty(TransactionPropertyIndexes.PAGE_TRANSACTION);
if (pgOper == null) {
[05/17] activemq-artemis git commit: ARTEMIS-1009 Pure Message
Encoding.
Posted by cl...@apache.org.
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/PostOfficeImpl.java
----------------------------------------------------------------------
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 2f6ae3d..464859f 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
@@ -22,7 +22,6 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
-import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -38,6 +37,7 @@ import org.apache.activemq.artemis.api.core.ActiveMQDuplicateIdException;
import org.apache.activemq.artemis.api.core.ActiveMQNonExistentQueueException;
import org.apache.activemq.artemis.api.core.Message;
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.api.core.management.CoreNotificationType;
import org.apache.activemq.artemis.api.core.management.ManagementHelper;
@@ -45,7 +45,7 @@ import org.apache.activemq.artemis.api.core.management.NotificationType;
import org.apache.activemq.artemis.core.config.WildcardConfiguration;
import org.apache.activemq.artemis.core.filter.Filter;
import org.apache.activemq.artemis.core.io.IOCallback;
-import org.apache.activemq.artemis.core.message.impl.MessageImpl;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import org.apache.activemq.artemis.core.paging.PagingManager;
import org.apache.activemq.artemis.core.paging.PagingStore;
import org.apache.activemq.artemis.core.persistence.StorageManager;
@@ -69,12 +69,9 @@ import org.apache.activemq.artemis.core.server.Queue;
import org.apache.activemq.artemis.core.server.QueueFactory;
import org.apache.activemq.artemis.core.server.RouteContextList;
import org.apache.activemq.artemis.core.server.RoutingContext;
-import org.apache.activemq.artemis.api.core.RoutingType;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.group.GroupingHandler;
import org.apache.activemq.artemis.core.server.impl.AddressInfo;
import org.apache.activemq.artemis.core.server.impl.RoutingContextImpl;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
import org.apache.activemq.artemis.core.server.management.ManagementService;
import org.apache.activemq.artemis.core.server.management.Notification;
import org.apache.activemq.artemis.core.server.management.NotificationListener;
@@ -665,20 +662,20 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
}
@Override
- public RoutingStatus route(final ServerMessage message,
+ public RoutingStatus route(final Message message,
final boolean direct) throws Exception {
return route(message, (Transaction) null, direct);
}
@Override
- public RoutingStatus route(final ServerMessage message,
+ public RoutingStatus route(final Message message,
final Transaction tx,
final boolean direct) throws Exception {
return route(message, new RoutingContextImpl(tx), direct);
}
@Override
- public RoutingStatus route(final ServerMessage message,
+ public RoutingStatus route(final Message message,
final Transaction tx,
final boolean direct,
final boolean rejectDuplicates) throws Exception {
@@ -686,14 +683,14 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
}
@Override
- public RoutingStatus route(final ServerMessage message,
+ public RoutingStatus route(final Message message,
final RoutingContext context,
final boolean direct) throws Exception {
return route(message, context, direct, true);
}
@Override
- public RoutingStatus route(final ServerMessage message,
+ public RoutingStatus route(final Message message,
final RoutingContext context,
final boolean direct,
boolean rejectDuplicates) throws Exception {
@@ -708,7 +705,7 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
AtomicBoolean startedTX = new AtomicBoolean(false);
- final SimpleString address = message.getAddress();
+ final SimpleString address = message.getAddressSimpleString();
applyExpiryDelay(message, address);
@@ -716,13 +713,9 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
return RoutingStatus.DUPLICATED_ID;
}
- if (message.hasInternalProperties()) {
- // We need to perform some cleanup on internal properties,
- // but we don't do it every time, otherwise it wouldn't be optimal
- cleanupInternalPropertiesBeforeRouting(message);
- }
+ message.cleanupInternalProperties();
- Bindings bindings = addressManager.getBindingsForRoutingAddress(context.getAddress() == null ? message.getAddress() : context.getAddress());
+ Bindings bindings = addressManager.getBindingsForRoutingAddress(context.getAddress() == null ? message.getAddressSimpleString() : context.getAddress());
// TODO auto-create queues here?
// first check for the auto-queue creation thing
@@ -768,7 +761,7 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
result = RoutingStatus.NO_BINDINGS;
ActiveMQServerLogger.LOGGER.noDLA(address);
} else {
- message.setOriginalHeaders(message, null, false);
+ message.referenceOriginalMessage(message, null);
message.setAddress(dlaAddress);
@@ -806,7 +799,7 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
}
// HORNETQ-1029
- private void applyExpiryDelay(ServerMessage message, SimpleString address) {
+ private void applyExpiryDelay(Message message, SimpleString address) {
long expirationOverride = addressSettingsRepository.getMatch(address.toString()).getExpiryDelay();
// A -1 <expiry-delay> means don't do anything
@@ -819,12 +812,13 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
}
@Override
- public MessageReference reroute(final ServerMessage message,
+ public MessageReference reroute(final Message message,
final Queue queue,
final Transaction tx) throws Exception {
+
setPagingStore(message);
- MessageReference reference = message.createReference(queue);
+ MessageReference reference = MessageReference.Factory.createReference(message, queue);
if (message.containsProperty(Message.HDR_SCHEDULED_DELIVERY_TIME)) {
Long scheduledDeliveryTime = message.getLongProperty(Message.HDR_SCHEDULED_DELIVERY_TIME);
@@ -852,15 +846,15 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
* The redistribution can't process the route right away as we may be dealing with a large message which will need to be processed on a different thread
*/
@Override
- public Pair<RoutingContext, ServerMessage> redistribute(final ServerMessage message,
+ public Pair<RoutingContext, Message> redistribute(final Message message,
final Queue originatingQueue,
final Transaction tx) throws Exception {
// We have to copy the message and store it separately, otherwise we may lose remote bindings in case of restart before the message
// arrived the target node
// as described on https://issues.jboss.org/browse/JBPAPP-6130
- ServerMessage copyRedistribute = message.copy(storageManager.generateID());
+ Message copyRedistribute = message.copy(storageManager.generateID());
- Bindings bindings = addressManager.getBindingsForRoutingAddress(message.getAddress());
+ Bindings bindings = addressManager.getBindingsForRoutingAddress(message.getAddressSimpleString());
if (bindings != null) {
RoutingContext context = new RoutingContextImpl(tx);
@@ -937,7 +931,7 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
synchronized (notificationLock) {
// First send a reset message
- ServerMessage message = new ServerMessageImpl(storageManager.generateID(), 50);
+ Message message = new CoreMessage(storageManager.generateID(), 50);
message.setAddress(queueName);
message.putBooleanProperty(PostOfficeImpl.HDR_RESET_QUEUE_DATA, true);
@@ -987,7 +981,7 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
}
}
}
- ServerMessage completeMessage = new ServerMessageImpl(storageManager.generateID(), 50);
+ Message completeMessage = new CoreMessage(storageManager.generateID(), 50);
completeMessage.setAddress(queueName);
completeMessage.putBooleanProperty(PostOfficeImpl.HDR_RESET_QUEUE_DATA_COMPLETE, true);
@@ -1006,37 +1000,14 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
// Private -----------------------------------------------------------------
- /**
- * @param message
- */
- protected void cleanupInternalPropertiesBeforeRouting(final ServerMessage message) {
- LinkedList<SimpleString> valuesToRemove = null;
-
- for (SimpleString name : message.getPropertyNames()) {
- // We use properties to establish routing context on clustering.
- // However if the client resends the message after receiving, it needs to be removed
- if ((name.startsWith(MessageImpl.HDR_ROUTE_TO_IDS) && !name.equals(MessageImpl.HDR_ROUTE_TO_IDS)) || (name.startsWith(MessageImpl.HDR_ROUTE_TO_ACK_IDS) && !name.equals(MessageImpl.HDR_ROUTE_TO_ACK_IDS))) {
- if (valuesToRemove == null) {
- valuesToRemove = new LinkedList<>();
- }
- valuesToRemove.add(name);
- }
- }
-
- if (valuesToRemove != null) {
- for (SimpleString removal : valuesToRemove) {
- message.removeProperty(removal);
- }
- }
- }
- private void setPagingStore(final ServerMessage message) throws Exception {
- PagingStore store = pagingManager.getPageStore(message.getAddress());
+ private void setPagingStore(final Message message) throws Exception {
+ PagingStore store = pagingManager.getPageStore(message.getAddressSimpleString());
- message.setPagingStore(store);
+ message.setContext(store);
}
- private void routeQueueInfo(final ServerMessage message,
+ private void routeQueueInfo(final Message message,
final Queue queue,
final boolean applyFilters) throws Exception {
if (!applyFilters || queue.getFilter() == null || queue.getFilter().match(message)) {
@@ -1074,13 +1045,15 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
}
@Override
- public void processRoute(final ServerMessage message,
+ public void processRoute(final Message message,
final RoutingContext context,
final boolean direct) throws Exception {
final List<MessageReference> refs = new ArrayList<>();
Transaction tx = context.getTransaction();
+ Long deliveryTime = message.getScheduledDeliveryTime();
+
for (Map.Entry<SimpleString, RouteContextList> entry : context.getContexListing().entrySet()) {
PagingStore store = pagingManager.getPageStore(entry.getKey());
@@ -1095,14 +1068,12 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
}
for (Queue queue : entry.getValue().getNonDurableQueues()) {
- MessageReference reference = message.createReference(queue);
-
- refs.add(reference);
- if (message.containsProperty(Message.HDR_SCHEDULED_DELIVERY_TIME)) {
- Long scheduledDeliveryTime = message.getLongProperty(Message.HDR_SCHEDULED_DELIVERY_TIME);
+ MessageReference reference = MessageReference.Factory.createReference(message, queue);
- reference.setScheduledDeliveryTime(scheduledDeliveryTime);
+ if (deliveryTime != null) {
+ reference.setScheduledDeliveryTime(deliveryTime);
}
+ refs.add(reference);
message.incrementRefCount();
}
@@ -1112,22 +1083,20 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
while (iter.hasNext()) {
Queue queue = iter.next();
- MessageReference reference = message.createReference(queue);
+ MessageReference reference = MessageReference.Factory.createReference(message, queue);
- if (context.isAlreadyAcked(message.getAddress(), queue)) {
+ if (context.isAlreadyAcked(message.getAddressSimpleString(), queue)) {
reference.setAlreadyAcked();
if (tx != null) {
queue.acknowledge(tx, reference);
}
}
- refs.add(reference);
-
- if (message.containsProperty(Message.HDR_SCHEDULED_DELIVERY_TIME)) {
- Long scheduledDeliveryTime = message.getLongProperty(Message.HDR_SCHEDULED_DELIVERY_TIME);
- reference.setScheduledDeliveryTime(scheduledDeliveryTime);
+ if (deliveryTime != null) {
+ reference.setScheduledDeliveryTime(deliveryTime);
}
+ refs.add(reference);
if (message.isDurable()) {
int durableRefCount = message.incrementDurableRefCount();
@@ -1152,7 +1121,7 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
storageManager.storeReference(queue.getID(), message.getMessageID(), !iter.hasNext());
}
- if (message.containsProperty(Message.HDR_SCHEDULED_DELIVERY_TIME)) {
+ if (message.containsDeliveryAnnotationProperty(Message.HDR_SCHEDULED_DELIVERY_TIME)) {
if (tx != null) {
storageManager.updateScheduledDeliveryTimeTransactional(tx.getID(), reference);
} else {
@@ -1189,7 +1158,7 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
* @param message
* @throws Exception
*/
- private void confirmLargeMessageSend(Transaction tx, final ServerMessage message) throws Exception {
+ private void confirmLargeMessageSend(Transaction tx, final Message message) throws Exception {
LargeServerMessage largeServerMessage = (LargeServerMessage) message;
if (largeServerMessage.getPendingRecordID() >= 0) {
if (tx == null) {
@@ -1245,13 +1214,13 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
}
}
- private boolean checkDuplicateID(final ServerMessage message,
+ private boolean checkDuplicateID(final Message message,
final RoutingContext context,
boolean rejectDuplicates,
AtomicBoolean startedTX) throws Exception {
// Check the DuplicateCache for the Bridge first
- Object bridgeDup = message.getObjectProperty(MessageImpl.HDR_BRIDGE_DUPLICATE_ID);
+ Object bridgeDup = message.removeDeliveryAnnoationProperty(Message.HDR_BRIDGE_DUPLICATE_ID);
if (bridgeDup != null) {
// if the message is being sent from the bridge, we just ignore the duplicate id, and use the internal one
byte[] bridgeDupBytes = (byte[]) bridgeDup;
@@ -1269,8 +1238,6 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
message.decrementRefCount();
return false;
}
-
- message.removeProperty(MessageImpl.HDR_BRIDGE_DUPLICATE_ID);
} else {
// if used BridgeDuplicate, it's not going to use the regular duplicate
// since this will would break redistribution (re-setting the duplicateId)
@@ -1281,7 +1248,7 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
boolean isDuplicate = false;
if (duplicateIDBytes != null) {
- cache = getDuplicateIDCache(message.getAddress());
+ cache = getDuplicateIDCache(message.getAddressSimpleString());
isDuplicate = cache.contains(duplicateIDBytes);
@@ -1338,8 +1305,8 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
}
}
- private ServerMessage createQueueInfoMessage(final NotificationType type, final SimpleString queueName) {
- ServerMessage message = new ServerMessageImpl(storageManager.generateID(), 50);
+ private Message createQueueInfoMessage(final NotificationType type, final SimpleString queueName) {
+ Message message = new CoreMessage().initBuffer(50).setMessageID(storageManager.generateID());
message.setAddress(queueName);
@@ -1433,7 +1400,7 @@ public class PostOfficeImpl implements PostOffice, NotificationListener, Binding
// Reverse the ref counts, and paging sizes
for (MessageReference ref : refs) {
- ServerMessage message = ref.getMessage();
+ Message message = ref.getMessage();
if (message.isDurable() && ref.getQueue().isDurable()) {
message.decrementDurableRefCount();
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/ServerPacketDecoder.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/ServerPacketDecoder.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/ServerPacketDecoder.java
index 2869e38..45082b9 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/ServerPacketDecoder.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/ServerPacketDecoder.java
@@ -17,6 +17,7 @@
package org.apache.activemq.artemis.core.protocol;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import org.apache.activemq.artemis.core.protocol.core.Packet;
import org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl;
import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.BackupRegistrationMessage;
@@ -47,7 +48,6 @@ import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.Replicatio
import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.ScaleDownAnnounceMessage;
import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionSendLargeMessage;
import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionSendMessage;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.BACKUP_REQUEST;
import static org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl.BACKUP_REQUEST_RESPONSE;
@@ -87,11 +87,11 @@ public class ServerPacketDecoder extends ClientPacketDecoder {
switch (packetType) {
case SESS_SEND: {
- packet = new SessionSendMessage(new ServerMessageImpl());
+ packet = new SessionSendMessage(new CoreMessage());
break;
}
case SESS_SEND_LARGE: {
- packet = new SessionSendLargeMessage(new ServerMessageImpl());
+ packet = new SessionSendLargeMessage(new CoreMessage());
break;
}
case REPLICATION_APPEND: {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/ServerSessionPacketHandler.java
----------------------------------------------------------------------
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 d09f62f..92cae64 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
@@ -25,9 +25,12 @@ 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.Message;
+import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.core.exception.ActiveMQXAException;
import org.apache.activemq.artemis.core.io.IOCallback;
import org.apache.activemq.artemis.core.persistence.StorageManager;
+import org.apache.activemq.artemis.core.protocol.core.impl.CoreProtocolManager;
import org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl;
import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.ActiveMQExceptionMessage;
import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.CreateAddressMessage;
@@ -81,9 +84,8 @@ import org.apache.activemq.artemis.core.remoting.impl.netty.NettyConnection;
import org.apache.activemq.artemis.core.server.ActiveMQMessageBundle;
import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
import org.apache.activemq.artemis.core.server.BindingQueryResult;
+import org.apache.activemq.artemis.core.server.LargeServerMessage;
import org.apache.activemq.artemis.core.server.QueueQueryResult;
-import org.apache.activemq.artemis.api.core.RoutingType;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.ServerSession;
import org.apache.activemq.artemis.spi.core.remoting.Connection;
import org.jboss.logging.Logger;
@@ -137,13 +139,23 @@ public class ServerSessionPacketHandler implements ChannelHandler {
private volatile CoreRemotingConnection remotingConnection;
+ private final CoreProtocolManager manager;
+
+ // The current currentLargeMessage being processed
+ private volatile LargeServerMessage currentLargeMessage;
+
private final boolean direct;
- public ServerSessionPacketHandler(final ServerSession session,
+ public ServerSessionPacketHandler(final CoreProtocolManager manager,
+ final ServerSession session,
final StorageManager storageManager,
final Channel channel) {
+ this.manager = manager;
+
this.session = session;
+ session.addCloseable((boolean failed) -> clearLargeMessage());
+
this.storageManager = storageManager;
this.channel = channel;
@@ -159,6 +171,16 @@ public class ServerSessionPacketHandler implements ChannelHandler {
}
}
+ private void clearLargeMessage() {
+ if (currentLargeMessage != null) {
+ try {
+ currentLargeMessage.deleteFile();
+ } catch (Throwable error) {
+ ActiveMQServerLogger.LOGGER.errorDeletingLargeMessageFile(error);
+ }
+ }
+ }
+
public ServerSession getSession() {
return session;
}
@@ -469,7 +491,7 @@ public class ServerSessionPacketHandler implements ChannelHandler {
case SESS_SEND: {
SessionSendMessage message = (SessionSendMessage) packet;
requiresResponse = message.isRequiresResponse();
- session.send((ServerMessage) message.getMessage(), direct);
+ session.send(message.getMessage(), direct);
if (requiresResponse) {
response = new NullResponseMessage();
}
@@ -477,13 +499,13 @@ public class ServerSessionPacketHandler implements ChannelHandler {
}
case SESS_SEND_LARGE: {
SessionSendLargeMessage message = (SessionSendLargeMessage) packet;
- session.sendLarge(message.getLargeMessage());
+ sendLarge(message.getLargeMessage());
break;
}
case SESS_SEND_CONTINUATION: {
SessionSendContinuationMessage message = (SessionSendContinuationMessage) packet;
requiresResponse = message.isRequiresResponse();
- session.sendContinuations(message.getPacketSize(), message.getMessageBodySize(), message.getBody(), message.isContinues());
+ sendContinuations(message.getPacketSize(), message.getMessageBodySize(), message.getBody(), message.isContinues());
if (requiresResponse) {
response = new NullResponseMessage();
}
@@ -681,4 +703,53 @@ public class ServerSessionPacketHandler implements ChannelHandler {
return serverLastReceivedCommandID;
}
+
+ // Large Message is part of the core protocol, we have these functions here as part of Packet handler
+ private void sendLarge(final Message message) throws Exception {
+ // need to create the LargeMessage before continue
+ long id = storageManager.generateID();
+
+ LargeServerMessage largeMsg = storageManager.createLargeMessage(id, message);
+
+ if (logger.isTraceEnabled()) {
+ logger.trace("sendLarge::" + largeMsg);
+ }
+
+ if (currentLargeMessage != null) {
+ ActiveMQServerLogger.LOGGER.replacingIncompleteLargeMessage(currentLargeMessage.getMessageID());
+ }
+
+ currentLargeMessage = largeMsg;
+ }
+
+
+
+ private void sendContinuations(final int packetSize,
+ final long messageBodySize,
+ final byte[] body,
+ final boolean continues) throws Exception {
+ if (currentLargeMessage == null) {
+ throw ActiveMQMessageBundle.BUNDLE.largeMessageNotInitialised();
+ }
+
+ // Immediately release the credits for the continuations- these don't contribute to the in-memory size
+ // of the message
+
+ currentLargeMessage.addBytes(body);
+
+ if (!continues) {
+ currentLargeMessage.releaseResources();
+
+ if (messageBodySize >= 0) {
+ currentLargeMessage.putLongProperty(Message.HDR_LARGE_BODY_SIZE, messageBodySize);
+ }
+
+
+ session.doSend(session.getCurrentTransaction(), currentLargeMessage, null, false, false);
+
+ currentLargeMessage = null;
+ }
+ }
+
+
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQPacketHandler.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQPacketHandler.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQPacketHandler.java
index e6595a5..919d84e 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQPacketHandler.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQPacketHandler.java
@@ -168,7 +168,7 @@ public class ActiveMQPacketHandler implements ChannelHandler {
ServerSession session = server.createSession(request.getName(), activeMQPrincipal == null ? request.getUsername() : activeMQPrincipal.getUserName(), activeMQPrincipal == null ? request.getPassword() : activeMQPrincipal.getPassword(), request.getMinLargeMessageSize(), connection, request.isAutoCommitSends(), request.isAutoCommitAcks(), request.isPreAcknowledge(), request.isXA(), request.getDefaultAddress(), new CoreSessionCallback(request.getName(), protocolManager, channel, connection), true, sessionOperationContext, routingTypeMap);
- ServerSessionPacketHandler handler = new ServerSessionPacketHandler(session, server.getStorageManager(), channel);
+ ServerSessionPacketHandler handler = new ServerSessionPacketHandler(protocolManager, session, server.getStorageManager(), channel);
channel.setHandler(handler);
// TODO - where is this removed?
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/CoreProtocolManager.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/CoreProtocolManager.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/CoreProtocolManager.java
index ffaf2cb..cc81fbe 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/CoreProtocolManager.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/CoreProtocolManager.java
@@ -30,6 +30,7 @@ import org.apache.activemq.artemis.api.core.ActiveMQBuffers;
import org.apache.activemq.artemis.api.core.BaseInterceptor;
import org.apache.activemq.artemis.api.core.Interceptor;
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.api.core.TransportConfiguration;
import org.apache.activemq.artemis.api.core.client.ActiveMQClient;
@@ -53,9 +54,7 @@ import org.apache.activemq.artemis.core.remoting.CloseListener;
import org.apache.activemq.artemis.core.remoting.impl.netty.ActiveMQFrameDecoder2;
import org.apache.activemq.artemis.core.remoting.impl.netty.NettyServerConnection;
import org.apache.activemq.artemis.core.server.ActiveMQServer;
-import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.spi.core.protocol.ConnectionEntry;
-import org.apache.activemq.artemis.spi.core.protocol.MessageConverter;
import org.apache.activemq.artemis.spi.core.protocol.ProtocolManager;
import org.apache.activemq.artemis.spi.core.protocol.ProtocolManagerFactory;
import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
@@ -111,16 +110,6 @@ public class CoreProtocolManager implements ProtocolManager<Interceptor> {
return false;
}
- /**
- * no need to implement this now
- *
- * @return
- */
- @Override
- public MessageConverter getConverter() {
- return null;
- }
-
@Override
public ConnectionEntry createConnectionEntry(final Acceptor acceptorUsed, final Connection connection) {
final Configuration config = server.getConfiguration();
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/CoreProtocolManagerFactory.java
----------------------------------------------------------------------
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 7fed534..7560917 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
@@ -21,7 +21,10 @@ import java.util.Map;
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.CoreMessagePersister;
+import org.apache.activemq.artemis.core.persistence.Persister;
import org.apache.activemq.artemis.core.server.ActiveMQServer;
import org.apache.activemq.artemis.spi.core.protocol.AbstractProtocolManagerFactory;
import org.apache.activemq.artemis.spi.core.protocol.ProtocolManager;
@@ -29,10 +32,21 @@ import org.apache.activemq.artemis.utils.uri.BeanSupport;
public class CoreProtocolManagerFactory extends AbstractProtocolManagerFactory<Interceptor> {
+ public static final byte ID = 1;
private static String[] SUPPORTED_PROTOCOLS = {ActiveMQClient.DEFAULT_CORE_PROTOCOL};
private static final String MODULE_NAME = "artemis-server";
+ @Override
+ public byte getStoreID() {
+ return ID;
+ }
+
+ @Override
+ public Persister<Message> getPersister() {
+ return CoreMessagePersister.getInstance();
+ }
+
/**
* {@inheritDoc} *
*
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/CoreSessionCallback.java
----------------------------------------------------------------------
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 a6c73eb..542d726 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
@@ -16,6 +16,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.protocol.core.Channel;
import org.apache.activemq.artemis.core.protocol.core.Packet;
@@ -28,7 +29,6 @@ import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionRec
import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
import org.apache.activemq.artemis.core.server.MessageReference;
import org.apache.activemq.artemis.core.server.ServerConsumer;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.spi.core.protocol.ProtocolManager;
import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
import org.apache.activemq.artemis.spi.core.protocol.SessionCallback;
@@ -66,7 +66,7 @@ public final class CoreSessionCallback implements SessionCallback {
@Override
public int sendLargeMessage(MessageReference ref,
- ServerMessage message,
+ Message message,
ServerConsumer consumer,
long bodySize,
int deliveryCount) {
@@ -92,8 +92,9 @@ public final class CoreSessionCallback implements SessionCallback {
}
@Override
- public int sendMessage(MessageReference ref, ServerMessage message, ServerConsumer consumer, int deliveryCount) {
- Packet packet = new SessionReceiveMessage(consumer.getID(), message, deliveryCount);
+ public int sendMessage(MessageReference ref, Message message, ServerConsumer consumer, int deliveryCount) {
+
+ Packet packet = new SessionReceiveMessage(consumer.getID(), message.toCore(), deliveryCount);
int size = 0;
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/ReplicationAddMessage.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/ReplicationAddMessage.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/ReplicationAddMessage.java
index 89d2863..8d22fab 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/ReplicationAddMessage.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/ReplicationAddMessage.java
@@ -19,7 +19,7 @@ package org.apache.activemq.artemis.core.protocol.core.impl.wireformat;
import java.util.Arrays;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
-import org.apache.activemq.artemis.core.journal.EncodingSupport;
+import org.apache.activemq.artemis.core.persistence.Persister;
import org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl;
import org.apache.activemq.artemis.core.replication.ReplicationManager.ADD_OPERATION_TYPE;
@@ -36,7 +36,9 @@ public final class ReplicationAddMessage extends PacketImpl {
private byte journalRecordType;
- private EncodingSupport encodingData;
+ private Persister persister;
+
+ private Object encodingData;
private byte[] recordData;
@@ -48,12 +50,14 @@ public final class ReplicationAddMessage extends PacketImpl {
final ADD_OPERATION_TYPE operation,
final long id,
final byte journalRecordType,
- final EncodingSupport encodingData) {
+ final Persister persister,
+ final Object encodingData) {
this();
this.journalID = journalID;
this.operation = operation;
this.id = id;
this.journalRecordType = journalRecordType;
+ this.persister = persister;
this.encodingData = encodingData;
}
@@ -66,8 +70,8 @@ public final class ReplicationAddMessage extends PacketImpl {
buffer.writeBoolean(operation.toBoolean());
buffer.writeLong(id);
buffer.writeByte(journalRecordType);
- buffer.writeInt(encodingData.getEncodeSize());
- encodingData.encode(buffer);
+ buffer.writeInt(persister.getEncodeSize(encodingData));
+ persister.encode(buffer, encodingData);
}
@Override
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/ReplicationAddTXMessage.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/ReplicationAddTXMessage.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/ReplicationAddTXMessage.java
index 59475e0..a6fd02b 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/ReplicationAddTXMessage.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/ReplicationAddTXMessage.java
@@ -19,7 +19,7 @@ package org.apache.activemq.artemis.core.protocol.core.impl.wireformat;
import java.util.Arrays;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
-import org.apache.activemq.artemis.core.journal.EncodingSupport;
+import org.apache.activemq.artemis.core.persistence.Persister;
import org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl;
import org.apache.activemq.artemis.core.replication.ReplicationManager.ADD_OPERATION_TYPE;
@@ -36,7 +36,9 @@ public class ReplicationAddTXMessage extends PacketImpl {
private byte recordType;
- private EncodingSupport encodingData;
+ private Persister persister;
+
+ private Object encodingData;
private byte[] recordData;
@@ -51,7 +53,8 @@ public class ReplicationAddTXMessage extends PacketImpl {
final long txId,
final long id,
final byte recordType,
- final EncodingSupport encodingData) {
+ final Persister persister,
+ final Object encodingData) {
this();
this.journalID = journalID;
this.operation = operation;
@@ -59,6 +62,7 @@ public class ReplicationAddTXMessage extends PacketImpl {
this.id = id;
this.recordType = recordType;
this.encodingData = encodingData;
+ this.persister = persister;
}
// Public --------------------------------------------------------
@@ -70,8 +74,8 @@ public class ReplicationAddTXMessage extends PacketImpl {
buffer.writeLong(txId);
buffer.writeLong(id);
buffer.writeByte(recordType);
- buffer.writeInt(encodingData.getEncodeSize());
- encodingData.encode(buffer);
+ buffer.writeInt(persister.getEncodeSize(encodingData));
+ persister.encode(buffer, encodingData);
}
@Override
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/ReplicationPageWriteMessage.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/ReplicationPageWriteMessage.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/ReplicationPageWriteMessage.java
index 7307151..b88e0fe 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/ReplicationPageWriteMessage.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/ReplicationPageWriteMessage.java
@@ -48,7 +48,7 @@ public class ReplicationPageWriteMessage extends PacketImpl {
@Override
public void decodeRest(final ActiveMQBuffer buffer) {
pageNumber = buffer.readInt();
- pagedMessage = new PagedMessageImpl();
+ pagedMessage = new PagedMessageImpl(null);
pagedMessage.decode(buffer);
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/server/RemotingService.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/server/RemotingService.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/server/RemotingService.java
index ea3107c..c5318e7 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/server/RemotingService.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/server/RemotingService.java
@@ -17,12 +17,14 @@
package org.apache.activemq.artemis.core.remoting.server;
import java.util.List;
+import java.util.Map;
import java.util.Set;
import org.apache.activemq.artemis.api.core.BaseInterceptor;
import org.apache.activemq.artemis.api.core.TransportConfiguration;
import org.apache.activemq.artemis.core.protocol.core.CoreRemotingConnection;
import org.apache.activemq.artemis.core.security.ActiveMQPrincipal;
+import org.apache.activemq.artemis.spi.core.protocol.ProtocolManagerFactory;
import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
import org.apache.activemq.artemis.spi.core.remoting.Acceptor;
import org.apache.activemq.artemis.utils.ReusableLatch;
@@ -65,6 +67,8 @@ public interface RemotingService {
boolean isStarted();
+ Map<String, ProtocolManagerFactory> getProtocolFactoryMap();
+
/**
* Allow acceptors to use this as their default security Principal if applicable.
* <p>
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/server/impl/RemotingServiceImpl.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/server/impl/RemotingServiceImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/server/impl/RemotingServiceImpl.java
index 50bc90d..3e15f3e 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/server/impl/RemotingServiceImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/remoting/server/impl/RemotingServiceImpl.java
@@ -59,6 +59,7 @@ import org.apache.activemq.artemis.core.server.cluster.ClusterConnection;
import org.apache.activemq.artemis.core.server.cluster.ClusterManager;
import org.apache.activemq.artemis.core.server.management.ManagementService;
import org.apache.activemq.artemis.spi.core.protocol.ConnectionEntry;
+import org.apache.activemq.artemis.spi.core.protocol.MessagePersister;
import org.apache.activemq.artemis.spi.core.protocol.ProtocolManager;
import org.apache.activemq.artemis.spi.core.protocol.ProtocolManagerFactory;
import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
@@ -147,7 +148,9 @@ public class RemotingServiceImpl implements RemotingService, ServerConnectionLif
this.scheduledThreadPool = scheduledThreadPool;
CoreProtocolManagerFactory coreProtocolManagerFactory = new CoreProtocolManagerFactory();
- //i know there is only 1
+
+ MessagePersister.getInstance().registerProtocol(coreProtocolManagerFactory);
+
this.flushExecutor = flushExecutor;
ActiveMQServerLogger.LOGGER.addingProtocolSupport(coreProtocolManagerFactory.getProtocols()[0], coreProtocolManagerFactory.getModuleName());
@@ -174,6 +177,11 @@ public class RemotingServiceImpl implements RemotingService, ServerConnectionLif
}
@Override
+ public Map<String, ProtocolManagerFactory> getProtocolFactoryMap() {
+ return protocolMap;
+ }
+
+ @Override
public synchronized void start() throws Exception {
if (started) {
return;
@@ -768,6 +776,7 @@ public class RemotingServiceImpl implements RemotingService, ServerConnectionLif
*/
private void loadProtocolManagerFactories(Iterable<ProtocolManagerFactory> protocolManagerFactoryCollection) {
for (ProtocolManagerFactory next : protocolManagerFactoryCollection) {
+ MessagePersister.registerProtocol(next);
String[] protocols = next.getProtocols();
for (String protocol : protocols) {
ActiveMQServerLogger.LOGGER.addingProtocolSupport(protocol, next.getModuleName());
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/replication/ReplicatedJournal.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/replication/ReplicatedJournal.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/replication/ReplicatedJournal.java
index d70316f..0731e8c 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/replication/ReplicatedJournal.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/replication/ReplicatedJournal.java
@@ -25,6 +25,7 @@ import org.apache.activemq.artemis.core.journal.IOCompletion;
import org.apache.activemq.artemis.core.journal.Journal;
import org.apache.activemq.artemis.core.journal.JournalLoadInformation;
import org.apache.activemq.artemis.core.journal.LoaderCallback;
+import org.apache.activemq.artemis.core.persistence.Persister;
import org.apache.activemq.artemis.core.journal.PreparedTransactionInfo;
import org.apache.activemq.artemis.core.journal.RecordInfo;
import org.apache.activemq.artemis.core.journal.TransactionFailureCallback;
@@ -88,13 +89,14 @@ public class ReplicatedJournal implements Journal {
@Override
public void appendAddRecord(final long id,
final byte recordType,
- final EncodingSupport record,
+ Persister persister,
+ final Object record,
final boolean sync) throws Exception {
if (ReplicatedJournal.trace) {
ReplicatedJournal.trace("Append record id = " + id + " recordType = " + recordType);
}
- replicationManager.appendUpdateRecord(journalID, ADD_OPERATION_TYPE.ADD, id, recordType, record);
- localJournal.appendAddRecord(id, recordType, record, sync);
+ replicationManager.appendUpdateRecord(journalID, ADD_OPERATION_TYPE.ADD, id, recordType, persister, record);
+ localJournal.appendAddRecord(id, recordType, persister, record, sync);
}
/**
@@ -108,14 +110,15 @@ public class ReplicatedJournal implements Journal {
@Override
public void appendAddRecord(final long id,
final byte recordType,
- final EncodingSupport record,
+ Persister persister,
+ final Object record,
final boolean sync,
final IOCompletion completionCallback) throws Exception {
if (ReplicatedJournal.trace) {
ReplicatedJournal.trace("Append record id = " + id + " recordType = " + recordType);
}
- replicationManager.appendUpdateRecord(journalID, ADD_OPERATION_TYPE.ADD, id, recordType, record);
- localJournal.appendAddRecord(id, recordType, record, sync, completionCallback);
+ replicationManager.appendUpdateRecord(journalID, ADD_OPERATION_TYPE.ADD, id, recordType, persister, record);
+ localJournal.appendAddRecord(id, recordType, persister, record, sync, completionCallback);
}
/**
@@ -146,12 +149,13 @@ public class ReplicatedJournal implements Journal {
public void appendAddRecordTransactional(final long txID,
final long id,
final byte recordType,
- final EncodingSupport record) throws Exception {
+ final Persister persister,
+ final Object record) throws Exception {
if (ReplicatedJournal.trace) {
ReplicatedJournal.trace("Append record TXid = " + id + " recordType = " + recordType);
}
- replicationManager.appendAddRecordTransactional(journalID, ADD_OPERATION_TYPE.ADD, txID, id, recordType, record);
- localJournal.appendAddRecordTransactional(txID, id, recordType, record);
+ replicationManager.appendAddRecordTransactional(journalID, ADD_OPERATION_TYPE.ADD, txID, id, recordType, persister, record);
+ localJournal.appendAddRecordTransactional(txID, id, recordType, persister, record);
}
/**
@@ -354,26 +358,28 @@ public class ReplicatedJournal implements Journal {
@Override
public void appendUpdateRecord(final long id,
final byte recordType,
- final EncodingSupport record,
+ final Persister persister,
+ final Object record,
final boolean sync) throws Exception {
if (ReplicatedJournal.trace) {
ReplicatedJournal.trace("AppendUpdateRecord id = " + id + " , recordType = " + recordType);
}
- replicationManager.appendUpdateRecord(journalID, ADD_OPERATION_TYPE.UPDATE, id, recordType, record);
- localJournal.appendUpdateRecord(id, recordType, record, sync);
+ replicationManager.appendUpdateRecord(journalID, ADD_OPERATION_TYPE.UPDATE, id, recordType, persister, record);
+ localJournal.appendUpdateRecord(id, recordType, persister, record, sync);
}
@Override
public void appendUpdateRecord(final long id,
final byte journalRecordType,
- final EncodingSupport record,
+ final Persister persister,
+ final Object record,
final boolean sync,
final IOCompletion completionCallback) throws Exception {
if (ReplicatedJournal.trace) {
ReplicatedJournal.trace("AppendUpdateRecord id = " + id + " , recordType = " + journalRecordType);
}
- replicationManager.appendUpdateRecord(journalID, ADD_OPERATION_TYPE.UPDATE, id, journalRecordType, record);
- localJournal.appendUpdateRecord(id, journalRecordType, record, sync, completionCallback);
+ replicationManager.appendUpdateRecord(journalID, ADD_OPERATION_TYPE.UPDATE, id, journalRecordType, persister, record);
+ localJournal.appendUpdateRecord(id, journalRecordType, persister, record, sync, completionCallback);
}
/**
@@ -404,12 +410,13 @@ public class ReplicatedJournal implements Journal {
public void appendUpdateRecordTransactional(final long txID,
final long id,
final byte recordType,
- final EncodingSupport record) throws Exception {
+ final Persister persister,
+ final Object record) throws Exception {
if (ReplicatedJournal.trace) {
ReplicatedJournal.trace("AppendUpdateRecord txid=" + txID + " id = " + id + " , recordType = " + recordType);
}
- replicationManager.appendAddRecordTransactional(journalID, ADD_OPERATION_TYPE.UPDATE, txID, id, recordType, record);
- localJournal.appendUpdateRecordTransactional(txID, id, recordType, record);
+ replicationManager.appendAddRecordTransactional(journalID, ADD_OPERATION_TYPE.UPDATE, txID, id, recordType, persister, record);
+ localJournal.appendUpdateRecordTransactional(txID, id, recordType, persister, record);
}
/**
@@ -437,15 +444,6 @@ public class ReplicatedJournal implements Journal {
}
/**
- * @param pages
- * @see org.apache.activemq.artemis.core.journal.Journal#perfBlast(int)
- */
- @Override
- public void perfBlast(final int pages) {
- localJournal.perfBlast(pages);
- }
-
- /**
* @throws Exception
* @see org.apache.activemq.artemis.core.server.ActiveMQComponent#start()
*/
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/replication/ReplicationEndpoint.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/replication/ReplicationEndpoint.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/replication/ReplicationEndpoint.java
index 1a07adc..e82d38e 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/replication/ReplicationEndpoint.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/replication/ReplicationEndpoint.java
@@ -32,6 +32,7 @@ import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
import org.apache.activemq.artemis.api.core.ActiveMQException;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.config.Configuration;
import org.apache.activemq.artemis.core.io.IOCriticalErrorListener;
@@ -76,7 +77,7 @@ import org.apache.activemq.artemis.core.replication.ReplicationManager.ADD_OPERA
import org.apache.activemq.artemis.core.server.ActiveMQComponent;
import org.apache.activemq.artemis.core.server.ActiveMQMessageBundle;
import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
-import org.apache.activemq.artemis.core.server.ServerMessage;
+
import org.apache.activemq.artemis.core.server.cluster.qourum.SharedNothingBackupQuorum;
import org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl;
import org.apache.activemq.artemis.core.server.impl.SharedNothingBackupActivation;
@@ -651,8 +652,8 @@ public final class ReplicationEndpoint implements ChannelHandler, ActiveMQCompon
private void handlePageWrite(final ReplicationPageWriteMessage packet) throws Exception {
PagedMessage pgdMessage = packet.getPagedMessage();
pgdMessage.initMessage(storageManager);
- ServerMessage msg = pgdMessage.getMessage();
- Page page = getPage(msg.getAddress(), packet.getPageNumber());
+ Message msg = pgdMessage.getMessage();
+ Page page = getPage(msg.getAddressSimpleString(), packet.getPageNumber());
page.write(pgdMessage);
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/replication/ReplicationManager.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/replication/ReplicationManager.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/replication/ReplicationManager.java
index d0468d1..dce5990 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/replication/ReplicationManager.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/replication/ReplicationManager.java
@@ -36,6 +36,7 @@ import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.api.core.client.SessionFailureListener;
import org.apache.activemq.artemis.core.io.SequentialFile;
import org.apache.activemq.artemis.core.journal.EncodingSupport;
+import org.apache.activemq.artemis.core.persistence.Persister;
import org.apache.activemq.artemis.core.journal.impl.JournalFile;
import org.apache.activemq.artemis.core.paging.PagedMessage;
import org.apache.activemq.artemis.core.persistence.OperationContext;
@@ -147,9 +148,10 @@ public final class ReplicationManager implements ActiveMQComponent, ReadyListene
final ADD_OPERATION_TYPE operation,
final long id,
final byte recordType,
- final EncodingSupport record) throws Exception {
+ final Persister persister,
+ final Object record) throws Exception {
if (enabled) {
- sendReplicatePacket(new ReplicationAddMessage(journalID, operation, id, recordType, record));
+ sendReplicatePacket(new ReplicationAddMessage(journalID, operation, id, recordType, persister, record));
}
}
@@ -164,9 +166,10 @@ public final class ReplicationManager implements ActiveMQComponent, ReadyListene
final long txID,
final long id,
final byte recordType,
- final EncodingSupport record) throws Exception {
+ final Persister persister,
+ final Object record) throws Exception {
if (enabled) {
- sendReplicatePacket(new ReplicationAddTXMessage(journalID, operation, txID, id, recordType, record));
+ sendReplicatePacket(new ReplicationAddTXMessage(journalID, operation, txID, id, recordType, persister, record));
}
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServerLogger.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServerLogger.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServerLogger.java
index 6ee844b..b79806a 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServerLogger.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ActiveMQServerLogger.java
@@ -577,12 +577,8 @@ public interface ActiveMQServerLogger extends BasicLogger {
void ioErrorAddingReferences(Integer errorCode, String errorMessage);
@LogMessage(level = Logger.Level.WARN)
- @Message(id = 222058, value = "Duplicate message detected through the bridge - message will not be routed. Message information:\n{0}", format = Message.Format.MESSAGE_FORMAT)
- void duplicateMessageDetectedThruBridge(ServerMessage message);
-
- @LogMessage(level = Logger.Level.WARN)
@Message(id = 222059, value = "Duplicate message detected - message will not be routed. Message information:\n{0}", format = Message.Format.MESSAGE_FORMAT)
- void duplicateMessageDetected(ServerMessage message);
+ void duplicateMessageDetected(org.apache.activemq.artemis.api.core.Message message);
@LogMessage(level = Logger.Level.WARN)
@Message(id = 222060, value = "Error while confirming large message completion on rollback for recordID={0}", format = Message.Format.MESSAGE_FORMAT)
@@ -783,7 +779,7 @@ public interface ActiveMQServerLogger extends BasicLogger {
@LogMessage(level = Logger.Level.WARN)
@Message(id = 222110, value = "no queue IDs defined!, originalMessage = {0}, copiedMessage = {1}, props={2}",
format = Message.Format.MESSAGE_FORMAT)
- void noQueueIdDefined(ServerMessage message, ServerMessage messageCopy, SimpleString idsHeaderName);
+ void noQueueIdDefined(org.apache.activemq.artemis.api.core.Message message, org.apache.activemq.artemis.api.core.Message messageCopy, SimpleString idsHeaderName);
@LogMessage(level = Logger.Level.TRACE)
@Message(id = 222111, value = "exception while invoking {0} on {1}",
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/Bindable.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/Bindable.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/Bindable.java
index 0e38634..1ede0ea 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/Bindable.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/Bindable.java
@@ -16,9 +16,11 @@
*/
package org.apache.activemq.artemis.core.server;
+import org.apache.activemq.artemis.api.core.Message;
+
public interface Bindable {
- void route(ServerMessage message, RoutingContext context) throws Exception;
+ void route(Message message, RoutingContext context) throws Exception;
- void routeWithAck(ServerMessage message, RoutingContext context) throws Exception;
+ void routeWithAck(Message message, RoutingContext context) throws Exception;
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/LargeServerMessage.java
----------------------------------------------------------------------
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 2a16ed2..6fcc802 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
@@ -17,10 +17,11 @@
package org.apache.activemq.artemis.core.server;
import org.apache.activemq.artemis.api.core.ActiveMQException;
+import org.apache.activemq.artemis.api.core.ICoreMessage;
import org.apache.activemq.artemis.core.io.SequentialFile;
import org.apache.activemq.artemis.core.replication.ReplicatedLargeMessage;
-public interface LargeServerMessage extends ServerMessage, ReplicatedLargeMessage {
+public interface LargeServerMessage extends ReplicatedLargeMessage, ICoreMessage {
@Override
void addBytes(byte[] bytes) throws Exception;
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/MessageReference.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/MessageReference.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/MessageReference.java
index a1e6a20..799b0b0 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/MessageReference.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/MessageReference.java
@@ -16,7 +16,10 @@
*/
package org.apache.activemq.artemis.core.server;
+
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.core.server.impl.AckReason;
+import org.apache.activemq.artemis.core.server.impl.MessageReferenceImpl;
import org.apache.activemq.artemis.core.transaction.Transaction;
/**
@@ -26,9 +29,14 @@ import org.apache.activemq.artemis.core.transaction.Transaction;
*/
public interface MessageReference {
+ final class Factory {
+ public static MessageReference createReference(Message encode, final Queue queue) {
+ return new MessageReferenceImpl(encode, queue);
+ }
+ }
boolean isPaged();
- ServerMessage getMessage();
+ Message getMessage();
/**
* We define this method aggregation here because on paging we need to hold the original estimate,
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/Queue.java
----------------------------------------------------------------------
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 ae377bb..d7b70a3 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
@@ -22,6 +22,7 @@ import java.util.Map;
import java.util.concurrent.Executor;
import org.apache.activemq.artemis.api.core.ActiveMQException;
+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;
@@ -197,7 +198,7 @@ public interface Queue extends Bindable {
void cancelRedistributor() throws Exception;
- boolean hasMatchingConsumer(ServerMessage message);
+ boolean hasMatchingConsumer(Message message);
Collection<Consumer> getConsumers();
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ServerMessage.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ServerMessage.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ServerMessage.java
deleted file mode 100644
index 40dc50f..0000000
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ServerMessage.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * 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;
-
-import org.apache.activemq.artemis.api.core.SimpleString;
-import org.apache.activemq.artemis.core.journal.EncodingSupport;
-import org.apache.activemq.artemis.core.message.impl.MessageInternal;
-import org.apache.activemq.artemis.core.paging.PagingStore;
-
-/**
- * A ServerMessage
- */
-public interface ServerMessage extends MessageInternal, EncodingSupport {
-
- ServerMessage setMessageID(long id);
-
- MessageReference createReference(Queue queue);
-
- /**
- * This will force encoding of the address, and will re-check the buffer
- * This is to avoid setMessageTransient which set the address without changing the buffer
- *
- * @param address
- */
- void forceAddress(SimpleString address);
-
- int incrementRefCount() throws Exception;
-
- int decrementRefCount() throws Exception;
-
- int incrementDurableRefCount();
-
- int decrementDurableRefCount();
-
- ServerMessage copy(long newID);
-
- ServerMessage copy();
-
- int getMemoryEstimate();
-
- int getRefCount();
-
- ServerMessage makeCopyForExpiryOrDLA(long newID,
- MessageReference originalReference,
- boolean expiry,
- boolean copyOriginalHeaders) throws Exception;
-
- void setOriginalHeaders(ServerMessage other, MessageReference originalReference, boolean expiry);
-
- void setPagingStore(PagingStore store);
-
- PagingStore getPagingStore();
-
- // Is there any _AMQ_ property being used
- boolean hasInternalProperties();
-
- boolean storeIsPaging();
-
- void encodeMessageIDToBuffer();
-
- byte[] getDuplicateIDBytes();
-
- Object getDuplicateProperty();
-}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ServerSession.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ServerSession.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ServerSession.java
index f4e2ec7..0ce0728 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ServerSession.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/ServerSession.java
@@ -21,10 +21,11 @@ import javax.transaction.xa.Xid;
import java.util.List;
import java.util.Set;
+import org.apache.activemq.artemis.Closeable;
+import org.apache.activemq.artemis.api.core.Message;
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.message.impl.MessageInternal;
import org.apache.activemq.artemis.core.persistence.OperationContext;
import org.apache.activemq.artemis.core.postoffice.RoutingStatus;
import org.apache.activemq.artemis.core.security.SecurityAuth;
@@ -99,6 +100,8 @@ public interface ServerSession extends SecurityAuth {
void stop();
+ void addCloseable(Closeable closeable);
+
/**
* To be used by protocol heads that needs to control the transaction outside the session context.
*/
@@ -178,18 +181,20 @@ public interface ServerSession extends SecurityAuth {
void receiveConsumerCredits(long consumerID, int credits) throws Exception;
- void sendContinuations(int packetSize, long totalBodySize, byte[] body, boolean continues) throws Exception;
-
RoutingStatus send(Transaction tx,
- ServerMessage message,
+ Message message,
boolean direct,
boolean noAutoCreateQueue) throws Exception;
- RoutingStatus send(ServerMessage message, boolean direct, boolean noAutoCreateQueue) throws Exception;
+ RoutingStatus doSend(final Transaction tx,
+ final Message msg,
+ final SimpleString originalAddress,
+ final boolean direct,
+ final boolean noAutoCreateQueue) throws Exception;
- RoutingStatus send(ServerMessage message, boolean direct) throws Exception;
+ RoutingStatus send(Message message, boolean direct, boolean noAutoCreateQueue) throws Exception;
- void sendLarge(MessageInternal msg) throws Exception;
+ RoutingStatus send(Message message, boolean direct) throws Exception;
void forceConsumerDelivery(long consumerID, long sequence) throws Exception;
@@ -249,7 +254,9 @@ public interface ServerSession extends SecurityAuth {
SimpleString getMatchingQueue(SimpleString address, RoutingType routingType) throws Exception;
- SimpleString getMatchingQueue(SimpleString address, SimpleString queueName, RoutingType routingType) throws Exception;
+ SimpleString getMatchingQueue(SimpleString address,
+ SimpleString queueName,
+ RoutingType routingType) throws Exception;
AddressInfo getAddress(SimpleString address);
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/Transformer.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/Transformer.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/Transformer.java
index 1583f2c..48f4aa9 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/Transformer.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/Transformer.java
@@ -16,9 +16,9 @@
*/
package org.apache.activemq.artemis.core.server.cluster;
-import org.apache.activemq.artemis.core.server.ServerMessage;
+import org.apache.activemq.artemis.api.core.Message;
public interface Transformer {
- ServerMessage transform(ServerMessage message);
+ Message transform(Message message);
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/impl/BridgeImpl.java
----------------------------------------------------------------------
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 ee549c5..f7a3540 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
@@ -46,14 +46,12 @@ import org.apache.activemq.artemis.core.client.impl.ClientSessionFactoryInternal
import org.apache.activemq.artemis.core.client.impl.ClientSessionInternal;
import org.apache.activemq.artemis.core.client.impl.ServerLocatorInternal;
import org.apache.activemq.artemis.core.filter.Filter;
-import org.apache.activemq.artemis.core.message.impl.MessageImpl;
import org.apache.activemq.artemis.core.persistence.StorageManager;
import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
import org.apache.activemq.artemis.core.server.HandleStatus;
import org.apache.activemq.artemis.core.server.LargeServerMessage;
import org.apache.activemq.artemis.core.server.MessageReference;
import org.apache.activemq.artemis.core.server.Queue;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.cluster.Bridge;
import org.apache.activemq.artemis.core.server.cluster.Transformer;
import org.apache.activemq.artemis.core.server.impl.QueueImpl;
@@ -499,16 +497,16 @@ public class BridgeImpl implements Bridge, SessionFailureListener, SendAcknowled
}
/* Hook for processing message before forwarding */
- protected ServerMessage beforeForward(final ServerMessage message) {
+ protected Message beforeForward(final Message message) {
if (useDuplicateDetection) {
// We keep our own DuplicateID for the Bridge, so bouncing back and forth will work fine
byte[] bytes = getDuplicateBytes(nodeUUID, message.getMessageID());
- message.putBytesProperty(MessageImpl.HDR_BRIDGE_DUPLICATE_ID, bytes);
+ message.putBytesProperty(Message.HDR_BRIDGE_DUPLICATE_ID, bytes);
}
if (transformer != null) {
- final ServerMessage transformedMessage = transformer.transform(message);
+ final Message transformedMessage = transformer.transform(message);
if (transformedMessage != message) {
if (logger.isDebugEnabled()) {
logger.debug("The transformer " + transformer +
@@ -556,7 +554,7 @@ public class BridgeImpl implements Bridge, SessionFailureListener, SendAcknowled
refs.put(ref.getMessage().getMessageID(), ref);
}
- final ServerMessage message = beforeForward(ref.getMessage());
+ final Message message = beforeForward(ref.getMessage());
final SimpleString dest;
@@ -564,7 +562,7 @@ public class BridgeImpl implements Bridge, SessionFailureListener, SendAcknowled
dest = forwardingAddress;
} else {
// Preserve the original address
- dest = message.getAddress();
+ dest = message.getAddressSimpleString();
}
pendingAcks.countUp();
@@ -686,7 +684,7 @@ public class BridgeImpl implements Bridge, SessionFailureListener, SendAcknowled
* @param message
* @return
*/
- private HandleStatus deliverStandardMessage(SimpleString dest, final MessageReference ref, ServerMessage message) {
+ private HandleStatus deliverStandardMessage(SimpleString dest, final MessageReference ref, Message message) {
// 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
@@ -697,6 +695,7 @@ public class BridgeImpl implements Bridge, SessionFailureListener, SendAcknowled
}
try {
+ // TODO-now: replace this
producer.send(dest, message);
} catch (final ActiveMQException e) {
ActiveMQServerLogger.LOGGER.bridgeUnableToSendMessage(e, ref);
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/impl/ClusterConnectionBridge.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/impl/ClusterConnectionBridge.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/impl/ClusterConnectionBridge.java
index f16d863..a870ea6 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/impl/ClusterConnectionBridge.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/impl/ClusterConnectionBridge.java
@@ -25,6 +25,7 @@ import java.util.concurrent.ScheduledExecutorService;
import org.apache.activemq.artemis.api.core.ActiveMQException;
import org.apache.activemq.artemis.api.core.ActiveMQExceptionType;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.api.core.TransportConfiguration;
import org.apache.activemq.artemis.api.core.client.ClientConsumer;
@@ -36,12 +37,10 @@ import org.apache.activemq.artemis.api.core.management.ResourceNames;
import org.apache.activemq.artemis.core.client.impl.ClientSessionFactoryInternal;
import org.apache.activemq.artemis.core.client.impl.ServerLocatorInternal;
import org.apache.activemq.artemis.core.filter.Filter;
-import org.apache.activemq.artemis.core.message.impl.MessageImpl;
import org.apache.activemq.artemis.core.persistence.StorageManager;
import org.apache.activemq.artemis.core.postoffice.BindingType;
import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
import org.apache.activemq.artemis.core.server.Queue;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.cluster.ActiveMQServerSideProtocolManagerFactory;
import org.apache.activemq.artemis.core.server.cluster.ClusterConnection;
import org.apache.activemq.artemis.core.server.cluster.ClusterManager;
@@ -113,7 +112,7 @@ public class ClusterConnectionBridge extends BridgeImpl {
this.discoveryLocator = discoveryLocator;
- idsHeaderName = MessageImpl.HDR_ROUTE_TO_IDS.concat(name);
+ idsHeaderName = Message.HDR_ROUTE_TO_IDS.concat(name);
this.clusterConnection = clusterConnection;
@@ -150,13 +149,13 @@ public class ClusterConnectionBridge extends BridgeImpl {
}
@Override
- protected ServerMessage beforeForward(final ServerMessage message) {
+ protected Message beforeForward(final Message message) {
// We make a copy of the message, then we strip out the unwanted routing id headers and leave
// only
// the one pertinent for the address node - this is important since different queues on different
// nodes could have same queue ids
// Note we must copy since same message may get routed to other nodes which require different headers
- ServerMessage messageCopy = message.copy();
+ Message messageCopy = message.copy();
if (logger.isTraceEnabled()) {
logger.trace("Clustered bridge copied message " + message + " as " + messageCopy + " before delivery");
@@ -175,12 +174,12 @@ public class ClusterConnectionBridge extends BridgeImpl {
}
for (SimpleString propName : propNames) {
- if (propName.startsWith(MessageImpl.HDR_ROUTE_TO_IDS)) {
+ if (propName.startsWith(Message.HDR_ROUTE_TO_IDS)) {
messageCopy.removeProperty(propName);
}
}
- messageCopy.putBytesProperty(MessageImpl.HDR_ROUTE_TO_IDS, queueIds);
+ messageCopy.putBytesProperty(Message.HDR_ROUTE_TO_IDS, queueIds);
messageCopy = super.beforeForward(messageCopy);
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/impl/Redistributor.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/impl/Redistributor.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/impl/Redistributor.java
index c585405..e9477a8 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/impl/Redistributor.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/impl/Redistributor.java
@@ -32,7 +32,6 @@ import org.apache.activemq.artemis.core.server.HandleStatus;
import org.apache.activemq.artemis.core.server.MessageReference;
import org.apache.activemq.artemis.core.server.Queue;
import org.apache.activemq.artemis.core.server.RoutingContext;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.transaction.Transaction;
import org.apache.activemq.artemis.core.transaction.impl.TransactionImpl;
import org.apache.activemq.artemis.utils.ReusableLatch;
@@ -139,7 +138,7 @@ public class Redistributor implements Consumer {
final Transaction tx = new TransactionImpl(storageManager);
- final Pair<RoutingContext, ServerMessage> routingInfo = postOffice.redistribute(reference.getMessage(), queue, tx);
+ final Pair<RoutingContext, Message> routingInfo = postOffice.redistribute(reference.getMessage(), queue, tx);
if (routingInfo == null) {
return HandleStatus.BUSY;
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/impl/RemoteQueueBindingImpl.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/impl/RemoteQueueBindingImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/impl/RemoteQueueBindingImpl.java
index 8f54b2a..02a7671 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/impl/RemoteQueueBindingImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/cluster/impl/RemoteQueueBindingImpl.java
@@ -23,15 +23,14 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.filter.Filter;
import org.apache.activemq.artemis.core.filter.impl.FilterImpl;
-import org.apache.activemq.artemis.core.message.impl.MessageImpl;
import org.apache.activemq.artemis.core.postoffice.BindingType;
import org.apache.activemq.artemis.core.server.Bindable;
import org.apache.activemq.artemis.core.server.Queue;
import org.apache.activemq.artemis.core.server.RoutingContext;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.cluster.RemoteQueueBinding;
import org.jboss.logging.Logger;
@@ -88,7 +87,7 @@ public class RemoteQueueBindingImpl implements RemoteQueueBinding {
queueFilter = FilterImpl.createFilter(filterString);
- idsHeaderName = MessageImpl.HDR_ROUTE_TO_IDS.concat(bridgeName);
+ idsHeaderName = Message.HDR_ROUTE_TO_IDS.concat(bridgeName);
this.distance = distance;
}
@@ -149,7 +148,7 @@ public class RemoteQueueBindingImpl implements RemoteQueueBinding {
}
@Override
- public synchronized boolean isHighAcceptPriority(final ServerMessage message) {
+ public synchronized boolean isHighAcceptPriority(final Message message) {
if (consumerCount == 0) {
return false;
}
@@ -172,7 +171,7 @@ public class RemoteQueueBindingImpl implements RemoteQueueBinding {
}
@Override
- public void route(final ServerMessage message, final RoutingContext context) {
+ public void route(final Message message, final RoutingContext context) {
addRouteContextToMessage(message);
List<Queue> durableQueuesOnContext = context.getDurableQueues(storeAndForwardQueue.getAddress());
@@ -185,7 +184,7 @@ public class RemoteQueueBindingImpl implements RemoteQueueBinding {
}
@Override
- public void routeWithAck(ServerMessage message, RoutingContext context) {
+ public void routeWithAck(Message message, RoutingContext context) {
addRouteContextToMessage(message);
List<Queue> durableQueuesOnContext = context.getDurableQueues(storeAndForwardQueue.getAddress());
@@ -315,7 +314,7 @@ public class RemoteQueueBindingImpl implements RemoteQueueBinding {
*
* @param message
*/
- private void addRouteContextToMessage(final ServerMessage message) {
+ private void addRouteContextToMessage(final Message message) {
byte[] ids = message.getBytesProperty(idsHeaderName);
if (ids == null) {
[16/17] activemq-artemis git commit: ARTEMIS-1009 Pure Message
Encoding.
Posted by cl...@apache.org.
ARTEMIS-1009 Pure Message Encoding.
with this we could send and receive message in their raw format,
without requiring conversions to Core.
- MessageImpl and ServerMessage are removed as part of this
- AMQPMessage and CoreMessage will have the specialized message format for each protocol
- The protocol manager is now responsible to send the message
- The message will provide an encoder for journal and paging
Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/4894015d
Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/4894015d
Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/4894015d
Branch: refs/heads/artemis-1009
Commit: 4894015d92261af112c6396ec83d966158a3a153
Parents: 503b112
Author: Clebert Suconic <cl...@apache.org>
Authored: Mon Feb 20 15:55:15 2017 -0500
Committer: Clebert Suconic <cl...@apache.org>
Committed: Sun Mar 5 11:49:42 2017 -0500
----------------------------------------------------------------------
.../artemis/cli/commands/tools/PrintData.java | 7 +
.../cli/commands/tools/XmlDataExporter.java | 44 +-
.../cli/commands/tools/XmlDataExporterUtil.java | 11 +-
.../cli/commands/tools/XmlDataImporter.java | 10 +-
.../org/apache/activemq/artemis/Closeable.java | 22 +
.../artemis/api/core/ActiveMQBuffer.java | 13 +
.../artemis/api/core/ActiveMQBuffers.java | 15 +
.../activemq/artemis/api/core/SimpleString.java | 34 +
.../core/buffers/impl/ChannelBufferWrapper.java | 84 +-
.../artemis/core/persistence/Persister.java | 30 +
.../apache/activemq/artemis/utils/ByteUtil.java | 8 +
.../activemq/artemis/utils/TypedProperties.java | 62 +-
.../apache/activemq/artemis/utils/UTF8Util.java | 36 +-
.../artemis/utils/TypedPropertiesTest.java | 10 +-
.../config/ActiveMQDefaultConfiguration.java | 20 -
.../activemq/artemis/api/core/ICoreMessage.java | 87 ++
.../activemq/artemis/api/core/Message.java | 637 +++++-----
.../artemis/api/core/RefCountMessage.java | 81 ++
.../api/core/RefCountMessageListener.java | 31 +
.../artemis/api/core/client/ClientMessage.java | 69 +-
.../artemis/api/core/encode/BodyType.java | 22 +
.../artemis/api/core/encode/MessageBody.java | 28 +
.../api/core/management/ManagementHelper.java | 18 +-
.../impl/ResetLimitWrappedActiveMQBuffer.java | 24 +-
.../core/client/impl/ClientConsumerImpl.java | 4 +-
.../client/impl/ClientLargeMessageImpl.java | 22 +-
.../core/client/impl/ClientMessageImpl.java | 69 +-
.../core/client/impl/ClientMessageInternal.java | 4 +-
.../core/client/impl/ClientProducerImpl.java | 50 +-
.../CompressedLargeMessageControllerImpl.java | 6 +
.../client/impl/LargeMessageControllerImpl.java | 15 +
.../artemis/core/message/BodyEncoder.java | 55 -
.../artemis/core/message/LargeBodyEncoder.java | 55 +
.../artemis/core/message/impl/CoreMessage.java | 1091 ++++++++++++++++++
.../core/message/impl/CoreMessagePersister.java | 66 ++
.../artemis/core/message/impl/MessageImpl.java | 1059 -----------------
.../core/message/impl/MessageInternal.java | 57 -
.../core/impl/ActiveMQSessionContext.java | 17 +-
.../core/protocol/core/impl/ChannelImpl.java | 1 +
.../core/protocol/core/impl/PacketImpl.java | 30 +-
.../core/impl/RemotingConnectionImpl.java | 1 +
.../core/impl/wireformat/MessagePacket.java | 21 +-
.../SessionReceiveClientLargeMessage.java | 5 +-
.../wireformat/SessionReceiveLargeMessage.java | 14 +-
.../impl/wireformat/SessionReceiveMessage.java | 60 +-
.../SessionSendContinuationMessage.java | 8 +-
.../wireformat/SessionSendLargeMessage.java | 12 +-
.../impl/wireformat/SessionSendMessage.java | 54 +-
.../activemq/artemis/reader/MapMessageUtil.java | 4 +-
.../spi/core/remoting/SessionContext.java | 14 +-
.../artemis/message/CoreMessageTest.java | 365 ++++++
.../jdbc/store/journal/JDBCJournalImpl.java | 36 +-
.../jdbc/store/journal/JDBCJournalRecord.java | 7 +-
.../api/jms/management/JMSManagementHelper.java | 3 +-
.../jms/client/ActiveMQBytesMessage.java | 4 +-
.../artemis/jms/client/ActiveMQMessage.java | 8 +-
.../jms/transaction/JMSTransactionDetail.java | 12 +-
.../artemis/core/journal/EncoderPersister.java | 51 +
.../activemq/artemis/core/journal/Journal.java | 55 +-
.../journal/impl/AbstractJournalUpdateTask.java | 3 +-
.../core/journal/impl/FileWrapperJournal.java | 26 +-
.../artemis/core/journal/impl/JournalBase.java | 63 +-
.../core/journal/impl/JournalCompactor.java | 9 +-
.../artemis/core/journal/impl/JournalImpl.java | 62 +-
.../impl/dataformat/JournalAddRecord.java | 20 +-
.../impl/dataformat/JournalAddRecordTX.java | 17 +-
.../protocol/amqp/broker/AMQPMessage.java | 846 ++++++++++++++
.../amqp/broker/AMQPMessagePersister.java | 75 ++
.../amqp/broker/AMQPSessionCallback.java | 44 +-
.../amqp/broker/ProtonProtocolManager.java | 12 +-
.../broker/ProtonProtocolManagerFactory.java | 14 +
.../amqp/converter/AMQPContentTypeSupport.java | 146 +++
.../protocol/amqp/converter/AMQPConverter.java | 44 +
.../amqp/converter/AMQPMessageIdHelper.java | 252 ++++
.../amqp/converter/AMQPMessageSupport.java | 308 +++++
.../amqp/converter/AmqpCoreConverter.java | 351 ++++++
.../amqp/converter/CoreAmqpConverter.java | 461 ++++++++
.../amqp/converter/ProtonMessageConverter.java | 101 --
.../converter/jms/ServerJMSBytesMessage.java | 10 +-
.../amqp/converter/jms/ServerJMSMapMessage.java | 6 +-
.../amqp/converter/jms/ServerJMSMessage.java | 71 +-
.../converter/jms/ServerJMSObjectMessage.java | 9 +-
.../converter/jms/ServerJMSStreamMessage.java | 8 +-
.../converter/jms/ServerJMSTextMessage.java | 6 +-
.../message/AMQPContentTypeSupport.java | 146 ---
.../converter/message/AMQPMessageIdHelper.java | 252 ----
.../converter/message/AMQPMessageSupport.java | 276 -----
.../converter/message/AMQPMessageTypes.java | 30 -
.../message/AMQPNativeInboundTransformer.java | 44 -
.../message/AMQPNativeOutboundTransformer.java | 80 --
.../message/AMQPRawInboundTransformer.java | 62 -
.../amqp/converter/message/EncodedMessage.java | 67 --
.../converter/message/InboundTransformer.java | 243 ----
.../message/JMSMappingInboundTransformer.java | 196 ----
.../message/JMSMappingOutboundTransformer.java | 592 ----------
.../converter/message/OutboundTransformer.java | 53 -
.../amqp/proton/AMQPConnectionContext.java | 4 +
.../proton/ProtonServerReceiverContext.java | 39 +-
.../amqp/proton/ProtonServerSenderContext.java | 30 +-
.../amqp/proton/ProtonTransactionHandler.java | 3 +-
.../amqp/proton/handler/ProtonHandler.java | 2 +-
.../protocol/amqp/util/NettyReadable.java | 139 +++
.../artemis/protocol/amqp/util/TLSEncode.java | 52 +
.../amqp/converter/TestConversions.java | 619 +---------
.../message/AMQPContentTypeSupportTest.java | 10 +-
.../message/AMQPMessageIdHelperTest.java | 11 +-
.../message/AMQPMessageSupportTest.java | 11 +-
.../JMSMappingInboundTransformerTest.java | 234 +---
.../JMSMappingOutboundTransformerTest.java | 387 +------
.../JMSTransformationSpeedComparisonTest.java | 94 +-
.../message/MessageTransformationTest.java | 150 +--
.../protocol/amqp/message/AMQPMessageTest.java | 63 +
.../core/protocol/mqtt/MQTTProtocolManager.java | 6 -
.../core/protocol/mqtt/MQTTPublishManager.java | 32 +-
.../protocol/mqtt/MQTTRetainMessageManager.java | 8 +-
.../core/protocol/mqtt/MQTTSessionCallback.java | 12 +-
.../artemis/core/protocol/mqtt/MQTTUtil.java | 20 +-
.../openwire/OpenWireMessageConverter.java | 35 +-
.../openwire/OpenWireProtocolManager.java | 8 +-
.../core/protocol/openwire/OpenwireMessage.java | 504 ++++++++
.../core/protocol/openwire/amq/AMQConsumer.java | 9 +-
.../core/protocol/openwire/amq/AMQSession.java | 14 +-
.../protocol/openwire/util/OpenWireUtil.java | 12 +-
.../ActiveMQStompProtocolMessageBundle.java | 3 +-
.../core/protocol/stomp/StompConnection.java | 17 +-
.../protocol/stomp/StompProtocolManager.java | 14 +-
.../core/protocol/stomp/StompSession.java | 51 +-
.../artemis/core/protocol/stomp/StompUtils.java | 6 +-
.../stomp/VersionedStompFrameHandler.java | 23 +-
.../stomp/v12/StompFrameHandlerV12.java | 8 +-
.../artemis/core/config/Configuration.java | 8 -
.../core/config/impl/ConfigurationImpl.java | 32 -
.../deployers/impl/FileConfigurationParser.java | 4 -
.../activemq/artemis/core/filter/Filter.java | 4 +-
.../artemis/core/filter/impl/FilterImpl.java | 19 +-
.../management/impl/AddressControlImpl.java | 6 +-
.../core/management/impl/QueueControlImpl.java | 10 +-
.../impl/openmbean/OpenTypeSupport.java | 21 +-
.../artemis/core/paging/PagedMessage.java | 4 +-
.../artemis/core/paging/PagingStore.java | 7 +-
.../core/paging/cursor/PagedReferenceImpl.java | 16 +-
.../cursor/impl/PageSubscriptionImpl.java | 4 +-
.../activemq/artemis/core/paging/impl/Page.java | 5 +-
.../core/paging/impl/PagedMessageImpl.java | 67 +-
.../core/paging/impl/PagingStoreImpl.java | 51 +-
.../core/persistence/StorageManager.java | 16 +-
.../journal/AbstractJournalStorageManager.java | 60 +-
.../impl/journal/AddMessageRecord.java | 8 +-
.../impl/journal/DescribeJournal.java | 17 +-
.../impl/journal/JournalRecordIds.java | 3 +
.../impl/journal/JournalStorageManager.java | 14 +-
.../journal/LargeMessageTXFailureCallback.java | 6 +-
.../impl/journal/LargeServerMessageImpl.java | 115 +-
.../journal/LargeServerMessagePersister.java | 73 ++
.../journal/codec/LargeMessageEncoding.java | 55 -
.../journal/codec/LargeMessagePersister.java | 62 +
.../nullpm/NullStorageLargeServerMessage.java | 16 +-
.../impl/nullpm/NullStorageManager.java | 15 +-
.../artemis/core/postoffice/Binding.java | 9 +-
.../artemis/core/postoffice/Bindings.java | 6 +-
.../artemis/core/postoffice/PostOffice.java | 18 +-
.../core/postoffice/impl/BindingsImpl.java | 26 +-
.../core/postoffice/impl/DivertBinding.java | 8 +-
.../core/postoffice/impl/LocalQueueBinding.java | 8 +-
.../core/postoffice/impl/PostOfficeImpl.java | 121 +-
.../core/protocol/ServerPacketDecoder.java | 6 +-
.../core/ServerSessionPacketHandler.java | 83 +-
.../core/impl/ActiveMQPacketHandler.java | 2 +-
.../protocol/core/impl/CoreProtocolManager.java | 13 +-
.../core/impl/CoreProtocolManagerFactory.java | 14 +
.../protocol/core/impl/CoreSessionCallback.java | 9 +-
.../impl/wireformat/ReplicationAddMessage.java | 14 +-
.../wireformat/ReplicationAddTXMessage.java | 14 +-
.../wireformat/ReplicationPageWriteMessage.java | 2 +-
.../core/remoting/server/RemotingService.java | 4 +
.../server/impl/RemotingServiceImpl.java | 11 +-
.../core/replication/ReplicatedJournal.java | 52 +-
.../core/replication/ReplicationEndpoint.java | 7 +-
.../core/replication/ReplicationManager.java | 11 +-
.../core/server/ActiveMQServerLogger.java | 8 +-
.../activemq/artemis/core/server/Bindable.java | 6 +-
.../artemis/core/server/LargeServerMessage.java | 3 +-
.../artemis/core/server/MessageReference.java | 10 +-
.../activemq/artemis/core/server/Queue.java | 3 +-
.../artemis/core/server/ServerMessage.java | 78 --
.../artemis/core/server/ServerSession.java | 23 +-
.../core/server/cluster/Transformer.java | 4 +-
.../core/server/cluster/impl/BridgeImpl.java | 15 +-
.../cluster/impl/ClusterConnectionBridge.java | 13 +-
.../core/server/cluster/impl/Redistributor.java | 3 +-
.../cluster/impl/RemoteQueueBindingImpl.java | 13 +-
.../core/server/impl/ActiveMQServerImpl.java | 2 +-
.../artemis/core/server/impl/DivertImpl.java | 9 +-
.../artemis/core/server/impl/JournalLoader.java | 6 +-
.../core/server/impl/LastValueQueue.java | 9 +-
.../core/server/impl/MessageReferenceImpl.java | 24 +-
.../server/impl/PostOfficeJournalLoader.java | 7 +-
.../artemis/core/server/impl/QueueImpl.java | 63 +-
.../artemis/core/server/impl/RefsOperation.java | 4 +-
.../core/server/impl/ScaleDownHandler.java | 37 +-
.../core/server/impl/ServerConsumerImpl.java | 30 +-
.../core/server/impl/ServerMessageImpl.java | 341 ------
.../core/server/impl/ServerSessionImpl.java | 144 +--
.../server/management/ManagementService.java | 7 +-
.../management/impl/ManagementServiceImpl.java | 15 +-
.../core/transaction/TransactionDetail.java | 8 +-
.../transaction/impl/CoreTransactionDetail.java | 11 +-
.../spi/core/protocol/MessageConverter.java | 10 +-
.../spi/core/protocol/MessagePersister.java | 88 ++
.../spi/core/protocol/ProtocolManager.java | 12 +-
.../core/protocol/ProtocolManagerFactory.java | 15 +
.../spi/core/protocol/SessionCallback.java | 6 +-
.../resources/schema/artemis-configuration.xsd | 16 -
.../core/config/impl/ConfigurationImplTest.java | 9 -
.../artemis/core/filter/impl/FilterTest.java | 12 +-
.../group/impl/ClusteredResetMockTest.java | 7 +-
.../impl/ScheduledDeliveryHandlerTest.java | 205 ++--
.../transaction/impl/TransactionImplTest.java | 16 +-
.../artemis/tests/util/ActiveMQTestBase.java | 14 +-
.../resources/ConfigurationTest-full-config.xml | 2 -
.../test/resources/artemis-configuration.xsd | 16 -
.../jms/example/HatColourChangeTransformer.java | 4 +-
.../example/AddForwardingTimeTransformer.java | 7 +-
pom.xml | 7 +-
.../PartialPooledByteBufAllocator.java | 5 +
.../amqp/client/util/UnmodifiableDelivery.java | 6 +
.../journal/gcfree/EncodersBench.java | 5 +-
.../byteman/JMSBridgeReconnectionTest.java | 4 +-
.../tests/extras/byteman/MessageCopyTest.java | 163 ---
.../integration/DuplicateDetectionTest.java | 6 +-
.../amqp/AmqpDescribedTypePayloadTest.java | 6 +-
.../integration/amqp/AmqpSendReceiveTest.java | 21 -
.../tests/integration/amqp/ProtonTest.java | 73 +-
.../integration/client/AckBatchSizeTest.java | 14 +-
.../integration/client/AcknowledgeTest.java | 177 ++-
.../tests/integration/client/ConsumerTest.java | 265 ++++-
.../integration/client/HangConsumerTest.java | 7 +-
.../InVMNonPersistentMessageBufferTest.java | 36 +-
.../client/InterruptedLargeMessageTest.java | 10 +-
.../integration/client/LargeMessageTest.java | 5 +-
.../integration/clientcrash/ClientExitTest.java | 4 +-
.../integration/cluster/bridge/BridgeTest.java | 10 +-
.../cluster/bridge/SimpleTransformer.java | 6 +-
.../distribution/ClusterHeadersRemovedTest.java | 5 +-
.../distribution/MessageRedistributionTest.java | 4 +-
.../tests/integration/divert/DivertTest.java | 5 +-
.../interceptors/InterceptorTest.java | 8 +-
.../integration/journal/MessageJournalTest.java | 130 +++
.../journal/NIOJournalCompactTest.java | 6 +-
.../integration/karaf/ContainerBaseTest.java | 64 +
.../tests/integration/karaf/KarafBaseTest.java | 212 ++++
.../karaf/distribution/ArtemisFeatureTest.java | 101 ++
.../karaf/distribution/package-info.java | 21 +
.../karaf/version/ProbeRemoteServer.java | 51 +
.../integration/karaf/version/RemoteTest.java | 38 +
.../karaf/version/VersionWireTest.java | 104 ++
.../integration/karaf/version/package-info.java | 21 +
.../management/ManagementHelperTest.java | 8 +-
.../management/ManagementServiceImplTest.java | 25 +-
.../integration/paging/PagingSendTest.java | 3 +-
.../tests/integration/paging/PagingTest.java | 4 +-
.../DeleteMessagesOnStartupTest.java | 10 +-
.../persistence/ExportFormatTest.java | 28 +-
.../replication/ReplicationTest.java | 71 +-
.../integration/server/FakeStorageManager.java | 6 +-
.../tests/integration/server/ScaleDownTest.java | 4 +-
.../ssl/CoreClientOverOneWaySSLTest.java | 4 +-
.../ssl/CoreClientOverTwoWaySSLTest.java | 5 +-
.../storage/PersistMultiThreadTest.java | 31 +-
.../stress/paging/PageCursorStressTest.java | 24 +-
.../core/server/impl/QueueConcurrentTest.java | 6 +-
tests/unit-tests/pom.xml | 6 +
.../core/journal/impl/JournalImplTestUnit.java | 2 +-
.../unit/core/message/impl/MessageImplTest.java | 14 +-
.../tests/unit/core/paging/impl/PageTest.java | 42 +-
.../core/paging/impl/PagingManagerImplTest.java | 16 +-
.../core/paging/impl/PagingStoreImplTest.java | 58 +-
.../core/postoffice/impl/BindingsImplTest.java | 16 +-
.../unit/core/postoffice/impl/FakeQueue.java | 9 +-
.../impl/WildcardAddressManagerUnitTest.java | 12 +-
.../unit/core/server/impl/QueueImplTest.java | 4 +-
.../unit/core/server/impl/fakes/FakeFilter.java | 7 +-
.../server/impl/fakes/FakeJournalLoader.java | 6 +-
.../core/server/impl/fakes/FakePostOffice.java | 22 +-
.../tests/unit/util/FakePagingManager.java | 7 +-
.../artemis/tests/unit/util/MemorySizeTest.java | 4 +-
.../artemis/tests/unit/util/UTF8Test.java | 10 +-
287 files changed, 9193 insertions(+), 7735 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/PrintData.java
----------------------------------------------------------------------
diff --git a/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/PrintData.java b/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/PrintData.java
index 408aef5..2816aaf 100644
--- a/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/PrintData.java
+++ b/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/PrintData.java
@@ -34,6 +34,7 @@ import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.cli.Artemis;
import org.apache.activemq.artemis.cli.commands.ActionContext;
import org.apache.activemq.artemis.core.journal.RecordInfo;
+import org.apache.activemq.artemis.core.message.impl.CoreMessagePersister;
import org.apache.activemq.artemis.core.paging.PagedMessage;
import org.apache.activemq.artemis.core.paging.PagingManager;
import org.apache.activemq.artemis.core.paging.PagingStore;
@@ -50,16 +51,22 @@ import org.apache.activemq.artemis.core.persistence.impl.journal.JournalRecordId
import org.apache.activemq.artemis.core.persistence.impl.journal.codec.CursorAckRecordEncoding;
import org.apache.activemq.artemis.core.persistence.impl.journal.codec.PageUpdateTXEncoding;
import org.apache.activemq.artemis.core.persistence.impl.nullpm.NullStorageManager;
+import org.apache.activemq.artemis.core.protocol.core.impl.CoreProtocolManagerFactory;
import org.apache.activemq.artemis.core.server.impl.FileLockNodeManager;
import org.apache.activemq.artemis.core.settings.HierarchicalRepository;
import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
import org.apache.activemq.artemis.core.settings.impl.HierarchicalObjectRepository;
+import org.apache.activemq.artemis.spi.core.protocol.MessagePersister;
import org.apache.activemq.artemis.utils.ActiveMQThreadFactory;
import org.apache.activemq.artemis.utils.ExecutorFactory;
@Command(name = "print", description = "Print data records information (WARNING: don't use while a production server is running)")
public class PrintData extends OptionalLocking {
+ static {
+ MessagePersister.registerPersister(CoreProtocolManagerFactory.ID, CoreMessagePersister.getInstance());
+ }
+
@Override
public Object execute(ActionContext context) throws Exception {
super.execute(context);
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/XmlDataExporter.java
----------------------------------------------------------------------
diff --git a/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/XmlDataExporter.java b/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/XmlDataExporter.java
index 4f99181..4638df7 100644
--- a/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/XmlDataExporter.java
+++ b/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/XmlDataExporter.java
@@ -16,6 +16,9 @@
*/
package org.apache.activemq.artemis.cli.commands.tools;
+import javax.xml.stream.XMLOutputFactory;
+import javax.xml.stream.XMLStreamException;
+import javax.xml.stream.XMLStreamWriter;
import java.io.File;
import java.io.OutputStream;
import java.lang.reflect.InvocationHandler;
@@ -33,14 +36,13 @@ import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
-import javax.xml.stream.XMLOutputFactory;
-import javax.xml.stream.XMLStreamException;
-import javax.xml.stream.XMLStreamWriter;
-
+import io.airlift.airline.Command;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
import org.apache.activemq.artemis.api.core.ActiveMQBuffers;
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.api.core.RoutingType;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.cli.commands.ActionContext;
import org.apache.activemq.artemis.core.config.Configuration;
@@ -50,7 +52,7 @@ import org.apache.activemq.artemis.core.journal.PreparedTransactionInfo;
import org.apache.activemq.artemis.core.journal.RecordInfo;
import org.apache.activemq.artemis.core.journal.TransactionFailureCallback;
import org.apache.activemq.artemis.core.journal.impl.JournalImpl;
-import org.apache.activemq.artemis.core.message.BodyEncoder;
+import org.apache.activemq.artemis.core.message.LargeBodyEncoder;
import org.apache.activemq.artemis.core.paging.PagedMessage;
import org.apache.activemq.artemis.core.paging.PagingManager;
import org.apache.activemq.artemis.core.paging.PagingStore;
@@ -74,8 +76,6 @@ import org.apache.activemq.artemis.core.persistence.impl.journal.codec.Persisten
import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
import org.apache.activemq.artemis.core.server.JournalType;
import org.apache.activemq.artemis.core.server.LargeServerMessage;
-import org.apache.activemq.artemis.api.core.RoutingType;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.settings.HierarchicalRepository;
import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
import org.apache.activemq.artemis.core.settings.impl.HierarchicalObjectRepository;
@@ -83,8 +83,6 @@ import org.apache.activemq.artemis.utils.ActiveMQThreadFactory;
import org.apache.activemq.artemis.utils.ExecutorFactory;
import org.apache.activemq.artemis.utils.OrderedExecutorFactory;
-import io.airlift.airline.Command;
-
@Command(name = "exp", description = "Export all message-data using an XML that could be interpreted by any system.")
public final class XmlDataExporter extends OptionalLocking {
@@ -220,7 +218,9 @@ public final class XmlDataExporter extends OptionalLocking {
Object o = DescribeJournal.newObjectEncoding(info, storageManager);
if (info.getUserRecordType() == JournalRecordIds.ADD_MESSAGE) {
- messages.put(info.id, ((MessageDescribe) o).getMsg());
+ messages.put(info.id, ((MessageDescribe) o).getMsg().toCore());
+ } else if (info.getUserRecordType() == JournalRecordIds.ADD_MESSAGE_PROTOCOL) {
+ messages.put(info.id, ((MessageDescribe) o).getMsg().toCore());
} else if (info.getUserRecordType() == JournalRecordIds.ADD_LARGE_MESSAGE) {
messages.put(info.id, ((MessageDescribe) o).getMsg());
} else if (info.getUserRecordType() == JournalRecordIds.ADD_REF) {
@@ -361,13 +361,13 @@ public final class XmlDataExporter extends OptionalLocking {
xmlWriter.writeEndElement(); // end BINDINGS_PARENT
}
- private void printAllMessagesAsXML() throws XMLStreamException {
+ private void printAllMessagesAsXML() throws Exception {
xmlWriter.writeStartElement(XmlDataConstants.MESSAGES_PARENT);
// Order here is important. We must process the messages from the journal before we process those from the page
// files in order to get the messages in the right order.
for (Map.Entry<Long, Message> messageMapEntry : messages.entrySet()) {
- printSingleMessageAsXML((ServerMessage) messageMapEntry.getValue(), extractQueueNames(messageRefs.get(messageMapEntry.getKey())));
+ printSingleMessageAsXML(messageMapEntry.getValue().toCore(), extractQueueNames(messageRefs.get(messageMapEntry.getKey())));
}
printPagedMessagesAsXML();
@@ -381,6 +381,8 @@ public final class XmlDataExporter extends OptionalLocking {
*/
private void printPagedMessagesAsXML() {
try {
+
+ // TODO-now: fix encodings
ScheduledExecutorService scheduled = Executors.newScheduledThreadPool(1, ActiveMQThreadFactory.defaultThreadFactory());
final ExecutorService executor = Executors.newFixedThreadPool(10, ActiveMQThreadFactory.defaultThreadFactory());
ExecutorFactory executorFactory = new ExecutorFactory() {
@@ -439,7 +441,7 @@ public final class XmlDataExporter extends OptionalLocking {
}
if (queueNames.size() > 0 && (message.getTransactionID() == -1 || pgTXs.contains(message.getTransactionID()))) {
- printSingleMessageAsXML(message.getMessage(), queueNames);
+ printSingleMessageAsXML(message.getMessage().toCore(), queueNames);
}
messageId++;
@@ -456,20 +458,20 @@ public final class XmlDataExporter extends OptionalLocking {
}
}
- private void printSingleMessageAsXML(ServerMessage message, List<String> queues) throws XMLStreamException {
+ private void printSingleMessageAsXML(ICoreMessage message, List<String> queues) throws Exception {
xmlWriter.writeStartElement(XmlDataConstants.MESSAGES_CHILD);
printMessageAttributes(message);
printMessageProperties(message);
printMessageQueues(queues);
- printMessageBody(message);
+ printMessageBody(message.toCore());
xmlWriter.writeEndElement(); // end MESSAGES_CHILD
messagesPrinted++;
}
- private void printMessageBody(ServerMessage message) throws XMLStreamException {
+ private void printMessageBody(Message message) throws Exception {
xmlWriter.writeStartElement(XmlDataConstants.MESSAGE_BODY);
- if (message.isLargeMessage()) {
+ if (message.toCore().isLargeMessage()) {
printLargeMessageBody((LargeServerMessage) message);
} else {
xmlWriter.writeCData(XmlDataExporterUtil.encodeMessageBody(message));
@@ -479,10 +481,10 @@ public final class XmlDataExporter extends OptionalLocking {
private void printLargeMessageBody(LargeServerMessage message) throws XMLStreamException {
xmlWriter.writeAttribute(XmlDataConstants.MESSAGE_IS_LARGE, Boolean.TRUE.toString());
- BodyEncoder encoder = null;
+ LargeBodyEncoder encoder = null;
try {
- encoder = message.getBodyEncoder();
+ encoder = message.toCore().getBodyEncoder();
encoder.open();
long totalBytesWritten = 0;
Long bufferSize;
@@ -522,7 +524,7 @@ public final class XmlDataExporter extends OptionalLocking {
xmlWriter.writeEndElement(); // end QUEUES_PARENT
}
- private void printMessageProperties(ServerMessage message) throws XMLStreamException {
+ private void printMessageProperties(Message message) throws XMLStreamException {
xmlWriter.writeStartElement(XmlDataConstants.PROPERTIES_PARENT);
for (SimpleString key : message.getPropertyNames()) {
Object value = message.getObjectProperty(key);
@@ -539,7 +541,7 @@ public final class XmlDataExporter extends OptionalLocking {
xmlWriter.writeEndElement(); // end PROPERTIES_PARENT
}
- private void printMessageAttributes(ServerMessage message) throws XMLStreamException {
+ private void printMessageAttributes(ICoreMessage message) throws XMLStreamException {
xmlWriter.writeAttribute(XmlDataConstants.MESSAGE_ID, Long.toString(message.getMessageID()));
xmlWriter.writeAttribute(XmlDataConstants.MESSAGE_PRIORITY, Byte.toString(message.getPriority()));
xmlWriter.writeAttribute(XmlDataConstants.MESSAGE_EXPIRATION, Long.toString(message.getExpiration()));
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/XmlDataExporterUtil.java
----------------------------------------------------------------------
diff --git a/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/XmlDataExporterUtil.java b/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/XmlDataExporterUtil.java
index 8ee7678..7711648 100644
--- a/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/XmlDataExporterUtil.java
+++ b/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/XmlDataExporterUtil.java
@@ -17,10 +17,9 @@
package org.apache.activemq.artemis.cli.commands.tools;
import com.google.common.base.Preconditions;
-
+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.server.ServerMessage;
import org.apache.activemq.artemis.utils.Base64;
/**
@@ -92,12 +91,12 @@ public class XmlDataExporterUtil {
* @param message
* @return
*/
- public static String encodeMessageBody(final ServerMessage message) {
+ public static String encodeMessageBody(final Message message) throws Exception {
Preconditions.checkNotNull(message, "ServerMessage can not be null");
- int size = message.getEndOfBodyPosition() - message.getBodyBuffer().readerIndex();
- byte[] buffer = new byte[size];
- message.getBodyBuffer().readBytes(buffer);
+ ActiveMQBuffer byteBuffer = message.toCore().getReadOnlyBodyBuffer();
+ byte[] buffer = new byte[byteBuffer.writerIndex()];
+ byteBuffer.readBytes(buffer);
return XmlDataExporterUtil.encode(buffer);
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/XmlDataImporter.java
----------------------------------------------------------------------
diff --git a/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/XmlDataImporter.java b/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/XmlDataImporter.java
index 8e2bb9f..518d231 100644
--- a/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/XmlDataImporter.java
+++ b/artemis-cli/src/main/java/org/apache/activemq/artemis/cli/commands/tools/XmlDataImporter.java
@@ -45,7 +45,9 @@ import java.util.UUID;
import io.airlift.airline.Command;
import io.airlift.airline.Option;
+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;
import org.apache.activemq.artemis.api.core.TransportConfiguration;
import org.apache.activemq.artemis.api.core.client.ActiveMQClient;
@@ -59,11 +61,9 @@ import org.apache.activemq.artemis.api.core.management.ManagementHelper;
import org.apache.activemq.artemis.api.core.management.ResourceNames;
import org.apache.activemq.artemis.cli.commands.ActionAbstract;
import org.apache.activemq.artemis.cli.commands.ActionContext;
-import org.apache.activemq.artemis.core.message.impl.MessageImpl;
import org.apache.activemq.artemis.core.remoting.impl.netty.NettyConnectorFactory;
import org.apache.activemq.artemis.core.remoting.impl.netty.TransportConstants;
import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
-import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.utils.Base64;
import org.apache.activemq.artemis.utils.ClassloadingUtil;
import org.apache.activemq.artemis.utils.ListUtil;
@@ -298,7 +298,7 @@ public final class XmlDataImporter extends ActionAbstract {
switch (eventType) {
case XMLStreamConstants.START_ELEMENT:
if (XmlDataConstants.MESSAGE_BODY.equals(reader.getLocalName())) {
- processMessageBody(message);
+ processMessageBody(message.toCore());
} else if (XmlDataConstants.PROPERTIES_CHILD.equals(reader.getLocalName())) {
processMessageProperties(message);
} else if (XmlDataConstants.QUEUES_CHILD.equals(reader.getLocalName())) {
@@ -387,7 +387,7 @@ public final class XmlDataImporter extends ActionAbstract {
logger.debug(logMessage);
}
- message.putBytesProperty(MessageImpl.HDR_ROUTE_TO_IDS, buffer.array());
+ message.putBytesProperty(Message.HDR_ROUTE_TO_IDS, buffer.array());
try (ClientProducer producer = session.createProducer(destination)) {
producer.send(message);
}
@@ -469,7 +469,7 @@ public final class XmlDataImporter extends ActionAbstract {
}
}
- private void processMessageBody(final Message message) throws XMLStreamException, IOException {
+ private void processMessageBody(final ICoreMessage message) throws XMLStreamException, IOException {
boolean isLarge = false;
for (int i = 0; i < reader.getAttributeCount(); i++) {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-commons/src/main/java/org/apache/activemq/artemis/Closeable.java
----------------------------------------------------------------------
diff --git a/artemis-commons/src/main/java/org/apache/activemq/artemis/Closeable.java b/artemis-commons/src/main/java/org/apache/activemq/artemis/Closeable.java
new file mode 100644
index 0000000..2f00c5d
--- /dev/null
+++ b/artemis-commons/src/main/java/org/apache/activemq/artemis/Closeable.java
@@ -0,0 +1,22 @@
+/**
+ * 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;
+
+public interface Closeable {
+ void close(boolean failed);
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/ActiveMQBuffer.java
----------------------------------------------------------------------
diff --git a/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/ActiveMQBuffer.java b/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/ActiveMQBuffer.java
index 5446f3f..3a208a6 100644
--- a/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/ActiveMQBuffer.java
+++ b/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/ActiveMQBuffer.java
@@ -1065,6 +1065,19 @@ public interface ActiveMQBuffer extends DataInput {
*/
void writeBytes(ByteBuffer src);
+
+ /**
+ * Transfers the specified source buffer's data to this buffer starting at
+ * the current {@code writerIndex} until the source buffer's position
+ * reaches its limit, and increases the {@code writerIndex} by the
+ * number of the transferred bytes.
+ *
+ * @param src The source buffer
+ * @throws IndexOutOfBoundsException if {@code src.remaining()} is greater than
+ * {@code this.writableBytes}
+ */
+ void writeBytes(ByteBuf src, int srcIndex, int length);
+
/**
* Returns a copy of this buffer's readable bytes. Modifying the content
* of the returned buffer or this buffer does not affect each other at all.
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/ActiveMQBuffers.java
----------------------------------------------------------------------
diff --git a/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/ActiveMQBuffers.java b/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/ActiveMQBuffers.java
index 32f9279..25fcfea 100644
--- a/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/ActiveMQBuffers.java
+++ b/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/ActiveMQBuffers.java
@@ -18,6 +18,7 @@ package org.apache.activemq.artemis.api.core;
import java.nio.ByteBuffer;
+import io.netty.buffer.ByteBuf;
import io.netty.buffer.PooledByteBufAllocator;
import io.netty.buffer.Unpooled;
import org.apache.activemq.artemis.core.buffers.impl.ChannelBufferWrapper;
@@ -76,6 +77,20 @@ public final class ActiveMQBuffers {
}
/**
+ * Creates an ActiveMQBuffer wrapping an underlying ByteBuf
+ *
+ * The position on this buffer won't affect the position on the inner buffer
+ *
+ * @param underlying the underlying NIO ByteBuffer
+ * @return an ActiveMQBuffer wrapping the underlying NIO ByteBuffer
+ */
+ public static ActiveMQBuffer wrappedBuffer(final ByteBuf underlying) {
+ ActiveMQBuffer buff = new ChannelBufferWrapper(underlying.duplicate());
+
+ return buff;
+ }
+
+ /**
* Creates an ActiveMQBuffer wrapping an underlying byte array
*
* @param underlying the underlying byte array
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/SimpleString.java
----------------------------------------------------------------------
diff --git a/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/SimpleString.java b/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/SimpleString.java
index b7f70c6..e8530e6 100644
--- a/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/SimpleString.java
+++ b/artemis-commons/src/main/java/org/apache/activemq/artemis/api/core/SimpleString.java
@@ -20,6 +20,7 @@ import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
+import io.netty.buffer.ByteBuf;
import org.apache.activemq.artemis.utils.DataConstants;
/**
@@ -134,6 +135,39 @@ public final class SimpleString implements CharSequence, Serializable, Comparabl
}
+ public static SimpleString readNullableSimpleString(ByteBuf buffer) {
+ int b = buffer.readByte();
+ if (b == DataConstants.NULL) {
+ return null;
+ }
+ return readSimpleString(buffer);
+ }
+
+
+ public static SimpleString readSimpleString(ByteBuf buffer) {
+ int len = buffer.readInt();
+ byte[] data = new byte[len];
+ buffer.readBytes(data);
+ return new SimpleString(data);
+ }
+
+ public static void writeNullableSimpleString(ByteBuf buffer, SimpleString val) {
+ if (val == null) {
+ buffer.writeByte(DataConstants.NULL);
+ } else {
+ buffer.writeByte(DataConstants.NOT_NULL);
+ writeSimpleString(buffer, val);
+ }
+ }
+
+ public static void writeSimpleString(ByteBuf buffer, SimpleString val) {
+ byte[] data = val.getData();
+ buffer.writeInt(data.length);
+ buffer.writeBytes(data);
+ }
+
+
+
public SimpleString subSeq(final int start, final int end) {
int len = data.length >> 1;
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-commons/src/main/java/org/apache/activemq/artemis/core/buffers/impl/ChannelBufferWrapper.java
----------------------------------------------------------------------
diff --git a/artemis-commons/src/main/java/org/apache/activemq/artemis/core/buffers/impl/ChannelBufferWrapper.java b/artemis-commons/src/main/java/org/apache/activemq/artemis/core/buffers/impl/ChannelBufferWrapper.java
index 690dbd7..92314e2 100644
--- a/artemis-commons/src/main/java/org/apache/activemq/artemis/core/buffers/impl/ChannelBufferWrapper.java
+++ b/artemis-commons/src/main/java/org/apache/activemq/artemis/core/buffers/impl/ChannelBufferWrapper.java
@@ -66,11 +66,7 @@ public class ChannelBufferWrapper implements ActiveMQBuffer {
@Override
public SimpleString readNullableSimpleString() {
- int b = buffer.readByte();
- if (b == DataConstants.NULL) {
- return null;
- }
- return readSimpleStringInternal();
+ return SimpleString.readNullableSimpleString(buffer);
}
@Override
@@ -84,14 +80,7 @@ public class ChannelBufferWrapper implements ActiveMQBuffer {
@Override
public SimpleString readSimpleString() {
- return readSimpleStringInternal();
- }
-
- private SimpleString readSimpleStringInternal() {
- int len = buffer.readInt();
- byte[] data = new byte[len];
- buffer.readBytes(data);
- return new SimpleString(data);
+ return SimpleString.readSimpleString(buffer);
}
@Override
@@ -111,11 +100,22 @@ public class ChannelBufferWrapper implements ActiveMQBuffer {
} else if (len < 0xfff) {
return readUTF();
} else {
- return readSimpleStringInternal().toString();
+ return SimpleString.readSimpleString(buffer).toString();
+
}
}
@Override
+ public void writeNullableString(String val) {
+ UTF8Util.writeNullableString(buffer, val);
+ }
+
+ @Override
+ public void writeUTF(String utf) {
+ UTF8Util.saveUTF(buffer, utf);
+ }
+
+ @Override
public String readUTF() {
return UTF8Util.readUTF(this);
}
@@ -127,62 +127,17 @@ public class ChannelBufferWrapper implements ActiveMQBuffer {
@Override
public void writeNullableSimpleString(final SimpleString val) {
- if (val == null) {
- buffer.writeByte(DataConstants.NULL);
- } else {
- buffer.writeByte(DataConstants.NOT_NULL);
- writeSimpleStringInternal(val);
- }
- }
-
- @Override
- public void writeNullableString(final String val) {
- if (val == null) {
- buffer.writeByte(DataConstants.NULL);
- } else {
- buffer.writeByte(DataConstants.NOT_NULL);
- writeStringInternal(val);
- }
+ SimpleString.writeNullableSimpleString(buffer, val);
}
@Override
public void writeSimpleString(final SimpleString val) {
- writeSimpleStringInternal(val);
- }
-
- private void writeSimpleStringInternal(final SimpleString val) {
- byte[] data = val.getData();
- buffer.writeInt(data.length);
- buffer.writeBytes(data);
+ SimpleString.writeSimpleString(buffer, val);
}
@Override
public void writeString(final String val) {
- writeStringInternal(val);
- }
-
- private void writeStringInternal(final String val) {
- int length = val.length();
-
- buffer.writeInt(length);
-
- if (length < 9) {
- // If very small it's more performant to store char by char
- for (int i = 0; i < val.length(); i++) {
- buffer.writeShort((short) val.charAt(i));
- }
- } else if (length < 0xfff) {
- // Store as UTF - this is quicker than char by char for most strings
- writeUTF(val);
- } else {
- // Store as SimpleString, since can't store utf > 0xffff in length
- writeSimpleStringInternal(new SimpleString(val));
- }
- }
-
- @Override
- public void writeUTF(final String utf) {
- UTF8Util.saveUTF(this, utf);
+ UTF8Util.writeString(buffer, val);
}
@Override
@@ -576,6 +531,11 @@ public class ChannelBufferWrapper implements ActiveMQBuffer {
}
@Override
+ public void writeBytes(ByteBuf src, int srcIndex, int length) {
+ buffer.writeBytes(src, srcIndex, length);
+ }
+
+ @Override
public void writeBytes(final ActiveMQBuffer src, final int srcIndex, final int length) {
buffer.writeBytes(src.byteBuf(), srcIndex, length);
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-commons/src/main/java/org/apache/activemq/artemis/core/persistence/Persister.java
----------------------------------------------------------------------
diff --git a/artemis-commons/src/main/java/org/apache/activemq/artemis/core/persistence/Persister.java b/artemis-commons/src/main/java/org/apache/activemq/artemis/core/persistence/Persister.java
new file mode 100644
index 0000000..fd68a77
--- /dev/null
+++ b/artemis-commons/src/main/java/org/apache/activemq/artemis/core/persistence/Persister.java
@@ -0,0 +1,30 @@
+/**
+ * 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;
+
+import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
+
+public interface Persister<T extends Object> {
+
+ int getEncodeSize(T record);
+
+ void encode(ActiveMQBuffer buffer, T record);
+
+ T decode(ActiveMQBuffer buffer, T record);
+
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/ByteUtil.java
----------------------------------------------------------------------
diff --git a/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/ByteUtil.java b/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/ByteUtil.java
index bee8790..e70891d 100644
--- a/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/ByteUtil.java
+++ b/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/ByteUtil.java
@@ -101,6 +101,14 @@ public class ByteUtil {
}
public static String bytesToHex(byte[] bytes, int groupSize) {
+ if (bytes == null) {
+ return "NULL";
+ }
+
+ if (bytes.length == 0) {
+ return "[]";
+ }
+
char[] hexChars = new char[bytes.length * 2 + numberOfGroups(bytes, groupSize)];
int outPos = 0;
for (int j = 0; j < bytes.length; j++) {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/TypedProperties.java
----------------------------------------------------------------------
diff --git a/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/TypedProperties.java b/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/TypedProperties.java
index 56cec48..fda135b 100644
--- a/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/TypedProperties.java
+++ b/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/TypedProperties.java
@@ -24,7 +24,7 @@ import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
-import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
+import io.netty.buffer.ByteBuf;
import org.apache.activemq.artemis.api.core.ActiveMQPropertyConversionException;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.logs.ActiveMQUtilBundle;
@@ -47,7 +47,6 @@ import static org.apache.activemq.artemis.utils.DataConstants.STRING;
* This implementation follows section 3.5.4 of the <i>Java Message Service</i> specification
* (Version 1.1 April 12, 2002).
* <p>
- * TODO - should have typed property getters and do conversions herein
*/
public final class TypedProperties {
@@ -62,6 +61,13 @@ public final class TypedProperties {
public TypedProperties() {
}
+ /**
+ * Return the number of properites
+ * */
+ public int size() {
+ return properties.size();
+ }
+
public int getMemoryOffset() {
// The estimate is basically the encode size + 2 object references for each entry in the map
// Note we don't include the attributes or anything else since they already included in the memory estimate
@@ -321,7 +327,7 @@ public final class TypedProperties {
}
}
- public synchronized void decode(final ActiveMQBuffer buffer) {
+ public synchronized void decode(final ByteBuf buffer) {
byte b = buffer.readByte();
if (b == DataConstants.NULL) {
@@ -406,7 +412,7 @@ public final class TypedProperties {
}
}
- public synchronized void encode(final ActiveMQBuffer buffer) {
+ public synchronized void encode(final ByteBuf buffer) {
if (properties == null) {
buffer.writeByte(DataConstants.NULL);
} else {
@@ -547,7 +553,7 @@ public final class TypedProperties {
abstract Object getValue();
- abstract void write(ActiveMQBuffer buffer);
+ abstract void write(ByteBuf buffer);
abstract int encodeSize();
@@ -568,7 +574,7 @@ public final class TypedProperties {
}
@Override
- public void write(final ActiveMQBuffer buffer) {
+ public void write(final ByteBuf buffer) {
buffer.writeByte(DataConstants.NULL);
}
@@ -587,7 +593,7 @@ public final class TypedProperties {
this.val = val;
}
- private BooleanValue(final ActiveMQBuffer buffer) {
+ private BooleanValue(final ByteBuf buffer) {
val = buffer.readBoolean();
}
@@ -597,7 +603,7 @@ public final class TypedProperties {
}
@Override
- public void write(final ActiveMQBuffer buffer) {
+ public void write(final ByteBuf buffer) {
buffer.writeByte(DataConstants.BOOLEAN);
buffer.writeBoolean(val);
}
@@ -617,7 +623,7 @@ public final class TypedProperties {
this.val = val;
}
- private ByteValue(final ActiveMQBuffer buffer) {
+ private ByteValue(final ByteBuf buffer) {
val = buffer.readByte();
}
@@ -627,7 +633,7 @@ public final class TypedProperties {
}
@Override
- public void write(final ActiveMQBuffer buffer) {
+ public void write(final ByteBuf buffer) {
buffer.writeByte(DataConstants.BYTE);
buffer.writeByte(val);
}
@@ -646,7 +652,7 @@ public final class TypedProperties {
this.val = val;
}
- private BytesValue(final ActiveMQBuffer buffer) {
+ private BytesValue(final ByteBuf buffer) {
int len = buffer.readInt();
val = new byte[len];
buffer.readBytes(val);
@@ -658,7 +664,7 @@ public final class TypedProperties {
}
@Override
- public void write(final ActiveMQBuffer buffer) {
+ public void write(final ByteBuf buffer) {
buffer.writeByte(DataConstants.BYTES);
buffer.writeInt(val.length);
buffer.writeBytes(val);
@@ -679,7 +685,7 @@ public final class TypedProperties {
this.val = val;
}
- private ShortValue(final ActiveMQBuffer buffer) {
+ private ShortValue(final ByteBuf buffer) {
val = buffer.readShort();
}
@@ -689,7 +695,7 @@ public final class TypedProperties {
}
@Override
- public void write(final ActiveMQBuffer buffer) {
+ public void write(final ByteBuf buffer) {
buffer.writeByte(DataConstants.SHORT);
buffer.writeShort(val);
}
@@ -708,7 +714,7 @@ public final class TypedProperties {
this.val = val;
}
- private IntValue(final ActiveMQBuffer buffer) {
+ private IntValue(final ByteBuf buffer) {
val = buffer.readInt();
}
@@ -718,7 +724,7 @@ public final class TypedProperties {
}
@Override
- public void write(final ActiveMQBuffer buffer) {
+ public void write(final ByteBuf buffer) {
buffer.writeByte(DataConstants.INT);
buffer.writeInt(val);
}
@@ -737,7 +743,7 @@ public final class TypedProperties {
this.val = val;
}
- private LongValue(final ActiveMQBuffer buffer) {
+ private LongValue(final ByteBuf buffer) {
val = buffer.readLong();
}
@@ -747,7 +753,7 @@ public final class TypedProperties {
}
@Override
- public void write(final ActiveMQBuffer buffer) {
+ public void write(final ByteBuf buffer) {
buffer.writeByte(DataConstants.LONG);
buffer.writeLong(val);
}
@@ -766,7 +772,7 @@ public final class TypedProperties {
this.val = val;
}
- private FloatValue(final ActiveMQBuffer buffer) {
+ private FloatValue(final ByteBuf buffer) {
val = Float.intBitsToFloat(buffer.readInt());
}
@@ -776,7 +782,7 @@ public final class TypedProperties {
}
@Override
- public void write(final ActiveMQBuffer buffer) {
+ public void write(final ByteBuf buffer) {
buffer.writeByte(DataConstants.FLOAT);
buffer.writeInt(Float.floatToIntBits(val));
}
@@ -796,7 +802,7 @@ public final class TypedProperties {
this.val = val;
}
- private DoubleValue(final ActiveMQBuffer buffer) {
+ private DoubleValue(final ByteBuf buffer) {
val = Double.longBitsToDouble(buffer.readLong());
}
@@ -806,7 +812,7 @@ public final class TypedProperties {
}
@Override
- public void write(final ActiveMQBuffer buffer) {
+ public void write(final ByteBuf buffer) {
buffer.writeByte(DataConstants.DOUBLE);
buffer.writeLong(Double.doubleToLongBits(val));
}
@@ -825,7 +831,7 @@ public final class TypedProperties {
this.val = val;
}
- private CharValue(final ActiveMQBuffer buffer) {
+ private CharValue(final ByteBuf buffer) {
val = (char) buffer.readShort();
}
@@ -835,7 +841,7 @@ public final class TypedProperties {
}
@Override
- public void write(final ActiveMQBuffer buffer) {
+ public void write(final ByteBuf buffer) {
buffer.writeByte(DataConstants.CHAR);
buffer.writeShort((short) val);
}
@@ -854,8 +860,8 @@ public final class TypedProperties {
this.val = val;
}
- private StringValue(final ActiveMQBuffer buffer) {
- val = buffer.readSimpleString();
+ private StringValue(final ByteBuf buffer) {
+ val = SimpleString.readSimpleString(buffer);
}
@Override
@@ -864,9 +870,9 @@ public final class TypedProperties {
}
@Override
- public void write(final ActiveMQBuffer buffer) {
+ public void write(final ByteBuf buffer) {
buffer.writeByte(DataConstants.STRING);
- buffer.writeSimpleString(val);
+ SimpleString.writeSimpleString(buffer, val);
}
@Override
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/UTF8Util.java
----------------------------------------------------------------------
diff --git a/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/UTF8Util.java b/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/UTF8Util.java
index e75395b..84e1557 100644
--- a/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/UTF8Util.java
+++ b/artemis-commons/src/main/java/org/apache/activemq/artemis/utils/UTF8Util.java
@@ -18,7 +18,9 @@ package org.apache.activemq.artemis.utils;
import java.lang.ref.SoftReference;
+import io.netty.buffer.ByteBuf;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
+import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.logs.ActiveMQUtilBundle;
import org.apache.activemq.artemis.logs.ActiveMQUtilLogger;
@@ -29,15 +31,43 @@ import org.apache.activemq.artemis.logs.ActiveMQUtilLogger;
*/
public final class UTF8Util {
+
+ private static final boolean isTrace = ActiveMQUtilLogger.LOGGER.isTraceEnabled();
+
+ private static final ThreadLocal<SoftReference<StringUtilBuffer>> currenBuffer = new ThreadLocal<>();
+
private UTF8Util() {
// utility class
}
+ public static void writeNullableString(ByteBuf buffer, final String val) {
+ if (val == null) {
+ buffer.writeByte(DataConstants.NULL);
+ } else {
+ buffer.writeByte(DataConstants.NOT_NULL);
+ writeString(buffer, val);
+ }
+ }
- private static final boolean isTrace = ActiveMQUtilLogger.LOGGER.isTraceEnabled();
+ public static void writeString(final ByteBuf buffer, final String val) {
+ int length = val.length();
- private static final ThreadLocal<SoftReference<StringUtilBuffer>> currenBuffer = new ThreadLocal<>();
+ buffer.writeInt(length);
+
+ if (length < 9) {
+ // If very small it's more performant to store char by char
+ for (int i = 0; i < val.length(); i++) {
+ buffer.writeShort((short) val.charAt(i));
+ }
+ } else if (length < 0xfff) {
+ // Store as UTF - this is quicker than char by char for most strings
+ saveUTF(buffer, val);
+ } else {
+ // Store as SimpleString, since can't store utf > 0xffff in length
+ SimpleString.writeSimpleString(buffer, new SimpleString(val));
+ }
+ }
- public static void saveUTF(final ActiveMQBuffer out, final String str) {
+ public static void saveUTF(final ByteBuf out, final String str) {
StringUtilBuffer buffer = UTF8Util.getThreadLocalBuffer();
if (str.length() > 0xffff) {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/TypedPropertiesTest.java
----------------------------------------------------------------------
diff --git a/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/TypedPropertiesTest.java b/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/TypedPropertiesTest.java
index 8013e96..cb6c8fe 100644
--- a/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/TypedPropertiesTest.java
+++ b/artemis-commons/src/test/java/org/apache/activemq/artemis/utils/TypedPropertiesTest.java
@@ -187,12 +187,12 @@ public class TypedPropertiesTest {
props.putSimpleStringProperty(keyToRemove, RandomUtil.randomSimpleString());
ActiveMQBuffer buffer = ActiveMQBuffers.dynamicBuffer(1024);
- props.encode(buffer);
+ props.encode(buffer.byteBuf());
Assert.assertEquals(props.getEncodeSize(), buffer.writerIndex());
TypedProperties decodedProps = new TypedProperties();
- decodedProps.decode(buffer);
+ decodedProps.decode(buffer.byteBuf());
TypedPropertiesTest.assertEqualsTypeProperties(props, decodedProps);
@@ -200,7 +200,7 @@ public class TypedPropertiesTest {
// After removing a property, you should still be able to encode the Property
props.removeProperty(keyToRemove);
- props.encode(buffer);
+ props.encode(buffer.byteBuf());
Assert.assertEquals(props.getEncodeSize(), buffer.writerIndex());
}
@@ -210,12 +210,12 @@ public class TypedPropertiesTest {
TypedProperties emptyProps = new TypedProperties();
ActiveMQBuffer buffer = ActiveMQBuffers.dynamicBuffer(1024);
- emptyProps.encode(buffer);
+ emptyProps.encode(buffer.byteBuf());
Assert.assertEquals(props.getEncodeSize(), buffer.writerIndex());
TypedProperties decodedProps = new TypedProperties();
- decodedProps.decode(buffer);
+ decodedProps.decode(buffer.byteBuf());
TypedPropertiesTest.assertEqualsTypeProperties(emptyProps, decodedProps);
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/config/ActiveMQDefaultConfiguration.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/config/ActiveMQDefaultConfiguration.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/config/ActiveMQDefaultConfiguration.java
index 38ec105..c0d9db6 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/config/ActiveMQDefaultConfiguration.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/config/ActiveMQDefaultConfiguration.java
@@ -262,12 +262,6 @@ public final class ActiveMQDefaultConfiguration {
// The minimal number of data files before we can start compacting
private static int DEFAULT_JOURNAL_COMPACT_MIN_FILES = 10;
- // XXX Only meant to be used by project developers
- private static int DEFAULT_JOURNAL_PERF_BLAST_PAGES = -1;
-
- // XXX Only meant to be used by project developers
- private static boolean DEFAULT_RUN_SYNC_SPEED_TEST = false;
-
// Interval to log server specific information (e.g. memory usage etc)
private static long DEFAULT_SERVER_DUMP_INTERVAL = -1;
@@ -801,20 +795,6 @@ public final class ActiveMQDefaultConfiguration {
}
/**
- * XXX Only meant to be used by project developers
- */
- public static int getDefaultJournalPerfBlastPages() {
- return DEFAULT_JOURNAL_PERF_BLAST_PAGES;
- }
-
- /**
- * XXX Only meant to be used by project developers
- */
- public static boolean isDefaultRunSyncSpeedTest() {
- return DEFAULT_RUN_SYNC_SPEED_TEST;
- }
-
- /**
* Interval to log server specific information (e.g. memory usage etc)
*/
public static long getDefaultServerDumpInterval() {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/ICoreMessage.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/ICoreMessage.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/ICoreMessage.java
new file mode 100644
index 0000000..9a58819
--- /dev/null
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/ICoreMessage.java
@@ -0,0 +1,87 @@
+/**
+ * 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.api.core;
+
+import java.io.InputStream;
+import java.util.Map;
+
+import org.apache.activemq.artemis.core.message.LargeBodyEncoder;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
+
+/**
+ * This interface is only to determine the API of methods required for Core Messages
+ */
+public interface ICoreMessage extends Message {
+
+ LargeBodyEncoder getBodyEncoder() throws ActiveMQException;
+
+ int getHeadersAndPropertiesEncodeSize();
+
+ @Override
+ InputStream getBodyInputStream();
+
+ /** Returns a new Buffer slicing the current Body. */
+ ActiveMQBuffer getReadOnlyBodyBuffer();
+
+ /** Return the type of the message */
+ @Override
+ byte getType();
+
+ /** the type of the message */
+ @Override
+ CoreMessage setType(byte type);
+
+ /**
+ * We are really interested if this is a LargeServerMessage.
+ * @return
+ */
+ boolean isServerMessage();
+
+ /**
+ * The body used for this message.
+ * @return
+ */
+ @Override
+ ActiveMQBuffer getBodyBuffer();
+
+ int getEndOfBodyPosition();
+
+
+ /**
+ * @return Returns the message in Map form, useful when encoding to JSON
+ */
+ @Override
+ default Map<String, Object> toMap() {
+ Map map = toPropertyMap();
+ map.put("messageID", getMessageID());
+ Object userID = getUserID();
+ if (getUserID() != null) {
+ map.put("userID", "ID:" + userID.toString());
+ }
+
+ map.put("address", getAddress());
+ map.put("type", getType());
+ map.put("durable", isDurable());
+ map.put("expiration", getExpiration());
+ map.put("timestamp", getTimestamp());
+ map.put("priority", (int)getPriority());
+
+ return map;
+ }
+
+}
[11/17] activemq-artemis git commit: ARTEMIS-1009 Pure Message
Encoding.
Posted by cl...@apache.org.
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/AmqpCoreConverter.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..030a7a0
--- /dev/null
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/AmqpCoreConverter.java
@@ -0,0 +1,351 @@
+/**
+ * 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.converter;
+
+import javax.jms.DeliveryMode;
+import javax.jms.JMSException;
+import java.nio.ByteBuffer;
+import java.nio.CharBuffer;
+import java.nio.charset.CharacterCodingException;
+import java.nio.charset.Charset;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.PooledByteBufAllocator;
+import org.apache.activemq.artemis.api.core.ICoreMessage;
+import org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessage;
+import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerDestination;
+import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSMessage;
+import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSStreamMessage;
+import org.apache.activemq.artemis.protocol.amqp.util.NettyWritable;
+import org.apache.activemq.artemis.protocol.amqp.util.TLSEncode;
+import org.apache.qpid.proton.amqp.Binary;
+import org.apache.qpid.proton.amqp.Decimal128;
+import org.apache.qpid.proton.amqp.Decimal32;
+import org.apache.qpid.proton.amqp.Decimal64;
+import org.apache.qpid.proton.amqp.Symbol;
+import org.apache.qpid.proton.amqp.UnsignedByte;
+import org.apache.qpid.proton.amqp.UnsignedInteger;
+import org.apache.qpid.proton.amqp.UnsignedLong;
+import org.apache.qpid.proton.amqp.UnsignedShort;
+import org.apache.qpid.proton.amqp.messaging.AmqpSequence;
+import org.apache.qpid.proton.amqp.messaging.AmqpValue;
+import org.apache.qpid.proton.amqp.messaging.ApplicationProperties;
+import org.apache.qpid.proton.amqp.messaging.Data;
+import org.apache.qpid.proton.amqp.messaging.Footer;
+import org.apache.qpid.proton.amqp.messaging.Header;
+import org.apache.qpid.proton.amqp.messaging.MessageAnnotations;
+import org.apache.qpid.proton.amqp.messaging.Properties;
+import org.apache.qpid.proton.amqp.messaging.Section;
+import org.apache.qpid.proton.codec.WritableBuffer;
+
+import static org.apache.activemq.artemis.api.core.Message.HDR_SCHEDULED_DELIVERY_TIME;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.JMS_AMQP_CONTENT_ENCODING;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.JMS_AMQP_CONTENT_TYPE;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.JMS_AMQP_FIRST_ACQUIRER;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.JMS_AMQP_FOOTER_PREFIX;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.JMS_AMQP_HEADER;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.JMS_AMQP_HEADER_DURABLE;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.JMS_AMQP_HEADER_PRIORITY;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.JMS_AMQP_MESSAGE_ANNOTATION_PREFIX;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.JMS_AMQP_REPLYTO_GROUP_ID;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.OCTET_STREAM_CONTENT_TYPE;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.SERIALIZED_JAVA_OBJECT_CONTENT_TYPE;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.createBytesMessage;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.createMapMessage;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.createMessage;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.createObjectMessage;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.createStreamMessage;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.createTextMessage;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.getCharsetForTextualContent;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.isContentType;
+
+/**
+ * This class was created just to separate concerns on AMQPConverter.
+ * For better organization of the code.
+ * */
+public class AmqpCoreConverter {
+
+ public static ICoreMessage toCore(AMQPMessage message) throws Exception {
+
+ Section body = message.getProtonMessage().getBody();
+ ServerJMSMessage result;
+
+ if (body == null) {
+ if (isContentType(SERIALIZED_JAVA_OBJECT_CONTENT_TYPE.toString(), message.getProtonMessage())) {
+ result = createObjectMessage(message.getMessageID());
+ } else if (isContentType(OCTET_STREAM_CONTENT_TYPE, message.getProtonMessage()) || isContentType(null, message.getProtonMessage())) {
+ result = createBytesMessage(message.getMessageID());
+ } else {
+ Charset charset = getCharsetForTextualContent(message.getProtonMessage().getContentType());
+ if (charset != null) {
+ result = createTextMessage(message.getMessageID());
+ } else {
+ result = createMessage(message.getMessageID());
+ }
+ }
+ } else if (body instanceof Data) {
+ Binary payload = ((Data) body).getValue();
+
+ if (isContentType(SERIALIZED_JAVA_OBJECT_CONTENT_TYPE.toString(), message.getProtonMessage())) {
+ result = createObjectMessage(message.getMessageID(), payload.getArray(), payload.getArrayOffset(), payload.getLength());
+ } else if (isContentType(OCTET_STREAM_CONTENT_TYPE, message.getProtonMessage())) {
+ result = createBytesMessage(message.getMessageID(), payload.getArray(), payload.getArrayOffset(), payload.getLength());
+ } else {
+ Charset charset = getCharsetForTextualContent(message.getProtonMessage().getContentType());
+ if (StandardCharsets.UTF_8.equals(charset)) {
+ ByteBuffer buf = ByteBuffer.wrap(payload.getArray(), payload.getArrayOffset(), payload.getLength());
+
+ try {
+ CharBuffer chars = charset.newDecoder().decode(buf);
+ result = createTextMessage(message.getMessageID(), String.valueOf(chars));
+ } catch (CharacterCodingException e) {
+ result = createBytesMessage(message.getMessageID(), payload.getArray(), payload.getArrayOffset(), payload.getLength());
+ }
+ } else {
+ result = createBytesMessage(message.getMessageID(), payload.getArray(), payload.getArrayOffset(), payload.getLength());
+ }
+ }
+
+ } else if (body instanceof AmqpSequence) {
+ AmqpSequence sequence = (AmqpSequence) body;
+ ServerJMSStreamMessage m = createStreamMessage(message.getMessageID());
+ for (Object item : sequence.getValue()) {
+ m.writeObject(item);
+ }
+
+ result = m;
+ } else if (body instanceof AmqpValue) {
+ Object value = ((AmqpValue) body).getValue();
+ if (value == null || value instanceof String) {
+ result = createTextMessage(message.getMessageID(), (String) value);
+
+ } else if (value instanceof Binary) {
+ Binary payload = (Binary) value;
+
+ if (isContentType(SERIALIZED_JAVA_OBJECT_CONTENT_TYPE.toString(), message.getProtonMessage())) {
+ result = createObjectMessage(message.getMessageID(), payload);
+ } else {
+ result = createBytesMessage(message.getMessageID(), payload.getArray(), payload.getArrayOffset(), payload.getLength());
+ }
+
+ } else if (value instanceof List) {
+ ServerJMSStreamMessage m = createStreamMessage(message.getMessageID());
+ for (Object item : (List<Object>) value) {
+ m.writeObject(item);
+ }
+ result = m;
+ } else if (value instanceof Map) {
+ result = createMapMessage(message.getMessageID(), (Map<String, Object>) value);
+ } else {
+ ByteBuf buf = PooledByteBufAllocator.DEFAULT.heapBuffer(1024);
+ try {
+ TLSEncode.getEncoder().setByteBuffer(new NettyWritable(buf));
+ TLSEncode.getEncoder().writeObject(body);
+ result = createBytesMessage(message.getMessageID(), buf.array(), 0, buf.writerIndex());
+ } finally {
+ buf.release();
+ TLSEncode.getEncoder().setByteBuffer((WritableBuffer)null);
+ }
+ }
+ } else {
+ throw new RuntimeException("Unexpected body type: " + body.getClass());
+ }
+
+ populateMessage(result, message.getProtonMessage());
+ result.getInnerMessage().setReplyTo(message.getReplyTo());
+
+ result.encode();
+
+ return result != null ? result.getInnerMessage() : null;
+ }
+
+ protected static ServerJMSMessage populateMessage(ServerJMSMessage jms, org.apache.qpid.proton.message.Message amqp) throws Exception {
+ Header header = amqp.getHeader();
+ if (header != null) {
+ jms.setBooleanProperty(JMS_AMQP_HEADER, true);
+
+ if (header.getDurable() != null) {
+ jms.setBooleanProperty(JMS_AMQP_HEADER_DURABLE, true);
+ jms.setJMSDeliveryMode(header.getDurable().booleanValue() ? DeliveryMode.PERSISTENT : DeliveryMode.NON_PERSISTENT);
+ } else {
+ jms.setJMSDeliveryMode(DeliveryMode.NON_PERSISTENT);
+ }
+
+ if (header.getPriority() != null) {
+ jms.setBooleanProperty(JMS_AMQP_HEADER_PRIORITY, true);
+ jms.setJMSPriority(header.getPriority().intValue());
+ } else {
+ jms.setJMSPriority(javax.jms.Message.DEFAULT_PRIORITY);
+ }
+
+ if (header.getFirstAcquirer() != null) {
+ jms.setBooleanProperty(JMS_AMQP_FIRST_ACQUIRER, header.getFirstAcquirer());
+ }
+
+ if (header.getDeliveryCount() != null) {
+ // AMQP Delivery Count counts only failed delivers where JMS
+ // Delivery Count should include the original delivery in the count.
+ jms.setLongProperty("JMSXDeliveryCount", header.getDeliveryCount().longValue() + 1);
+ }
+ } else {
+ jms.setJMSPriority((byte) javax.jms.Message.DEFAULT_PRIORITY);
+ jms.setJMSDeliveryMode(DeliveryMode.NON_PERSISTENT);
+ }
+
+ final MessageAnnotations ma = amqp.getMessageAnnotations();
+ if (ma != null) {
+ for (Map.Entry<?, ?> entry : ma.getValue().entrySet()) {
+ String key = entry.getKey().toString();
+ if ("x-opt-delivery-time".equals(key) && entry.getValue() != null) {
+ long deliveryTime = ((Number) entry.getValue()).longValue();
+ jms.setLongProperty(HDR_SCHEDULED_DELIVERY_TIME.toString(), deliveryTime);
+ } else if ("x-opt-delivery-delay".equals(key) && entry.getValue() != null) {
+ long delay = ((Number) entry.getValue()).longValue();
+ if (delay > 0) {
+ jms.setLongProperty(HDR_SCHEDULED_DELIVERY_TIME.toString(), System.currentTimeMillis() + delay);
+ }
+ }
+
+ setProperty(jms, JMS_AMQP_MESSAGE_ANNOTATION_PREFIX + key, entry.getValue());
+ }
+ }
+
+ final ApplicationProperties ap = amqp.getApplicationProperties();
+ if (ap != null) {
+ for (Map.Entry<Object, Object> entry : (Set<Map.Entry<Object, Object>>) ap.getValue().entrySet()) {
+ setProperty(jms, entry.getKey().toString(), entry.getValue());
+ }
+ }
+
+ final Properties properties = amqp.getProperties();
+ if (properties != null) {
+ if (properties.getMessageId() != null) {
+ jms.setJMSMessageID(AMQPMessageIdHelper.INSTANCE.toBaseMessageIdString(properties.getMessageId()));
+ }
+ Binary userId = properties.getUserId();
+ if (userId != null) {
+ // TODO - Better Way to set this?
+ jms.setStringProperty("JMSXUserID", new String(userId.getArray(), userId.getArrayOffset(), userId.getLength(), StandardCharsets.UTF_8));
+ }
+ if (properties.getTo() != null) {
+ jms.setJMSDestination(new ServerDestination(properties.getTo()));
+ }
+ if (properties.getSubject() != null) {
+ jms.setJMSType(properties.getSubject());
+ }
+ if (properties.getReplyTo() != null) {
+ jms.setJMSReplyTo(new ServerDestination(properties.getReplyTo()));
+ }
+ if (properties.getCorrelationId() != null) {
+ jms.setJMSCorrelationID(AMQPMessageIdHelper.INSTANCE.toBaseMessageIdString(properties.getCorrelationId()));
+ }
+ if (properties.getContentType() != null) {
+ jms.setStringProperty(JMS_AMQP_CONTENT_TYPE, properties.getContentType().toString());
+ }
+ if (properties.getContentEncoding() != null) {
+ jms.setStringProperty(JMS_AMQP_CONTENT_ENCODING, properties.getContentEncoding().toString());
+ }
+ if (properties.getCreationTime() != null) {
+ jms.setJMSTimestamp(properties.getCreationTime().getTime());
+ }
+ if (properties.getGroupId() != null) {
+ jms.setStringProperty("_AMQ_GROUP_ID", properties.getGroupId());
+ }
+ if (properties.getGroupSequence() != null) {
+ jms.setIntProperty("JMSXGroupSeq", properties.getGroupSequence().intValue());
+ }
+ if (properties.getReplyToGroupId() != null) {
+ jms.setStringProperty(JMS_AMQP_REPLYTO_GROUP_ID, properties.getReplyToGroupId());
+ }
+ if (properties.getAbsoluteExpiryTime() != null) {
+ jms.setJMSExpiration(properties.getAbsoluteExpiryTime().getTime());
+ }
+ }
+
+ // If the jms expiration has not yet been set...
+ if (header != null && jms.getJMSExpiration() == 0) {
+ // Then lets try to set it based on the message ttl.
+ long ttl = javax.jms.Message.DEFAULT_TIME_TO_LIVE;
+ if (header.getTtl() != null) {
+ ttl = header.getTtl().longValue();
+ }
+
+ if (ttl == 0) {
+ jms.setJMSExpiration(0);
+ } else {
+ jms.setJMSExpiration(System.currentTimeMillis() + ttl);
+ }
+ }
+
+ final Footer fp = amqp.getFooter();
+ if (fp != null) {
+ for (Map.Entry<Object, Object> entry : (Set<Map.Entry<Object, Object>>) fp.getValue().entrySet()) {
+ String key = entry.getKey().toString();
+ setProperty(jms, JMS_AMQP_FOOTER_PREFIX + key, entry.getValue());
+ }
+ }
+
+ return jms;
+ }
+
+ private static void setProperty(javax.jms.Message msg, String key, Object value) throws JMSException {
+ if (value instanceof UnsignedLong) {
+ long v = ((UnsignedLong) value).longValue();
+ msg.setLongProperty(key, v);
+ } else if (value instanceof UnsignedInteger) {
+ long v = ((UnsignedInteger) value).longValue();
+ if (Integer.MIN_VALUE <= v && v <= Integer.MAX_VALUE) {
+ msg.setIntProperty(key, (int) v);
+ } else {
+ msg.setLongProperty(key, v);
+ }
+ } else if (value instanceof UnsignedShort) {
+ int v = ((UnsignedShort) value).intValue();
+ if (Short.MIN_VALUE <= v && v <= Short.MAX_VALUE) {
+ msg.setShortProperty(key, (short) v);
+ } else {
+ msg.setIntProperty(key, v);
+ }
+ } else if (value instanceof UnsignedByte) {
+ short v = ((UnsignedByte) value).shortValue();
+ if (Byte.MIN_VALUE <= v && v <= Byte.MAX_VALUE) {
+ msg.setByteProperty(key, (byte) v);
+ } else {
+ msg.setShortProperty(key, v);
+ }
+ } else if (value instanceof Symbol) {
+ msg.setStringProperty(key, value.toString());
+ } else if (value instanceof Decimal128) {
+ msg.setDoubleProperty(key, ((Decimal128) value).doubleValue());
+ } else if (value instanceof Decimal64) {
+ msg.setDoubleProperty(key, ((Decimal64) value).doubleValue());
+ } else if (value instanceof Decimal32) {
+ msg.setFloatProperty(key, ((Decimal32) value).floatValue());
+ } else if (value instanceof Binary) {
+ msg.setStringProperty(key, value.toString());
+ } else {
+ msg.setObjectProperty(key, value);
+ }
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/CoreAmqpConverter.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..111de8c
--- /dev/null
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/CoreAmqpConverter.java
@@ -0,0 +1,461 @@
+/**
+ * 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.converter;
+
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import javax.jms.MessageEOFException;
+import javax.jms.Queue;
+import javax.jms.TemporaryQueue;
+import javax.jms.TemporaryTopic;
+import javax.jms.TextMessage;
+import javax.jms.Topic;
+import java.nio.charset.StandardCharsets;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Set;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.PooledByteBufAllocator;
+import org.apache.activemq.artemis.api.core.ICoreMessage;
+import org.apache.activemq.artemis.api.core.Message;
+import org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessage;
+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;
+import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSObjectMessage;
+import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSStreamMessage;
+import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSTextMessage;
+import org.apache.activemq.artemis.protocol.amqp.exceptions.ActiveMQAMQPIllegalStateException;
+import org.apache.activemq.artemis.protocol.amqp.util.NettyWritable;
+import org.apache.activemq.artemis.protocol.amqp.util.TLSEncode;
+import org.apache.activemq.artemis.reader.MessageUtil;
+import org.apache.qpid.proton.amqp.Binary;
+import org.apache.qpid.proton.amqp.Symbol;
+import org.apache.qpid.proton.amqp.UnsignedByte;
+import org.apache.qpid.proton.amqp.UnsignedInteger;
+import org.apache.qpid.proton.amqp.messaging.AmqpSequence;
+import org.apache.qpid.proton.amqp.messaging.AmqpValue;
+import org.apache.qpid.proton.amqp.messaging.ApplicationProperties;
+import org.apache.qpid.proton.amqp.messaging.Data;
+import org.apache.qpid.proton.amqp.messaging.DeliveryAnnotations;
+import org.apache.qpid.proton.amqp.messaging.Footer;
+import org.apache.qpid.proton.amqp.messaging.Header;
+import org.apache.qpid.proton.amqp.messaging.MessageAnnotations;
+import org.apache.qpid.proton.amqp.messaging.Properties;
+import org.apache.qpid.proton.amqp.messaging.Section;
+import org.apache.qpid.proton.codec.EncoderImpl;
+import org.apache.qpid.proton.codec.WritableBuffer;
+import org.jboss.logging.Logger;
+
+import static org.apache.activemq.artemis.api.core.FilterConstants.NATIVE_MESSAGE_ID;
+import static org.apache.activemq.artemis.api.core.Message.HDR_SCHEDULED_DELIVERY_TIME;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.EMPTY_BINARY;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.JMS_AMQP_CONTENT_ENCODING;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.JMS_AMQP_CONTENT_TYPE;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.JMS_AMQP_DELIVERY_ANNOTATION_PREFIX;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.JMS_AMQP_FIRST_ACQUIRER;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.JMS_AMQP_FOOTER_PREFIX;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.JMS_AMQP_HEADER;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.JMS_AMQP_HEADER_DURABLE;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.JMS_AMQP_HEADER_PRIORITY;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.JMS_AMQP_MESSAGE_ANNOTATION_PREFIX;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.JMS_AMQP_NATIVE;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.JMS_AMQP_PREFIX;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.JMS_AMQP_PROPERTIES;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.JMS_AMQP_REPLYTO_GROUP_ID;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.JMS_DEST_TYPE_MSG_ANNOTATION;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.JMS_REPLY_TO_TYPE_MSG_ANNOTATION;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.QUEUE_TYPE;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.SERIALIZED_JAVA_OBJECT_CONTENT_TYPE;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.TEMP_QUEUE_TYPE;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.TEMP_TOPIC_TYPE;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.TOPIC_TYPE;
+import static org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport.toAddress;
+
+public class CoreAmqpConverter {
+
+ private static Logger logger = Logger.getLogger(CoreAmqpConverter.class);
+
+ public static AMQPMessage checkAMQP(Message message) throws Exception {
+ if (message instanceof AMQPMessage) {
+ return (AMQPMessage)message;
+ } else {
+ // It will first convert to Core, then to AMQP
+ return fromCore(message.toCore());
+ }
+ }
+
+ public static AMQPMessage fromCore(ICoreMessage coreMessage) throws Exception {
+ if (coreMessage == null) {
+ return null;
+ }
+
+ ServerJMSMessage message = ServerJMSMessage.wrapCoreMessage(coreMessage);
+ message.decode();
+
+ long messageFormat = 0;
+ Header header = null;
+ final Properties properties = new Properties();
+ Map<Symbol, Object> daMap = null;
+ final Map<Symbol, Object> maMap = new HashMap<>();
+ Map<String, Object> apMap = null;
+ Map<Object, Object> footerMap = null;
+
+ Section body = convertBody(message, maMap, properties);
+
+ if (message.getInnerMessage().isDurable()) {
+ if (header == null) {
+ header = new Header();
+ }
+ header.setDurable(true);
+ }
+ byte priority = (byte) message.getJMSPriority();
+ if (priority != javax.jms.Message.DEFAULT_PRIORITY) {
+ if (header == null) {
+ header = new Header();
+ }
+ header.setPriority(UnsignedByte.valueOf(priority));
+ }
+ String type = message.getJMSType();
+ if (type != null) {
+ properties.setSubject(type);
+ }
+ String messageId = message.getJMSMessageID();
+ if (messageId != null) {
+ try {
+ properties.setMessageId(AMQPMessageIdHelper.INSTANCE.toIdObject(messageId));
+ } catch (ActiveMQAMQPIllegalStateException e) {
+ properties.setMessageId(messageId);
+ }
+ }
+ Destination destination = message.getJMSDestination();
+ if (destination != null) {
+ properties.setTo(toAddress(destination));
+ maMap.put(JMS_DEST_TYPE_MSG_ANNOTATION, destinationType(destination));
+ }
+ Destination replyTo = message.getJMSReplyTo();
+ if (replyTo != null) {
+ properties.setReplyTo(toAddress(replyTo));
+ maMap.put(JMS_REPLY_TO_TYPE_MSG_ANNOTATION, destinationType(replyTo));
+ }
+ String correlationId = message.getJMSCorrelationID();
+ if (correlationId != null) {
+ try {
+ properties.setCorrelationId(AMQPMessageIdHelper.INSTANCE.toIdObject(correlationId));
+ } catch (ActiveMQAMQPIllegalStateException e) {
+ properties.setCorrelationId(correlationId);
+ }
+ }
+ long expiration = message.getJMSExpiration();
+ if (expiration != 0) {
+ long ttl = expiration - System.currentTimeMillis();
+ if (ttl < 0) {
+ ttl = 1;
+ }
+
+ if (header == null) {
+ header = new Header();
+ }
+ header.setTtl(new UnsignedInteger((int) ttl));
+
+ properties.setAbsoluteExpiryTime(new Date(expiration));
+ }
+ long timeStamp = message.getJMSTimestamp();
+ if (timeStamp != 0) {
+ properties.setCreationTime(new Date(timeStamp));
+ }
+
+ final Set<String> keySet = MessageUtil.getPropertyNames(message.getInnerMessage());
+ for (String key : keySet) {
+ if (key.startsWith("JMSX")) {
+ if (key.equals("JMSXUserID")) {
+ String value = message.getStringProperty(key);
+ properties.setUserId(new Binary(value.getBytes(StandardCharsets.UTF_8)));
+ continue;
+ } else if (key.equals("JMSXGroupID")) {
+ String value = message.getStringProperty(key);
+ properties.setGroupId(value);
+ continue;
+ } else if (key.equals("JMSXGroupSeq")) {
+ UnsignedInteger value = new UnsignedInteger(message.getIntProperty(key));
+ properties.setGroupSequence(value);
+ continue;
+ }
+ } else if (key.startsWith(JMS_AMQP_PREFIX)) {
+ // AMQP Message Information stored from a conversion to the Core Message
+ if (key.equals(JMS_AMQP_NATIVE)) {
+ // skip..internal use only
+ continue;
+ } else if (key.equals(JMS_AMQP_FIRST_ACQUIRER)) {
+ if (header == null) {
+ header = new Header();
+ }
+ header.setFirstAcquirer(message.getBooleanProperty(key));
+ continue;
+ } else if (key.equals(JMS_AMQP_HEADER)) {
+ if (header == null) {
+ header = new Header();
+ }
+ continue;
+ } else if (key.equals(JMS_AMQP_HEADER_DURABLE)) {
+ if (header == null) {
+ header = new Header();
+ }
+ header.setDurable(message.getInnerMessage().isDurable());
+ continue;
+ } else if (key.equals(JMS_AMQP_HEADER_PRIORITY)) {
+ if (header == null) {
+ header = new Header();
+ }
+ header.setPriority(UnsignedByte.valueOf(priority));
+ continue;
+ } else if (key.startsWith(JMS_AMQP_PROPERTIES)) {
+ continue;
+ } else if (key.startsWith(JMS_AMQP_DELIVERY_ANNOTATION_PREFIX)) {
+ if (daMap == null) {
+ daMap = new HashMap<>();
+ }
+ String name = key.substring(JMS_AMQP_DELIVERY_ANNOTATION_PREFIX.length());
+ daMap.put(Symbol.valueOf(name), message.getObjectProperty(key));
+ continue;
+ } else if (key.startsWith(JMS_AMQP_MESSAGE_ANNOTATION_PREFIX)) {
+ String name = key.substring(JMS_AMQP_MESSAGE_ANNOTATION_PREFIX.length());
+ maMap.put(Symbol.valueOf(name), message.getObjectProperty(key));
+ continue;
+ } else if (key.equals(JMS_AMQP_CONTENT_TYPE)) {
+ properties.setContentType(Symbol.getSymbol(message.getStringProperty(key)));
+ continue;
+ } else if (key.equals(JMS_AMQP_CONTENT_ENCODING)) {
+ properties.setContentEncoding(Symbol.getSymbol(message.getStringProperty(key)));
+ continue;
+ } else if (key.equals(JMS_AMQP_REPLYTO_GROUP_ID)) {
+ properties.setReplyToGroupId(message.getStringProperty(key));
+ continue;
+ } else if (key.startsWith(JMS_AMQP_FOOTER_PREFIX)) {
+ if (footerMap == null) {
+ footerMap = new HashMap<>();
+ }
+ String name = key.substring(JMS_AMQP_FOOTER_PREFIX.length());
+ footerMap.put(name, message.getObjectProperty(key));
+ continue;
+ }
+ } else if (key.equals("_AMQ_GROUP_ID")) {
+ String value = message.getStringProperty(key);
+ properties.setGroupId(value);
+ continue;
+ } else if (key.equals(NATIVE_MESSAGE_ID)) {
+ // skip..internal use only
+ continue;
+ } else if (key.endsWith(HDR_SCHEDULED_DELIVERY_TIME.toString())) {
+ // skip..remove annotation from previous inbound transformation
+ continue;
+ }
+
+ if (apMap == null) {
+ apMap = new HashMap<>();
+ }
+
+ Object objectProperty = message.getObjectProperty(key);
+ if (objectProperty instanceof byte[]) {
+ objectProperty = new Binary((byte[]) objectProperty);
+ }
+
+ apMap.put(key, objectProperty);
+ }
+
+ ByteBuf buffer = PooledByteBufAllocator.DEFAULT.heapBuffer(1024);
+
+ try {
+ EncoderImpl encoder = TLSEncode.getEncoder();
+ encoder.setByteBuffer(new NettyWritable(buffer));
+
+ if (header != null) {
+ encoder.writeObject(header);
+ }
+ if (daMap != null) {
+ encoder.writeObject(new DeliveryAnnotations(daMap));
+ }
+ if (maMap != null) {
+ encoder.writeObject(new MessageAnnotations(maMap));
+ }
+ if (properties != null) {
+ encoder.writeObject(properties);
+ }
+ if (apMap != null) {
+ encoder.writeObject(new ApplicationProperties(apMap));
+ }
+ if (body != null) {
+ encoder.writeObject(body);
+ }
+ if (footerMap != null) {
+ encoder.writeObject(new Footer(footerMap));
+ }
+
+ byte[] data = new byte[buffer.writerIndex()];
+ buffer.readBytes(data);
+
+ AMQPMessage amqpMessage = new AMQPMessage(messageFormat, data);
+ amqpMessage.setMessageID(message.getInnerMessage().getMessageID());
+ amqpMessage.setReplyTo(coreMessage.getReplyTo());
+ return amqpMessage;
+
+ } finally {
+ TLSEncode.getEncoder().setByteBuffer((WritableBuffer) null);
+ buffer.release();
+ }
+ }
+
+ private static Section convertBody(ServerJMSMessage message, Map<Symbol, Object> maMap, Properties properties) throws JMSException {
+
+ Section body = null;
+
+ if (message instanceof ServerJMSBytesMessage) {
+ Binary payload = getBinaryFromMessageBody((ServerJMSBytesMessage) message);
+
+ maMap.put(AMQPMessageSupport.JMS_MSG_TYPE, AMQPMessageSupport.JMS_BYTES_MESSAGE);
+ if (payload == null) {
+ payload = EMPTY_BINARY;
+ } else {
+ body = new AmqpValue(payload);
+ }
+ } else if (message instanceof ServerJMSTextMessage) {
+ body = new AmqpValue(((TextMessage) message).getText());
+ maMap.put(AMQPMessageSupport.JMS_MSG_TYPE, AMQPMessageSupport.JMS_TEXT_MESSAGE);
+ } else if (message instanceof ServerJMSMapMessage) {
+ body = new AmqpValue(getMapFromMessageBody((ServerJMSMapMessage) message));
+ maMap.put(AMQPMessageSupport.JMS_MSG_TYPE, AMQPMessageSupport.JMS_MAP_MESSAGE);
+ } else if (message instanceof ServerJMSStreamMessage) {
+ maMap.put(AMQPMessageSupport.JMS_MSG_TYPE, AMQPMessageSupport.JMS_STREAM_MESSAGE);
+ ArrayList<Object> list = new ArrayList<>();
+ final ServerJMSStreamMessage m = (ServerJMSStreamMessage) message;
+ try {
+ while (true) {
+ list.add(m.readObject());
+ }
+ } catch (MessageEOFException e) {
+ }
+
+ body = new AmqpSequence(list);
+ } else if (message instanceof ServerJMSObjectMessage) {
+ properties.setContentType(AMQPMessageSupport.SERIALIZED_JAVA_OBJECT_CONTENT_TYPE);
+ maMap.put(AMQPMessageSupport.JMS_MSG_TYPE, AMQPMessageSupport.JMS_OBJECT_MESSAGE);
+ Binary payload = getBinaryFromMessageBody((ServerJMSObjectMessage) message);
+
+ if (payload == null) {
+ payload = EMPTY_BINARY;
+ }
+
+ body = new Data(payload);
+
+ // For a non-AMQP message we tag the outbound content type as containing
+ // a serialized Java object so that an AMQP client has a hint as to what
+ // we are sending it.
+ if (!message.propertyExists(JMS_AMQP_CONTENT_TYPE)) {
+ message.setStringProperty(JMS_AMQP_CONTENT_TYPE, SERIALIZED_JAVA_OBJECT_CONTENT_TYPE.toString());
+ }
+ } else if (message instanceof ServerJMSMessage) {
+ maMap.put(AMQPMessageSupport.JMS_MSG_TYPE, AMQPMessageSupport.JMS_MESSAGE);
+ // If this is not an AMQP message that was converted then the original encoding
+ // will be unknown so we check for special cases of messages with special data
+ // encoded into the server message body.
+ ICoreMessage internalMessage = message.getInnerMessage();
+ int readerIndex = internalMessage.getBodyBuffer().readerIndex();
+ try {
+ Object s = internalMessage.getBodyBuffer().readNullableSimpleString();
+ if (s != null) {
+ body = new AmqpValue(s.toString());
+ }
+ } catch (Throwable ignored) {
+ logger.debug("Exception ignored during conversion", ignored.getMessage(), ignored);
+ body = new AmqpValue("Conversion to AMQP error!");
+ } finally {
+ internalMessage.getBodyBuffer().readerIndex(readerIndex);
+ }
+ }
+
+ return body;
+ }
+
+ private static Binary getBinaryFromMessageBody(ServerJMSBytesMessage message) throws JMSException {
+ byte[] data = new byte[(int) message.getBodyLength()];
+ message.readBytes(data);
+ message.reset(); // Need to reset after readBytes or future readBytes
+
+ return new Binary(data);
+ }
+
+ private static Binary getBinaryFromMessageBody(ServerJMSTextMessage message) throws JMSException {
+ Binary result = null;
+ String text = message.getText();
+ if (text != null) {
+ result = new Binary(text.getBytes(StandardCharsets.UTF_8));
+ }
+
+ return result;
+ }
+
+ private static Binary getBinaryFromMessageBody(ServerJMSObjectMessage message) throws JMSException {
+ message.getInnerMessage().getBodyBuffer().resetReaderIndex();
+ int size = message.getInnerMessage().getBodyBuffer().readInt();
+ byte[] bytes = new byte[size];
+ message.getInnerMessage().getBodyBuffer().readBytes(bytes);
+
+ return new Binary(bytes);
+ }
+
+ private static Map<String, Object> getMapFromMessageBody(ServerJMSMapMessage message) throws JMSException {
+ final HashMap<String, Object> map = new LinkedHashMap<>();
+
+ @SuppressWarnings("unchecked")
+ final Enumeration<String> names = message.getMapNames();
+ while (names.hasMoreElements()) {
+ String key = names.nextElement();
+ Object value = message.getObject(key);
+ if (value instanceof byte[]) {
+ value = new Binary((byte[]) value);
+ }
+ map.put(key, value);
+ }
+
+ return map;
+ }
+
+ private static byte destinationType(Destination destination) {
+ if (destination instanceof Queue) {
+ if (destination instanceof TemporaryQueue) {
+ return TEMP_QUEUE_TYPE;
+ } else {
+ return QUEUE_TYPE;
+ }
+ } else if (destination instanceof Topic) {
+ if (destination instanceof TemporaryTopic) {
+ return TEMP_TOPIC_TYPE;
+ } else {
+ return TOPIC_TYPE;
+ }
+ }
+
+ throw new IllegalArgumentException("Unknown Destination Type passed to JMS Transformer.");
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/ProtonMessageConverter.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/ProtonMessageConverter.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/ProtonMessageConverter.java
deleted file mode 100644
index 6aa44a4..0000000
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/ProtonMessageConverter.java
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * 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.converter;
-
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.JMS_AMQP_NATIVE;
-
-import java.io.IOException;
-
-import javax.jms.BytesMessage;
-
-import org.apache.activemq.artemis.core.client.ActiveMQClientLogger;
-import org.apache.activemq.artemis.core.server.ServerMessage;
-import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSBytesMessage;
-import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSMessage;
-import org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport;
-import org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPNativeOutboundTransformer;
-import org.apache.activemq.artemis.protocol.amqp.converter.message.EncodedMessage;
-import org.apache.activemq.artemis.protocol.amqp.converter.message.InboundTransformer;
-import org.apache.activemq.artemis.protocol.amqp.converter.message.JMSMappingInboundTransformer;
-import org.apache.activemq.artemis.protocol.amqp.converter.message.JMSMappingOutboundTransformer;
-import org.apache.activemq.artemis.protocol.amqp.converter.message.OutboundTransformer;
-import org.apache.activemq.artemis.protocol.amqp.util.NettyWritable;
-import org.apache.activemq.artemis.spi.core.protocol.MessageConverter;
-import org.apache.activemq.artemis.utils.IDGenerator;
-import org.apache.qpid.proton.codec.WritableBuffer;
-
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.Unpooled;
-
-public class ProtonMessageConverter implements MessageConverter {
-
- public ProtonMessageConverter(IDGenerator idGenerator) {
- inboundTransformer = new JMSMappingInboundTransformer(idGenerator);
- outboundTransformer = new JMSMappingOutboundTransformer(idGenerator);
- }
-
- private final InboundTransformer inboundTransformer;
- private final OutboundTransformer outboundTransformer;
-
- @Override
- public ServerMessage inbound(Object messageSource) throws Exception {
- EncodedMessage encodedMessageSource = (EncodedMessage) messageSource;
- ServerJMSMessage transformedMessage = null;
-
- try {
- transformedMessage = inboundTransformer.transform(encodedMessageSource);
- } catch (Exception e) {
- ActiveMQClientLogger.LOGGER.debug("Transform of message using [{}] transformer, failed" + inboundTransformer.getTransformerName());
- ActiveMQClientLogger.LOGGER.trace("Transformation error:", e);
-
- throw new IOException("Failed to transform incoming delivery, skipping.");
- }
-
- transformedMessage.encode();
-
- return (ServerMessage) transformedMessage.getInnerMessage();
- }
-
- @Override
- public Object outbound(ServerMessage messageOutbound, int deliveryCount) throws Exception {
- // Useful for testing but not recommended for real life use.
- ByteBuf nettyBuffer = Unpooled.buffer(1024);
- NettyWritable buffer = new NettyWritable(nettyBuffer);
- long messageFormat = (long) outbound(messageOutbound, deliveryCount, buffer);
-
- EncodedMessage encoded = new EncodedMessage(messageFormat, nettyBuffer.array(), nettyBuffer.arrayOffset() + nettyBuffer.readerIndex(),
- nettyBuffer.readableBytes());
-
- return encoded;
- }
-
- public Object outbound(ServerMessage messageOutbound, int deliveryCount, WritableBuffer buffer) throws Exception {
- ServerJMSMessage jmsMessage = AMQPMessageSupport.wrapMessage(messageOutbound.getType(), messageOutbound, deliveryCount);
-
- jmsMessage.decode();
-
- if (jmsMessage.getBooleanProperty(JMS_AMQP_NATIVE)) {
- if (jmsMessage instanceof BytesMessage) {
- return AMQPNativeOutboundTransformer.transform(outboundTransformer, (ServerJMSBytesMessage) jmsMessage, buffer);
- } else {
- return 0;
- }
- } else {
- return outboundTransformer.transform(jmsMessage, buffer);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSBytesMessage.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSBytesMessage.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSBytesMessage.java
index abdf808..8d473a7 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSBytesMessage.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSBytesMessage.java
@@ -19,8 +19,8 @@ package org.apache.activemq.artemis.protocol.amqp.converter.jms;
import javax.jms.BytesMessage;
import javax.jms.JMSException;
-import org.apache.activemq.artemis.core.message.impl.MessageImpl;
-import org.apache.activemq.artemis.core.message.impl.MessageInternal;
+import org.apache.activemq.artemis.api.core.ICoreMessage;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import static org.apache.activemq.artemis.reader.BytesMessageUtil.bytesMessageReset;
import static org.apache.activemq.artemis.reader.BytesMessageUtil.bytesReadBoolean;
@@ -49,13 +49,13 @@ import static org.apache.activemq.artemis.reader.BytesMessageUtil.bytesWriteUTF;
public class ServerJMSBytesMessage extends ServerJMSMessage implements BytesMessage {
- public ServerJMSBytesMessage(MessageInternal message, int deliveryCount) {
- super(message, deliveryCount);
+ public ServerJMSBytesMessage(ICoreMessage message) {
+ super(message);
}
@Override
public long getBodyLength() throws JMSException {
- return message.getEndOfBodyPosition() - MessageImpl.BODY_OFFSET;
+ return message.getEndOfBodyPosition() - CoreMessage.BODY_OFFSET;
}
@Override
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSMapMessage.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSMapMessage.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSMapMessage.java
index 0268065..f72239e 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSMapMessage.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSMapMessage.java
@@ -25,9 +25,9 @@ import java.util.HashSet;
import java.util.Set;
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.SimpleString;
-import org.apache.activemq.artemis.core.message.impl.MessageInternal;
import org.apache.activemq.artemis.utils.TypedProperties;
import static org.apache.activemq.artemis.reader.MapMessageUtil.readBodyMap;
@@ -52,8 +52,8 @@ public final class ServerJMSMapMessage extends ServerJMSMessage implements MapMe
/*
* This constructor is used to construct messages prior to sending
*/
- public ServerJMSMapMessage(MessageInternal message, int deliveryCount) {
- super(message, deliveryCount);
+ public ServerJMSMapMessage(ICoreMessage message) {
+ super(message);
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSMessage.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSMessage.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSMessage.java
index f9a94f5..2a52f7a 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSMessage.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSMessage.java
@@ -16,43 +16,56 @@
*/
package org.apache.activemq.artemis.protocol.amqp.converter.jms;
-import java.util.Collections;
-import java.util.Enumeration;
-
import javax.jms.DeliveryMode;
import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
+import java.util.Collections;
+import java.util.Enumeration;
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.SimpleString;
-import org.apache.activemq.artemis.core.message.impl.MessageInternal;
import org.apache.activemq.artemis.jms.client.ActiveMQDestination;
import org.apache.activemq.artemis.reader.MessageUtil;
import static org.apache.activemq.artemis.api.core.FilterConstants.NATIVE_MESSAGE_ID;
+import static org.apache.activemq.artemis.api.core.Message.BYTES_TYPE;
+import static org.apache.activemq.artemis.api.core.Message.MAP_TYPE;
+import static org.apache.activemq.artemis.api.core.Message.OBJECT_TYPE;
+import static org.apache.activemq.artemis.api.core.Message.STREAM_TYPE;
+import static org.apache.activemq.artemis.api.core.Message.TEXT_TYPE;
public class ServerJMSMessage implements Message {
- protected final MessageInternal message;
-
- protected int deliveryCount;
-
- public MessageInternal getInnerMessage() {
- return message;
- }
+ protected final ICoreMessage message;
+ private ActiveMQBuffer readBodyBuffer;
- public ServerJMSMessage(MessageInternal message, int deliveryCount) {
+ public ServerJMSMessage(ICoreMessage message) {
this.message = message;
- this.deliveryCount = deliveryCount;
}
- public int getDeliveryCount() {
- return deliveryCount;
+ public static ServerJMSMessage wrapCoreMessage(ICoreMessage wrapped) {
+ switch (wrapped.getType()) {
+ case STREAM_TYPE:
+ return new ServerJMSStreamMessage(wrapped);
+ case BYTES_TYPE:
+ return new ServerJMSBytesMessage(wrapped);
+ case MAP_TYPE:
+ return new ServerJMSMapMessage(wrapped);
+ case TEXT_TYPE:
+ return new ServerJMSTextMessage(wrapped);
+ case OBJECT_TYPE:
+ return new ServerJMSObjectMessage(wrapped);
+ default:
+ return new ServerJMSMessage(wrapped);
+ }
}
- private ActiveMQBuffer readBodyBuffer;
+ public ICoreMessage getInnerMessage() {
+ return message;
+ }
/**
* When reading we use a protected copy so multi-threads can work fine
@@ -60,7 +73,7 @@ public class ServerJMSMessage implements Message {
protected ActiveMQBuffer getReadBodyBuffer() {
if (readBodyBuffer == null) {
// to avoid clashes between multiple threads
- readBodyBuffer = message.getBodyBufferDuplicate();
+ readBodyBuffer = message.getReadOnlyBodyBuffer();
}
return readBodyBuffer;
}
@@ -113,13 +126,13 @@ public class ServerJMSMessage implements Message {
}
@Override
- public final void setJMSCorrelationID(String correlationID) throws JMSException {
- MessageUtil.setJMSCorrelationID(message, correlationID);
+ public final String getJMSCorrelationID() throws JMSException {
+ return MessageUtil.getJMSCorrelationID(message);
}
@Override
- public final String getJMSCorrelationID() throws JMSException {
- return MessageUtil.getJMSCorrelationID(message);
+ public final void setJMSCorrelationID(String correlationID) throws JMSException {
+ MessageUtil.setJMSCorrelationID(message, correlationID);
}
@Override
@@ -140,7 +153,7 @@ public class ServerJMSMessage implements Message {
@Override
public final Destination getJMSDestination() throws JMSException {
- SimpleString sdest = message.getAddress();
+ SimpleString sdest = message.getAddressSimpleString();
if (sdest == null) {
return null;
@@ -152,7 +165,7 @@ public class ServerJMSMessage implements Message {
@Override
public final void setJMSDestination(Destination destination) throws JMSException {
if (destination == null) {
- message.setAddress(null);
+ message.setAddress((SimpleString)null);
} else {
message.setAddress(((ActiveMQDestination) destination).getSimpleAddress());
}
@@ -254,19 +267,11 @@ public class ServerJMSMessage implements Message {
@Override
public final int getIntProperty(String name) throws JMSException {
- if (MessageUtil.JMSXDELIVERYCOUNT.equals(name)) {
- return deliveryCount;
- }
-
return message.getIntProperty(name);
}
@Override
public final long getLongProperty(String name) throws JMSException {
- if (MessageUtil.JMSXDELIVERYCOUNT.equals(name)) {
- return deliveryCount;
- }
-
return message.getLongProperty(name);
}
@@ -282,10 +287,6 @@ public class ServerJMSMessage implements Message {
@Override
public final String getStringProperty(String name) throws JMSException {
- if (MessageUtil.JMSXDELIVERYCOUNT.equals(name)) {
- return String.valueOf(deliveryCount);
- }
-
return message.getStringProperty(name);
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSObjectMessage.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSObjectMessage.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSObjectMessage.java
index d1eaac6..23ffb09 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSObjectMessage.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSObjectMessage.java
@@ -16,13 +16,12 @@
*/
package org.apache.activemq.artemis.protocol.amqp.converter.jms;
-import java.io.Serializable;
-
import javax.jms.JMSException;
import javax.jms.ObjectMessage;
+import java.io.Serializable;
+import org.apache.activemq.artemis.api.core.ICoreMessage;
import org.apache.activemq.artemis.api.core.Message;
-import org.apache.activemq.artemis.core.message.impl.MessageInternal;
import org.apache.qpid.proton.amqp.Binary;
public class ServerJMSObjectMessage extends ServerJMSMessage implements ObjectMessage {
@@ -31,8 +30,8 @@ public class ServerJMSObjectMessage extends ServerJMSMessage implements ObjectMe
private Binary payload;
- public ServerJMSObjectMessage(MessageInternal message, int deliveryCount) {
- super(message, deliveryCount);
+ public ServerJMSObjectMessage(ICoreMessage message) {
+ super(message);
}
@Override
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSStreamMessage.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSStreamMessage.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSStreamMessage.java
index a53fc0e..9aaf4c3 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSStreamMessage.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSStreamMessage.java
@@ -21,9 +21,9 @@ import javax.jms.MessageEOFException;
import javax.jms.MessageFormatException;
import javax.jms.StreamMessage;
+import org.apache.activemq.artemis.api.core.ICoreMessage;
import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.Pair;
-import org.apache.activemq.artemis.core.message.impl.MessageInternal;
import org.apache.activemq.artemis.utils.DataConstants;
import static org.apache.activemq.artemis.reader.StreamMessageUtil.streamReadBoolean;
@@ -44,8 +44,8 @@ public final class ServerJMSStreamMessage extends ServerJMSMessage implements St
private int bodyLength = 0;
- public ServerJMSStreamMessage(MessageInternal message, int deliveryCount) {
- super(message, deliveryCount);
+ public ServerJMSStreamMessage(ICoreMessage message) {
+ super(message);
}
// StreamMessage implementation ----------------------------------
@@ -180,7 +180,7 @@ public final class ServerJMSStreamMessage extends ServerJMSMessage implements St
@Override
public Object readObject() throws JMSException {
- if (getReadBodyBuffer().readerIndex() >= message.getEndOfBodyPosition()) {
+ if (getReadBodyBuffer().readerIndex() >= getReadBodyBuffer().writerIndex()) {
throw new MessageEOFException("");
}
try {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSTextMessage.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSTextMessage.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSTextMessage.java
index eb88de0..f770185 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSTextMessage.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/jms/ServerJMSTextMessage.java
@@ -19,9 +19,9 @@ package org.apache.activemq.artemis.protocol.amqp.converter.jms;
import javax.jms.JMSException;
import javax.jms.TextMessage;
+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.message.impl.MessageInternal;
import static org.apache.activemq.artemis.reader.TextMessageUtil.readBodyText;
import static org.apache.activemq.artemis.reader.TextMessageUtil.writeBodyText;
@@ -49,8 +49,8 @@ public class ServerJMSTextMessage extends ServerJMSMessage implements TextMessag
/*
* This constructor is used to construct messages prior to sending
*/
- public ServerJMSTextMessage(MessageInternal message, int deliveryCount) {
- super(message, deliveryCount);
+ public ServerJMSTextMessage(ICoreMessage message) {
+ super(message);
}
// TextMessage implementation ------------------------------------
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPContentTypeSupport.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPContentTypeSupport.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPContentTypeSupport.java
deleted file mode 100644
index 01d72c8..0000000
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPContentTypeSupport.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * 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.converter.message;
-
-import java.nio.charset.Charset;
-import java.nio.charset.IllegalCharsetNameException;
-import java.nio.charset.StandardCharsets;
-import java.nio.charset.UnsupportedCharsetException;
-import java.util.StringTokenizer;
-
-import org.apache.activemq.artemis.protocol.amqp.exceptions.ActiveMQAMQPInvalidContentTypeException;
-
-public final class AMQPContentTypeSupport {
-
- private static final String UTF_8 = "UTF-8";
- private static final String CHARSET = "charset";
- private static final String TEXT = "text";
- private static final String APPLICATION = "application";
- private static final String JAVASCRIPT = "javascript";
- private static final String XML = "xml";
- private static final String XML_VARIANT = "+xml";
- private static final String JSON = "json";
- private static final String JSON_VARIANT = "+json";
- private static final String XML_DTD = "xml-dtd";
- private static final String ECMASCRIPT = "ecmascript";
-
- /**
- * @param contentType
- * the contentType of the received message
- * @return the character set to use, or null if not to treat the message as text
- * @throws ActiveMQAMQPInvalidContentTypeException
- * if the content-type is invalid in some way.
- */
- public static Charset parseContentTypeForTextualCharset(final String contentType) throws ActiveMQAMQPInvalidContentTypeException {
- if (contentType == null || contentType.trim().isEmpty()) {
- throw new ActiveMQAMQPInvalidContentTypeException("Content type can't be null or empty");
- }
-
- int subTypeSeparator = contentType.indexOf("/");
- if (subTypeSeparator == -1) {
- throw new ActiveMQAMQPInvalidContentTypeException("Content type has no '/' separator: " + contentType);
- }
-
- final String type = contentType.substring(0, subTypeSeparator).toLowerCase().trim();
-
- String subTypePart = contentType.substring(subTypeSeparator + 1).toLowerCase().trim();
-
- String parameterPart = null;
- int parameterSeparator = subTypePart.indexOf(";");
- if (parameterSeparator != -1) {
- if (parameterSeparator < subTypePart.length() - 1) {
- parameterPart = contentType.substring(subTypeSeparator + 1).toLowerCase().trim();
- }
- subTypePart = subTypePart.substring(0, parameterSeparator).trim();
- }
-
- if (subTypePart.isEmpty()) {
- throw new ActiveMQAMQPInvalidContentTypeException("Content type has no subtype after '/'" + contentType);
- }
-
- final String subType = subTypePart;
-
- if (isTextual(type, subType)) {
- String charset = findCharset(parameterPart);
- if (charset == null) {
- charset = UTF_8;
- }
-
- if (UTF_8.equals(charset)) {
- return StandardCharsets.UTF_8;
- } else {
- try {
- return Charset.forName(charset);
- } catch (IllegalCharsetNameException icne) {
- throw new ActiveMQAMQPInvalidContentTypeException("Illegal charset: " + charset);
- } catch (UnsupportedCharsetException uce) {
- throw new ActiveMQAMQPInvalidContentTypeException("Unsupported charset: " + charset);
- }
- }
- }
-
- return null;
- }
-
- // ----- Internal Content Type utilities ----------------------------------//
-
- private static boolean isTextual(String type, String subType) {
- if (TEXT.equals(type)) {
- return true;
- }
-
- if (APPLICATION.equals(type)) {
- if (XML.equals(subType) || JSON.equals(subType) || JAVASCRIPT.equals(subType) || subType.endsWith(XML_VARIANT) || subType.endsWith(JSON_VARIANT)
- || XML_DTD.equals(subType) || ECMASCRIPT.equals(subType)) {
- return true;
- }
- }
-
- return false;
- }
-
- private static String findCharset(String paramaterPart) {
- String charset = null;
-
- if (paramaterPart != null) {
- StringTokenizer tokenizer = new StringTokenizer(paramaterPart, ";");
- while (tokenizer.hasMoreTokens()) {
- String parameter = tokenizer.nextToken().trim();
- int eqIndex = parameter.indexOf('=');
- if (eqIndex != -1) {
- String name = parameter.substring(0, eqIndex);
- if (CHARSET.equalsIgnoreCase(name.trim())) {
- String value = unquote(parameter.substring(eqIndex + 1));
-
- charset = value.toUpperCase();
- break;
- }
- }
- }
- }
-
- return charset;
- }
-
- private static String unquote(String s) {
- if (s.length() > 1 && (s.startsWith("\"") && s.endsWith("\""))) {
- return s.substring(1, s.length() - 1);
- } else {
- return s;
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPMessageIdHelper.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPMessageIdHelper.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPMessageIdHelper.java
deleted file mode 100644
index 4a2123d..0000000
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPMessageIdHelper.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- *
- * 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.converter.message;
-
-import java.nio.ByteBuffer;
-import java.util.UUID;
-
-import org.apache.activemq.artemis.protocol.amqp.exceptions.ActiveMQAMQPIllegalStateException;
-import org.apache.qpid.proton.amqp.Binary;
-import org.apache.qpid.proton.amqp.UnsignedLong;
-
-/**
- * Helper class for identifying and converting message-id and correlation-id values between the
- * AMQP types and the Strings values used by JMS.
- * <p>
- * AMQP messages allow for 4 types of message-id/correlation-id: message-id-string,
- * message-id-binary, message-id-uuid, or message-id-ulong. In order to accept or return a
- * string representation of these for interoperability with other AMQP clients, the following
- * encoding can be used after removing or before adding the "ID:" prefix used for a JMSMessageID
- * value:<br>
- * <p>
- * {@literal "AMQP_BINARY:<hex representation of binary content>"}<br>
- * {@literal "AMQP_UUID:<string representation of uuid>"}<br>
- * {@literal "AMQP_ULONG:<string representation of ulong>"}<br>
- * {@literal "AMQP_STRING:<string>"}<br>
- * <p>
- * The AMQP_STRING encoding exists only for escaping message-id-string values that happen to
- * begin with one of the encoding prefixes (including AMQP_STRING itself). It MUST NOT be used
- * otherwise.
- * <p>
- * When provided a string for conversion which attempts to identify itself as an encoded binary,
- * uuid, or ulong but can't be converted into the indicated format, an exception will be thrown.
- */
-public class AMQPMessageIdHelper {
-
- public static final AMQPMessageIdHelper INSTANCE = new AMQPMessageIdHelper();
-
- public static final String AMQP_STRING_PREFIX = "AMQP_STRING:";
- public static final String AMQP_UUID_PREFIX = "AMQP_UUID:";
- public static final String AMQP_ULONG_PREFIX = "AMQP_ULONG:";
- public static final String AMQP_BINARY_PREFIX = "AMQP_BINARY:";
-
- private static final int AMQP_UUID_PREFIX_LENGTH = AMQP_UUID_PREFIX.length();
- private static final int AMQP_ULONG_PREFIX_LENGTH = AMQP_ULONG_PREFIX.length();
- private static final int AMQP_STRING_PREFIX_LENGTH = AMQP_STRING_PREFIX.length();
- private static final int AMQP_BINARY_PREFIX_LENGTH = AMQP_BINARY_PREFIX.length();
- private static final char[] HEX_CHARS = "0123456789ABCDEF".toCharArray();
-
- /**
- * Takes the provided AMQP messageId style object, and convert it to a base string. Encodes
- * type information as a prefix where necessary to convey or escape the type of the provided
- * object.
- *
- * @param messageId
- * the raw messageId object to process
- * @return the base string to be used in creating the actual id.
- */
- public String toBaseMessageIdString(Object messageId) {
- if (messageId == null) {
- return null;
- } else if (messageId instanceof String) {
- String stringId = (String) messageId;
-
- // If the given string has a type encoding prefix,
- // we need to escape it as an encoded string (even if
- // the existing encoding prefix was also for string)
- if (hasTypeEncodingPrefix(stringId)) {
- return AMQP_STRING_PREFIX + stringId;
- } else {
- return stringId;
- }
- } else if (messageId instanceof UUID) {
- return AMQP_UUID_PREFIX + messageId.toString();
- } else if (messageId instanceof UnsignedLong) {
- return AMQP_ULONG_PREFIX + messageId.toString();
- } else if (messageId instanceof Binary) {
- ByteBuffer dup = ((Binary) messageId).asByteBuffer();
-
- byte[] bytes = new byte[dup.remaining()];
- dup.get(bytes);
-
- String hex = convertBinaryToHexString(bytes);
-
- return AMQP_BINARY_PREFIX + hex;
- } else {
- throw new IllegalArgumentException("Unsupported type provided: " + messageId.getClass());
- }
- }
-
- /**
- * Takes the provided base id string and return the appropriate amqp messageId style object.
- * Converts the type based on any relevant encoding information found as a prefix.
- *
- * @param baseId
- * the object to be converted to an AMQP MessageId value.
- * @return the AMQP messageId style object
- * @throws ActiveMQAMQPIllegalStateException
- * if the provided baseId String indicates an encoded type but can't be converted to
- * that type.
- */
- public Object toIdObject(String baseId) throws ActiveMQAMQPIllegalStateException {
- if (baseId == null) {
- return null;
- }
-
- try {
- if (hasAmqpUuidPrefix(baseId)) {
- String uuidString = strip(baseId, AMQP_UUID_PREFIX_LENGTH);
- return UUID.fromString(uuidString);
- } else if (hasAmqpUlongPrefix(baseId)) {
- String longString = strip(baseId, AMQP_ULONG_PREFIX_LENGTH);
- return UnsignedLong.valueOf(longString);
- } else if (hasAmqpStringPrefix(baseId)) {
- return strip(baseId, AMQP_STRING_PREFIX_LENGTH);
- } else if (hasAmqpBinaryPrefix(baseId)) {
- String hexString = strip(baseId, AMQP_BINARY_PREFIX_LENGTH);
- byte[] bytes = convertHexStringToBinary(hexString);
- return new Binary(bytes);
- } else {
- // We have a string without any type prefix, transmit it as-is.
- return baseId;
- }
- } catch (IllegalArgumentException e) {
- throw new ActiveMQAMQPIllegalStateException("Unable to convert ID value");
- }
- }
-
- /**
- * Convert the provided hex-string into a binary representation where each byte represents
- * two characters of the hex string.
- * <p>
- * The hex characters may be upper or lower case.
- *
- * @param hexString
- * string to convert to a binary value.
- * @return a byte array containing the binary representation
- * @throws IllegalArgumentException
- * if the provided String is a non-even length or contains non-hex characters
- */
- public byte[] convertHexStringToBinary(String hexString) throws IllegalArgumentException {
- int length = hexString.length();
-
- // As each byte needs two characters in the hex encoding, the string must be an even
- // length.
- if (length % 2 != 0) {
- throw new IllegalArgumentException("The provided hex String must be an even length, but was of length " + length + ": " + hexString);
- }
-
- byte[] binary = new byte[length / 2];
-
- for (int i = 0; i < length; i += 2) {
- char highBitsChar = hexString.charAt(i);
- char lowBitsChar = hexString.charAt(i + 1);
-
- int highBits = hexCharToInt(highBitsChar, hexString) << 4;
- int lowBits = hexCharToInt(lowBitsChar, hexString);
-
- binary[i / 2] = (byte) (highBits + lowBits);
- }
-
- return binary;
- }
-
- /**
- * Convert the provided binary into a hex-string representation where each character
- * represents 4 bits of the provided binary, i.e each byte requires two characters.
- * <p>
- * The returned hex characters are upper-case.
- *
- * @param bytes
- * the binary value to convert to a hex String instance.
- * @return a String containing a hex representation of the bytes
- */
- public String convertBinaryToHexString(byte[] bytes) {
- // Each byte is represented as 2 chars
- StringBuilder builder = new StringBuilder(bytes.length * 2);
-
- for (byte b : bytes) {
- // The byte will be expanded to int before shifting, replicating the
- // sign bit, so mask everything beyond the first 4 bits afterwards
- int highBitsInt = (b >> 4) & 0xF;
- // We only want the first 4 bits
- int lowBitsInt = b & 0xF;
-
- builder.append(HEX_CHARS[highBitsInt]);
- builder.append(HEX_CHARS[lowBitsInt]);
- }
-
- return builder.toString();
- }
-
- // ----- Internal implementation ------------------------------------------//
-
- private boolean hasTypeEncodingPrefix(String stringId) {
- return hasAmqpBinaryPrefix(stringId) || hasAmqpUuidPrefix(stringId) || hasAmqpUlongPrefix(stringId) || hasAmqpStringPrefix(stringId);
- }
-
- private boolean hasAmqpStringPrefix(String stringId) {
- return stringId.startsWith(AMQP_STRING_PREFIX);
- }
-
- private boolean hasAmqpUlongPrefix(String stringId) {
- return stringId.startsWith(AMQP_ULONG_PREFIX);
- }
-
- private boolean hasAmqpUuidPrefix(String stringId) {
- return stringId.startsWith(AMQP_UUID_PREFIX);
- }
-
- private boolean hasAmqpBinaryPrefix(String stringId) {
- return stringId.startsWith(AMQP_BINARY_PREFIX);
- }
-
- private String strip(String id, int numChars) {
- return id.substring(numChars);
- }
-
- private int hexCharToInt(char ch, String orig) throws IllegalArgumentException {
- if (ch >= '0' && ch <= '9') {
- // subtract '0' to get difference in position as an int
- return ch - '0';
- } else if (ch >= 'A' && ch <= 'F') {
- // subtract 'A' to get difference in position as an int
- // and then add 10 for the offset of 'A'
- return ch - 'A' + 10;
- } else if (ch >= 'a' && ch <= 'f') {
- // subtract 'a' to get difference in position as an int
- // and then add 10 for the offset of 'a'
- return ch - 'a' + 10;
- }
-
- throw new IllegalArgumentException("The provided hex string contains non-hex character '" + ch + "': " + orig);
- }
-}
[08/17] activemq-artemis git commit: ARTEMIS-1009 Pure Message
Encoding.
Posted by cl...@apache.org.
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/JMSMappingOutboundTransformerTest.java
----------------------------------------------------------------------
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 2ece01d..d06464f 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
@@ -16,33 +16,20 @@
*/
package org.apache.activemq.artemis.protocol.amqp.converter.message;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.AMQP_DATA;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.AMQP_NULL;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.AMQP_SEQUENCE;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.AMQP_UNKNOWN;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.AMQP_VALUE_BINARY;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.JMS_AMQP_ORIGINAL_ENCODING;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
+import javax.jms.JMSException;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
-import java.nio.charset.StandardCharsets;
import java.util.List;
import java.util.Map;
import java.util.UUID;
-import javax.jms.JMSException;
-
import org.apache.activemq.artemis.core.buffers.impl.ResetLimitWrappedActiveMQBuffer;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
+import org.apache.activemq.artemis.protocol.amqp.converter.AMQPConverter;
+import org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport;
import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerDestination;
import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSBytesMessage;
import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSMapMessage;
@@ -50,9 +37,6 @@ import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSMessage;
import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSObjectMessage;
import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSStreamMessage;
import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSTextMessage;
-import org.apache.activemq.artemis.protocol.amqp.util.NettyWritable;
-import org.apache.activemq.artemis.utils.IDGenerator;
-import org.apache.activemq.artemis.utils.SimpleIDGenerator;
import org.apache.qpid.proton.amqp.Binary;
import org.apache.qpid.proton.amqp.Symbol;
import org.apache.qpid.proton.amqp.messaging.AmqpSequence;
@@ -64,16 +48,18 @@ import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.Unpooled;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
public class JMSMappingOutboundTransformerTest {
private final UUID TEST_OBJECT_VALUE = UUID.fromString("fee14b62-09e0-4ac6-a4c3-4206c630d844");
private final String TEST_ADDRESS = "queue://testAddress";
- private IDGenerator idGenerator;
- private JMSMappingOutboundTransformer transformer;
public static final byte QUEUE_TYPE = 0x00;
public static final byte TOPIC_TYPE = 0x01;
@@ -82,80 +68,10 @@ public class JMSMappingOutboundTransformerTest {
@Before
public void setUp() {
- idGenerator = new SimpleIDGenerator(0);
- transformer = new JMSMappingOutboundTransformer(idGenerator);
}
// ----- no-body Message type tests ---------------------------------------//
- @Test
- public void testConvertMessageToAmqpMessageWithNoBody() throws Exception {
- ServerJMSMessage outbound = createMessage();
- outbound.encode();
-
- EncodedMessage encoded = transform(outbound);
- assertNotNull(encoded);
-
- Message amqp = encoded.decode();
-
- assertNull(amqp.getBody());
- }
-
- @Test
- public void testConvertTextMessageToAmqpMessageWithNoBodyOriginalEncodingWasNull() throws Exception {
- ServerJMSTextMessage outbound = createTextMessage();
- outbound.setShortProperty(JMS_AMQP_ORIGINAL_ENCODING, AMQP_NULL);
- outbound.encode();
-
- EncodedMessage encoded = transform(outbound);
- assertNotNull(encoded);
-
- Message amqp = encoded.decode();
-
- assertNull(amqp.getBody());
- }
-
- // ----- BytesMessage type tests ---------------------------------------//
-
- @Test
- public void testConvertEmptyBytesMessageToAmqpMessageWithDataBody() throws Exception {
- ServerJMSBytesMessage outbound = createBytesMessage();
- outbound.encode();
-
- EncodedMessage encoded = transform(outbound);
- assertNotNull(encoded);
-
- Message amqp = encoded.decode();
-
- assertNotNull(amqp.getBody());
- assertTrue(amqp.getBody() instanceof Data);
- assertTrue(((Data) amqp.getBody()).getValue() instanceof Binary);
- assertEquals(0, ((Data) amqp.getBody()).getValue().getLength());
- }
-
- @Test
- public void testConvertUncompressedBytesMessageToAmqpMessageWithDataBody() throws Exception {
- byte[] expectedPayload = new byte[] {8, 16, 24, 32};
- ServerJMSBytesMessage outbound = createBytesMessage();
- outbound.writeBytes(expectedPayload);
- outbound.encode();
-
- EncodedMessage encoded = transform(outbound);
- assertNotNull(encoded);
-
- Message amqp = encoded.decode();
-
- assertNotNull(amqp.getBody());
- assertTrue(amqp.getBody() instanceof Data);
- assertTrue(((Data) amqp.getBody()).getValue() instanceof Binary);
- assertEquals(4, ((Data) amqp.getBody()).getValue().getLength());
-
- Binary amqpData = ((Data) amqp.getBody()).getValue();
- Binary inputData = new Binary(expectedPayload);
-
- assertTrue(inputData.equals(amqpData));
- }
-
@Ignore("Compressed message body support not yet implemented.")
@Test
public void testConvertCompressedBytesMessageToAmqpMessageWithDataBody() throws Exception {
@@ -164,10 +80,7 @@ public class JMSMappingOutboundTransformerTest {
outbound.writeBytes(expectedPayload);
outbound.encode();
- EncodedMessage encoded = transform(outbound);
- assertNotNull(encoded);
-
- Message amqp = encoded.decode();
+ Message amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage()).getProtonMessage();
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof Data);
@@ -183,13 +96,9 @@ public class JMSMappingOutboundTransformerTest {
@Test
public void testConvertEmptyBytesMessageToAmqpMessageWithAmqpValueBody() throws Exception {
ServerJMSBytesMessage outbound = createBytesMessage();
- outbound.setShortProperty(JMS_AMQP_ORIGINAL_ENCODING, AMQP_VALUE_BINARY);
outbound.encode();
- EncodedMessage encoded = transform(outbound);
- assertNotNull(encoded);
-
- Message amqp = encoded.decode();
+ Message amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage()).getProtonMessage();
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof AmqpValue);
@@ -201,14 +110,10 @@ public class JMSMappingOutboundTransformerTest {
public void testConvertUncompressedBytesMessageToAmqpMessageWithAmqpValueBody() throws Exception {
byte[] expectedPayload = new byte[] {8, 16, 24, 32};
ServerJMSBytesMessage outbound = createBytesMessage();
- outbound.setShortProperty(JMS_AMQP_ORIGINAL_ENCODING, AMQP_VALUE_BINARY);
outbound.writeBytes(expectedPayload);
outbound.encode();
- EncodedMessage encoded = transform(outbound);
- assertNotNull(encoded);
-
- Message amqp = encoded.decode();
+ Message amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage()).getProtonMessage();
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof AmqpValue);
@@ -226,14 +131,10 @@ public class JMSMappingOutboundTransformerTest {
public void testConvertCompressedBytesMessageToAmqpMessageWithAmqpValueBody() throws Exception {
byte[] expectedPayload = new byte[] {8, 16, 24, 32};
ServerJMSBytesMessage outbound = createBytesMessage(true);
- outbound.setShortProperty(JMS_AMQP_ORIGINAL_ENCODING, AMQP_VALUE_BINARY);
outbound.writeBytes(expectedPayload);
outbound.encode();
- EncodedMessage encoded = transform(outbound);
- assertNotNull(encoded);
-
- Message amqp = encoded.decode();
+ Message amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage()).getProtonMessage();
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof AmqpValue);
@@ -253,10 +154,7 @@ public class JMSMappingOutboundTransformerTest {
ServerJMSMapMessage outbound = createMapMessage();
outbound.encode();
- EncodedMessage encoded = transform(outbound);
- assertNotNull(encoded);
-
- Message amqp = encoded.decode();
+ Message amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage()).getProtonMessage();
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof AmqpValue);
@@ -271,10 +169,7 @@ public class JMSMappingOutboundTransformerTest {
outbound.setBytes("bytes", byteArray);
outbound.encode();
- EncodedMessage encoded = transform(outbound);
- assertNotNull(encoded);
-
- Message amqp = encoded.decode();
+ Message amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage()).getProtonMessage();
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof AmqpValue);
@@ -296,10 +191,7 @@ public class JMSMappingOutboundTransformerTest {
outbound.setBoolean("property-3", true);
outbound.encode();
- EncodedMessage encoded = transform(outbound);
- assertNotNull(encoded);
-
- Message amqp = encoded.decode();
+ Message amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage()).getProtonMessage();
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof AmqpValue);
@@ -320,10 +212,7 @@ public class JMSMappingOutboundTransformerTest {
outbound.setBoolean("property-3", true);
outbound.encode();
- EncodedMessage encoded = transform(outbound);
- assertNotNull(encoded);
-
- Message amqp = encoded.decode();
+ Message amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage()).getProtonMessage();
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof AmqpValue);
@@ -336,33 +225,12 @@ public class JMSMappingOutboundTransformerTest {
assertTrue("string".equals(amqpMap.get("property-1")));
}
- // ----- StreamMessage type tests -----------------------------------------//
-
- @Test
- public void testConvertStreamMessageToAmqpMessageWithAmqpValueBody() throws Exception {
- ServerJMSStreamMessage outbound = createStreamMessage();
- outbound.encode();
-
- EncodedMessage encoded = transform(outbound);
- assertNotNull(encoded);
-
- Message amqp = encoded.decode();
-
- assertNotNull(amqp.getBody());
- assertTrue(amqp.getBody() instanceof AmqpValue);
- assertTrue(((AmqpValue) amqp.getBody()).getValue() instanceof List);
- }
-
@Test
public void testConvertStreamMessageToAmqpMessageWithAmqpSequencey() throws Exception {
ServerJMSStreamMessage outbound = createStreamMessage();
- outbound.setShortProperty(JMS_AMQP_ORIGINAL_ENCODING, AMQP_SEQUENCE);
outbound.encode();
- EncodedMessage encoded = transform(outbound);
- assertNotNull(encoded);
-
- Message amqp = encoded.decode();
+ Message amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage()).getProtonMessage();
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof AmqpSequence);
@@ -376,17 +244,15 @@ public class JMSMappingOutboundTransformerTest {
outbound.writeString("test");
outbound.encode();
- EncodedMessage encoded = transform(outbound);
- assertNotNull(encoded);
-
- Message amqp = encoded.decode();
+ Message amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage()).getProtonMessage();
assertNotNull(amqp.getBody());
- assertTrue(amqp.getBody() instanceof AmqpValue);
- assertTrue(((AmqpValue) amqp.getBody()).getValue() instanceof List);
+ assertTrue(amqp.getBody() instanceof AmqpSequence);
+
+ AmqpSequence list = (AmqpSequence)amqp.getBody();
@SuppressWarnings("unchecked")
- List<Object> amqpList = (List<Object>) ((AmqpValue) amqp.getBody()).getValue();
+ List<Object> amqpList = list.getValue();
assertEquals(2, amqpList.size());
}
@@ -394,15 +260,11 @@ public class JMSMappingOutboundTransformerTest {
@Test
public void testConvertCompressedStreamMessageToAmqpMessageWithAmqpSequencey() throws Exception {
ServerJMSStreamMessage outbound = createStreamMessage(true);
- outbound.setShortProperty(JMS_AMQP_ORIGINAL_ENCODING, AMQP_SEQUENCE);
outbound.writeBoolean(false);
outbound.writeString("test");
outbound.encode();
- EncodedMessage encoded = transform(outbound);
- assertNotNull(encoded);
-
- Message amqp = encoded.decode();
+ Message amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage()).getProtonMessage();
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof AmqpSequence);
@@ -421,10 +283,7 @@ public class JMSMappingOutboundTransformerTest {
ServerJMSObjectMessage outbound = createObjectMessage();
outbound.encode();
- EncodedMessage encoded = transform(outbound);
- assertNotNull(encoded);
-
- Message amqp = encoded.decode();
+ Message amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage()).getProtonMessage();
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof Data);
@@ -434,45 +293,20 @@ public class JMSMappingOutboundTransformerTest {
@Test
public void testConvertEmptyObjectMessageToAmqpMessageUnknownEncodingGetsDataSection() throws Exception {
ServerJMSObjectMessage outbound = createObjectMessage();
- outbound.setShortProperty(JMS_AMQP_ORIGINAL_ENCODING, AMQP_UNKNOWN);
outbound.encode();
- EncodedMessage encoded = transform(outbound);
- assertNotNull(encoded);
-
- Message amqp = encoded.decode();
+ Message amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage()).getProtonMessage();
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof Data);
assertEquals(5, ((Data) amqp.getBody()).getValue().getLength());
}
-
- @Test
- public void testConvertEmptyObjectMessageToAmqpMessageWithAmqpValueBody() throws Exception {
- ServerJMSObjectMessage outbound = createObjectMessage();
- outbound.setShortProperty(JMS_AMQP_ORIGINAL_ENCODING, AMQP_VALUE_BINARY);
- outbound.encode();
-
- EncodedMessage encoded = transform(outbound);
- assertNotNull(encoded);
-
- Message amqp = encoded.decode();
-
- assertNotNull(amqp.getBody());
- assertTrue(amqp.getBody() instanceof AmqpValue);
- assertTrue(((AmqpValue) amqp.getBody()).getValue() instanceof Binary);
- assertEquals(5, ((Binary) ((AmqpValue) amqp.getBody()).getValue()).getLength());
- }
-
@Test
public void testConvertObjectMessageToAmqpMessageWithDataBody() throws Exception {
ServerJMSObjectMessage outbound = createObjectMessage(TEST_OBJECT_VALUE);
outbound.encode();
- EncodedMessage encoded = transform(outbound);
- assertNotNull(encoded);
-
- Message amqp = encoded.decode();
+ Message amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage()).getProtonMessage();
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof Data);
@@ -486,13 +320,9 @@ public class JMSMappingOutboundTransformerTest {
@Test
public void testConvertObjectMessageToAmqpMessageUnknownEncodingGetsDataSection() throws Exception {
ServerJMSObjectMessage outbound = createObjectMessage(TEST_OBJECT_VALUE);
- outbound.setShortProperty(JMS_AMQP_ORIGINAL_ENCODING, AMQP_UNKNOWN);
outbound.encode();
- EncodedMessage encoded = transform(outbound);
- assertNotNull(encoded);
-
- Message amqp = encoded.decode();
+ Message amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage()).getProtonMessage();
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof Data);
@@ -504,35 +334,11 @@ public class JMSMappingOutboundTransformerTest {
}
@Test
- public void testConvertObjectMessageToAmqpMessageWithAmqpValueBody() throws Exception {
- ServerJMSObjectMessage outbound = createObjectMessage(TEST_OBJECT_VALUE);
- outbound.setShortProperty(JMS_AMQP_ORIGINAL_ENCODING, AMQP_VALUE_BINARY);
- outbound.encode();
-
- EncodedMessage encoded = transform(outbound);
- assertNotNull(encoded);
-
- Message amqp = encoded.decode();
-
- assertNotNull(amqp.getBody());
- assertTrue(amqp.getBody() instanceof AmqpValue);
- assertTrue(((AmqpValue) amqp.getBody()).getValue() instanceof Binary);
- assertFalse(0 == ((Binary) ((AmqpValue) amqp.getBody()).getValue()).getLength());
-
- Object value = deserialize(((Binary) ((AmqpValue) amqp.getBody()).getValue()).getArray());
- assertNotNull(value);
- assertTrue(value instanceof UUID);
- }
-
- @Test
public void testConvertCompressedObjectMessageToAmqpMessageWithDataBody() throws Exception {
ServerJMSObjectMessage outbound = createObjectMessage(TEST_OBJECT_VALUE, true);
outbound.encode();
- EncodedMessage encoded = transform(outbound);
- assertNotNull(encoded);
-
- Message amqp = encoded.decode();
+ Message amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage()).getProtonMessage();
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof Data);
@@ -546,13 +352,9 @@ public class JMSMappingOutboundTransformerTest {
@Test
public void testConvertCompressedObjectMessageToAmqpMessageUnknownEncodingGetsDataSection() throws Exception {
ServerJMSObjectMessage outbound = createObjectMessage(TEST_OBJECT_VALUE, true);
- outbound.setShortProperty(JMS_AMQP_ORIGINAL_ENCODING, AMQP_UNKNOWN);
outbound.encode();
- EncodedMessage encoded = transform(outbound);
- assertNotNull(encoded);
-
- Message amqp = encoded.decode();
+ Message amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage()).getProtonMessage();
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof Data);
@@ -566,20 +368,16 @@ public class JMSMappingOutboundTransformerTest {
@Test
public void testConvertCompressedObjectMessageToAmqpMessageWithAmqpValueBody() throws Exception {
ServerJMSObjectMessage outbound = createObjectMessage(TEST_OBJECT_VALUE, true);
- outbound.setShortProperty(JMS_AMQP_ORIGINAL_ENCODING, AMQP_VALUE_BINARY);
outbound.encode();
- EncodedMessage encoded = transform(outbound);
- assertNotNull(encoded);
-
- Message amqp = encoded.decode();
+ Message amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage()).getProtonMessage();
assertNotNull(amqp.getBody());
- assertTrue(amqp.getBody() instanceof AmqpValue);
- assertTrue(((AmqpValue) amqp.getBody()).getValue() instanceof Binary);
- assertFalse(0 == ((Binary) ((AmqpValue) amqp.getBody()).getValue()).getLength());
+ assertTrue(amqp.getBody() instanceof Data);
+ assertTrue(((Data) amqp.getBody()).getValue() instanceof Binary);
+ assertFalse(0 == ((Binary) ((Data) amqp.getBody()).getValue()).getLength());
- Object value = deserialize(((Binary) ((AmqpValue) amqp.getBody()).getValue()).getArray());
+ Object value = deserialize((((Data) amqp.getBody()).getValue()).getArray());
assertNotNull(value);
assertTrue(value instanceof UUID);
}
@@ -591,10 +389,7 @@ public class JMSMappingOutboundTransformerTest {
ServerJMSTextMessage outbound = createTextMessage();
outbound.encode();
- EncodedMessage encoded = transform(outbound);
- assertNotNull(encoded);
-
- Message amqp = encoded.decode();
+ Message amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage()).getProtonMessage();
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof AmqpValue);
@@ -602,57 +397,12 @@ public class JMSMappingOutboundTransformerTest {
}
@Test
- public void testConvertTextMessageCreatesBodyUsingOriginalEncodingWithDataSection() throws Exception {
- String contentString = "myTextMessageContent";
- ServerJMSTextMessage outbound = createTextMessage(contentString);
- outbound.setShortProperty(JMS_AMQP_ORIGINAL_ENCODING, AMQP_DATA);
- outbound.encode();
-
- EncodedMessage encoded = transform(outbound);
- assertNotNull(encoded);
-
- Message amqp = encoded.decode();
-
- assertNotNull(amqp.getBody());
- assertTrue(amqp.getBody() instanceof Data);
- assertTrue(((Data) amqp.getBody()).getValue() instanceof Binary);
-
- Binary data = ((Data) amqp.getBody()).getValue();
- String contents = new String(data.getArray(), data.getArrayOffset(), data.getLength(), StandardCharsets.UTF_8);
- assertEquals(contentString, contents);
- }
-
- @Test
- public void testConvertTextMessageContentNotStoredCreatesBodyUsingOriginalEncodingWithDataSection() throws Exception {
- String contentString = "myTextMessageContent";
- ServerJMSTextMessage outbound = createTextMessage(contentString);
- outbound.setShortProperty(JMS_AMQP_ORIGINAL_ENCODING, AMQP_DATA);
- outbound.encode();
-
- EncodedMessage encoded = transform(outbound);
- assertNotNull(encoded);
-
- Message amqp = encoded.decode();
-
- assertNotNull(amqp.getBody());
- assertTrue(amqp.getBody() instanceof Data);
- assertTrue(((Data) amqp.getBody()).getValue() instanceof Binary);
-
- Binary data = ((Data) amqp.getBody()).getValue();
- String contents = new String(data.getArray(), data.getArrayOffset(), data.getLength(), StandardCharsets.UTF_8);
- assertEquals(contentString, contents);
- }
-
- @Test
public void testConvertTextMessageCreatesAmqpValueStringBody() throws Exception {
String contentString = "myTextMessageContent";
ServerJMSTextMessage outbound = createTextMessage(contentString);
outbound.encode();
- EncodedMessage encoded = transform(outbound);
- assertNotNull(encoded);
-
- Message amqp = encoded.decode();
+ Message amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage()).getProtonMessage();
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof AmqpValue);
@@ -665,10 +415,7 @@ public class JMSMappingOutboundTransformerTest {
ServerJMSTextMessage outbound = createTextMessage(contentString);
outbound.encode();
- EncodedMessage encoded = transform(outbound);
- assertNotNull(encoded);
-
- Message amqp = encoded.decode();
+ Message amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage()).getProtonMessage();
assertNotNull(amqp.getBody());
assertTrue(amqp.getBody() instanceof AmqpValue);
@@ -679,21 +426,16 @@ public class JMSMappingOutboundTransformerTest {
public void testConvertCompressedTextMessageCreatesDataSectionBody() throws Exception {
String contentString = "myTextMessageContent";
ServerJMSTextMessage outbound = createTextMessage(contentString, true);
- outbound.setShortProperty(JMS_AMQP_ORIGINAL_ENCODING, AMQP_DATA);
outbound.encode();
- EncodedMessage encoded = transform(outbound);
- assertNotNull(encoded);
-
- Message amqp = encoded.decode();
+ Message amqp = AMQPConverter.getInstance().fromCore(outbound.getInnerMessage()).getProtonMessage();
assertNotNull(amqp.getBody());
- assertTrue(amqp.getBody() instanceof Data);
- assertTrue(((Data) amqp.getBody()).getValue() instanceof Binary);
+ assertTrue(amqp.getBody() instanceof AmqpValue);
- Binary data = ((Data) amqp.getBody()).getValue();
- String contents = new String(data.getArray(), data.getArrayOffset(), data.getLength(), StandardCharsets.UTF_8);
- assertEquals(contentString, contents);
+ AmqpValue value = (AmqpValue)amqp.getBody();
+
+ assertEquals(contentString, value.getValue());
}
// ----- Test JMSDestination Handling -------------------------------------//
@@ -731,15 +473,12 @@ public class JMSMappingOutboundTransformerTest {
textMessage.setText("myTextMessageContent");
textMessage.setJMSDestination(jmsDestination);
- EncodedMessage encoded = transform(textMessage);
- assertNotNull(encoded);
-
- Message amqp = encoded.decode();
+ Message amqp = AMQPConverter.getInstance().fromCore(textMessage.getInnerMessage()).getProtonMessage();
MessageAnnotations ma = amqp.getMessageAnnotations();
Map<Symbol, Object> maMap = ma == null ? null : ma.getValue();
if (maMap != null) {
- Object actualValue = maMap.get(JMSMappingOutboundTransformer.JMS_DEST_TYPE_MSG_ANNOTATION);
+ Object actualValue = maMap.get(AMQPMessageSupport.JMS_DEST_TYPE_MSG_ANNOTATION);
assertEquals("Unexpected annotation value", expectedAnnotationValue, actualValue);
} else if (expectedAnnotationValue != null) {
fail("Expected annotation value, but there were no annotations");
@@ -785,15 +524,12 @@ public class JMSMappingOutboundTransformerTest {
textMessage.setText("myTextMessageContent");
textMessage.setJMSReplyTo(jmsReplyTo);
- EncodedMessage encoded = transform(textMessage);
- assertNotNull(encoded);
-
- Message amqp = encoded.decode();
+ Message amqp = AMQPConverter.getInstance().fromCore(textMessage.getInnerMessage()).getProtonMessage();
MessageAnnotations ma = amqp.getMessageAnnotations();
Map<Symbol, Object> maMap = ma == null ? null : ma.getValue();
if (maMap != null) {
- Object actualValue = maMap.get(JMSMappingOutboundTransformer.JMS_REPLY_TO_TYPE_MSG_ANNOTATION);
+ Object actualValue = maMap.get(AMQPMessageSupport.JMS_REPLY_TO_TYPE_MSG_ANNOTATION);
assertEquals("Unexpected annotation value", expectedAnnotationValue, actualValue);
} else if (expectedAnnotationValue != null) {
fail("Expected annotation value, but there were no annotations");
@@ -806,17 +542,6 @@ public class JMSMappingOutboundTransformerTest {
// ----- Utility Methods used for this Test -------------------------------//
- public EncodedMessage transform(ServerJMSMessage message) throws Exception {
- // Useful for testing but not recommended for real life use.
- ByteBuf nettyBuffer = Unpooled.buffer(1024);
- NettyWritable buffer = new NettyWritable(nettyBuffer);
-
- long messageFormat = transformer.transform(message, buffer);
-
- EncodedMessage encoded = new EncodedMessage(messageFormat, nettyBuffer.array(), nettyBuffer.arrayOffset() + nettyBuffer.readerIndex(), nettyBuffer.readableBytes());
-
- return encoded;
- }
private ServerDestination createDestination(byte destType) {
ServerDestination destination = null;
@@ -841,7 +566,7 @@ public class JMSMappingOutboundTransformerTest {
}
private ServerJMSMessage createMessage() {
- return new ServerJMSMessage(newMessage(org.apache.activemq.artemis.api.core.Message.DEFAULT_TYPE), 0);
+ return new ServerJMSMessage(newMessage(org.apache.activemq.artemis.api.core.Message.DEFAULT_TYPE));
}
private ServerJMSBytesMessage createBytesMessage() {
@@ -849,7 +574,7 @@ public class JMSMappingOutboundTransformerTest {
}
private ServerJMSBytesMessage createBytesMessage(boolean compression) {
- ServerJMSBytesMessage message = new ServerJMSBytesMessage(newMessage(org.apache.activemq.artemis.api.core.Message.BYTES_TYPE), 0);
+ ServerJMSBytesMessage message = new ServerJMSBytesMessage(newMessage(org.apache.activemq.artemis.api.core.Message.BYTES_TYPE));
if (compression) {
// TODO
@@ -863,7 +588,7 @@ public class JMSMappingOutboundTransformerTest {
}
private ServerJMSMapMessage createMapMessage(boolean compression) {
- ServerJMSMapMessage message = new ServerJMSMapMessage(newMessage(org.apache.activemq.artemis.api.core.Message.MAP_TYPE), 0);
+ ServerJMSMapMessage message = new ServerJMSMapMessage(newMessage(org.apache.activemq.artemis.api.core.Message.MAP_TYPE));
if (compression) {
// TODO
@@ -877,7 +602,7 @@ public class JMSMappingOutboundTransformerTest {
}
private ServerJMSStreamMessage createStreamMessage(boolean compression) {
- ServerJMSStreamMessage message = new ServerJMSStreamMessage(newMessage(org.apache.activemq.artemis.api.core.Message.STREAM_TYPE), 0);
+ ServerJMSStreamMessage message = new ServerJMSStreamMessage(newMessage(org.apache.activemq.artemis.api.core.Message.STREAM_TYPE));
if (compression) {
// TODO
@@ -895,7 +620,7 @@ public class JMSMappingOutboundTransformerTest {
}
private ServerJMSObjectMessage createObjectMessage(Serializable payload, boolean compression) {
- ServerJMSObjectMessage result = AMQPMessageSupport.createObjectMessage(idGenerator);
+ ServerJMSObjectMessage result = AMQPMessageSupport.createObjectMessage(0);
if (compression) {
// TODO
@@ -922,7 +647,7 @@ public class JMSMappingOutboundTransformerTest {
}
private ServerJMSTextMessage createTextMessage(String text, boolean compression) {
- ServerJMSTextMessage result = AMQPMessageSupport.createTextMessage(idGenerator);
+ ServerJMSTextMessage result = AMQPMessageSupport.createTextMessage(0);
if (compression) {
// TODO
@@ -943,8 +668,8 @@ public class JMSMappingOutboundTransformerTest {
}
}
- private ServerMessageImpl newMessage(byte messageType) {
- ServerMessageImpl message = new ServerMessageImpl(idGenerator.generateID(), 512);
+ private CoreMessage newMessage(byte messageType) {
+ CoreMessage message = new CoreMessage(0, 512);
message.setType(messageType);
((ResetLimitWrappedActiveMQBuffer) message.getBodyBuffer()).setMessage(null);
return message;
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/JMSTransformationSpeedComparisonTest.java
----------------------------------------------------------------------
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 99aab33..483f245 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
@@ -21,27 +21,23 @@ import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
-import org.apache.activemq.artemis.core.server.ServerMessage;
-import org.apache.activemq.artemis.protocol.amqp.converter.ProtonMessageConverter;
-import org.apache.activemq.artemis.protocol.amqp.util.NettyWritable;
-import org.apache.activemq.artemis.utils.IDGenerator;
-import org.apache.activemq.artemis.utils.SimpleIDGenerator;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.PooledByteBufAllocator;
+import org.apache.activemq.artemis.api.core.ICoreMessage;
+import org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessage;
+import org.apache.activemq.artemis.protocol.amqp.converter.AMQPConverter;
import org.apache.qpid.proton.Proton;
import org.apache.qpid.proton.amqp.Symbol;
import org.apache.qpid.proton.amqp.messaging.AmqpValue;
import org.apache.qpid.proton.amqp.messaging.ApplicationProperties;
import org.apache.qpid.proton.amqp.messaging.MessageAnnotations;
import org.apache.qpid.proton.message.Message;
-import org.apache.qpid.proton.message.ProtonJMessage;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestName;
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.Unpooled;
-
/**
* Some simple performance tests for the Message Transformers.
*/
@@ -51,16 +47,11 @@ public class JMSTransformationSpeedComparisonTest {
@Rule
public TestName test = new TestName();
- private IDGenerator idGenerator;
- private ProtonMessageConverter converter;
-
private final int WARM_CYCLES = 1000;
private final int PROFILE_CYCLES = 1000000;
@Before
public void setUp() {
- idGenerator = new SimpleIDGenerator(0);
- converter = new ProtonMessageConverter(idGenerator);
}
@Test
@@ -68,20 +59,20 @@ public class JMSTransformationSpeedComparisonTest {
Message message = Proton.message();
message.setBody(new AmqpValue("String payload for AMQP message conversion performance testing."));
- EncodedMessage encoded = encode(message);
+ AMQPMessage encoded = new AMQPMessage(message);
// Warm up
for (int i = 0; i < WARM_CYCLES; ++i) {
- ServerMessage intermediate = converter.inbound(encoded);
- encode(converter.outbound(intermediate, 1));
+ ICoreMessage intermediate = encoded.toCore();
+ encode(AMQPConverter.getInstance().fromCore(intermediate));
}
long totalDuration = 0;
long startTime = System.nanoTime();
for (int i = 0; i < PROFILE_CYCLES; ++i) {
- ServerMessage intermediate = converter.inbound(encoded);
- encode(converter.outbound(intermediate, 1));
+ ICoreMessage intermediate = encoded.toCore();
+ encode(AMQPConverter.getInstance().fromCore(intermediate));
}
totalDuration += System.nanoTime() - startTime;
@@ -99,20 +90,20 @@ public class JMSTransformationSpeedComparisonTest {
message.setContentType("text/plain");
message.setBody(new AmqpValue("String payload for AMQP message conversion performance testing."));
- EncodedMessage encoded = encode(message);
+ AMQPMessage encoded = new AMQPMessage(message);
// Warm up
for (int i = 0; i < WARM_CYCLES; ++i) {
- ServerMessage intermediate = converter.inbound(encoded);
- encode(converter.outbound(intermediate, 1));
+ ICoreMessage intermediate = encoded.toCore();
+ encode(AMQPConverter.getInstance().fromCore(intermediate));
}
long totalDuration = 0;
long startTime = System.nanoTime();
for (int i = 0; i < PROFILE_CYCLES; ++i) {
- ServerMessage intermediate = converter.inbound(encoded);
- encode(converter.outbound(intermediate, 1));
+ ICoreMessage intermediate = encoded.toCore();
+ encode(AMQPConverter.getInstance().fromCore(intermediate));
}
totalDuration += System.nanoTime() - startTime;
@@ -122,20 +113,20 @@ public class JMSTransformationSpeedComparisonTest {
@Test
public void testTypicalQpidJMSMessage() throws Exception {
- EncodedMessage encoded = encode(createTypicalQpidJMSMessage());
+ AMQPMessage encoded = new AMQPMessage(createTypicalQpidJMSMessage());
// Warm up
for (int i = 0; i < WARM_CYCLES; ++i) {
- ServerMessage intermediate = converter.inbound(encoded);
- encode(converter.outbound(intermediate, 1));
+ ICoreMessage intermediate = encoded.toCore();
+ encode(AMQPConverter.getInstance().fromCore(intermediate));
}
long totalDuration = 0;
long startTime = System.nanoTime();
for (int i = 0; i < PROFILE_CYCLES; ++i) {
- ServerMessage intermediate = converter.inbound(encoded);
- encode(converter.outbound(intermediate, 1));
+ ICoreMessage intermediate = encoded.toCore();
+ encode(AMQPConverter.getInstance().fromCore(intermediate));
}
totalDuration += System.nanoTime() - startTime;
@@ -145,20 +136,20 @@ public class JMSTransformationSpeedComparisonTest {
@Test
public void testComplexQpidJMSMessage() throws Exception {
- EncodedMessage encoded = encode(createComplexQpidJMSMessage());
+ AMQPMessage encoded = encode(createComplexQpidJMSMessage());
// Warm up
for (int i = 0; i < WARM_CYCLES; ++i) {
- ServerMessage intermediate = converter.inbound(encoded);
- encode(converter.outbound(intermediate, 1));
+ ICoreMessage intermediate = encoded.toCore();
+ encode(AMQPConverter.getInstance().fromCore(intermediate));
}
long totalDuration = 0;
long startTime = System.nanoTime();
for (int i = 0; i < PROFILE_CYCLES; ++i) {
- ServerMessage intermediate = converter.inbound(encoded);
- encode(converter.outbound(intermediate, 1));
+ ICoreMessage intermediate = encoded.toCore();
+ encode(AMQPConverter.getInstance().fromCore(intermediate));
}
totalDuration += System.nanoTime() - startTime;
@@ -168,18 +159,20 @@ public class JMSTransformationSpeedComparisonTest {
@Test
public void testTypicalQpidJMSMessageInBoundOnly() throws Exception {
- EncodedMessage encoded = encode(createTypicalQpidJMSMessage());
+ AMQPMessage encoded = encode(createTypicalQpidJMSMessage());
// Warm up
for (int i = 0; i < WARM_CYCLES; ++i) {
- converter.inbound(encoded);
+ ICoreMessage intermediate = encoded.toCore();
+ encode(AMQPConverter.getInstance().fromCore(intermediate));
}
long totalDuration = 0;
long startTime = System.nanoTime();
for (int i = 0; i < PROFILE_CYCLES; ++i) {
- converter.inbound(encoded);
+ ICoreMessage intermediate = encoded.toCore();
+ encode(AMQPConverter.getInstance().fromCore(intermediate));
}
totalDuration += System.nanoTime() - startTime;
@@ -190,19 +183,20 @@ public class JMSTransformationSpeedComparisonTest {
@Test
public void testTypicalQpidJMSMessageOutBoundOnly() throws Exception {
- EncodedMessage encoded = encode(createTypicalQpidJMSMessage());
- ServerMessage intermediate = converter.inbound(encoded);
+ AMQPMessage encoded = encode(createTypicalQpidJMSMessage());
// Warm up
for (int i = 0; i < WARM_CYCLES; ++i) {
- encode(converter.outbound(intermediate, 1));
+ ICoreMessage intermediate = encoded.toCore();
+ encode(AMQPConverter.getInstance().fromCore(intermediate));
}
long totalDuration = 0;
long startTime = System.nanoTime();
for (int i = 0; i < PROFILE_CYCLES; ++i) {
- encode(converter.outbound(intermediate, 1));
+ ICoreMessage intermediate = encoded.toCore();
+ encode(AMQPConverter.getInstance().fromCore(intermediate));
}
totalDuration += System.nanoTime() - startTime;
@@ -278,16 +272,16 @@ public class JMSTransformationSpeedComparisonTest {
return message;
}
- private EncodedMessage encode(Object target) {
- if (target instanceof ProtonJMessage) {
- ProtonJMessage amqp = (ProtonJMessage) target;
-
- ByteBuf nettyBuffer = Unpooled.buffer(1024);
- amqp.encode(new NettyWritable(nettyBuffer));
+ private AMQPMessage encode(Message message) {
+ return new AMQPMessage(message);
+ }
- return new EncodedMessage(0, nettyBuffer.array(), nettyBuffer.arrayOffset() + nettyBuffer.readerIndex(), nettyBuffer.readableBytes());
- } else {
- return null;
+ private void encode(AMQPMessage target) {
+ ByteBuf buf = PooledByteBufAllocator.DEFAULT.heapBuffer(1024);
+ try {
+ target.sendBuffer(buf, 1);
+ } finally {
+ buf.release();
}
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/MessageTransformationTest.java
----------------------------------------------------------------------
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 a5a2168..a73d29f 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
@@ -16,36 +16,28 @@
*/
package org.apache.activemq.artemis.protocol.amqp.converter.message;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
-import java.nio.ByteBuffer;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
-import org.apache.activemq.artemis.core.server.ServerMessage;
-import org.apache.activemq.artemis.protocol.amqp.converter.ProtonMessageConverter;
-import org.apache.activemq.artemis.utils.IDGenerator;
-import org.apache.activemq.artemis.utils.SimpleIDGenerator;
+import org.apache.activemq.artemis.api.core.ICoreMessage;
+import org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessage;
+import org.apache.activemq.artemis.protocol.amqp.converter.AMQPConverter;
import org.apache.qpid.proton.Proton;
import org.apache.qpid.proton.amqp.Symbol;
import org.apache.qpid.proton.amqp.messaging.AmqpValue;
import org.apache.qpid.proton.amqp.messaging.ApplicationProperties;
import org.apache.qpid.proton.amqp.messaging.MessageAnnotations;
-import org.apache.qpid.proton.amqp.messaging.Section;
-import org.apache.qpid.proton.codec.CompositeWritableBuffer;
-import org.apache.qpid.proton.codec.DroppingWritableBuffer;
-import org.apache.qpid.proton.codec.WritableBuffer;
import org.apache.qpid.proton.message.Message;
-import org.apache.qpid.proton.message.ProtonJMessage;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.TestName;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
/**
* Tests some basic encode / decode functionality on the transformers.
*/
@@ -54,72 +46,10 @@ public class MessageTransformationTest {
@Rule
public TestName test = new TestName();
- private IDGenerator idGenerator;
- private ProtonMessageConverter converter;
-
@Before
public void setUp() {
- idGenerator = new SimpleIDGenerator(0);
- converter = new ProtonMessageConverter(idGenerator);
}
- @Test
- public void testEncodeDecodeFidelity() throws Exception {
- Map<String, Object> applicationProperties = new HashMap<>();
- Map<Symbol, Object> messageAnnotations = new HashMap<>();
-
- applicationProperties.put("property-1", "string");
- applicationProperties.put("property-2", 512);
- applicationProperties.put("property-3", true);
-
- messageAnnotations.put(Symbol.valueOf("x-opt-jms-msg-type"), 0);
- messageAnnotations.put(Symbol.valueOf("x-opt-jms-dest"), 0);
-
- Message incomingMessage = Proton.message();
-
- incomingMessage.setAddress("queue://test-queue");
- incomingMessage.setDeliveryCount(1);
- incomingMessage.setApplicationProperties(new ApplicationProperties(applicationProperties));
- incomingMessage.setMessageAnnotations(new MessageAnnotations(messageAnnotations));
- incomingMessage.setCreationTime(System.currentTimeMillis());
- incomingMessage.setContentType("text/plain");
- incomingMessage.setBody(new AmqpValue("String payload for AMQP message conversion performance testing."));
-
- EncodedMessage encoded = encode(incomingMessage);
-
- ServerMessage outbound = converter.inbound(encoded);
- Message outboudMessage = ((EncodedMessage) converter.outbound(outbound, outbound.getLongProperty("JMSXDeliveryCount").intValue())).decode();
-
- // Test that message details are equal
- assertEquals(incomingMessage.getAddress(), outboudMessage.getAddress());
- assertEquals(incomingMessage.getDeliveryCount(), outboudMessage.getDeliveryCount());
- assertEquals(incomingMessage.getCreationTime(), outboudMessage.getCreationTime());
- assertEquals(incomingMessage.getContentType(), outboudMessage.getContentType());
-
- // Test Message annotations
- ApplicationProperties incomingApplicationProperties = incomingMessage.getApplicationProperties();
- ApplicationProperties outgoingApplicationProperties = outboudMessage.getApplicationProperties();
-
- assertEquals(incomingApplicationProperties.getValue(), outgoingApplicationProperties.getValue());
-
- // Test Message properties
- MessageAnnotations incomingMessageAnnotations = incomingMessage.getMessageAnnotations();
- MessageAnnotations outgoingMessageAnnotations = outboudMessage.getMessageAnnotations();
-
- assertEquals(incomingMessageAnnotations.getValue(), outgoingMessageAnnotations.getValue());
-
- // Test that bodies are equal
- assertTrue(incomingMessage.getBody() instanceof AmqpValue);
- assertTrue(outboudMessage.getBody() instanceof AmqpValue);
-
- AmqpValue incomingBody = (AmqpValue) incomingMessage.getBody();
- AmqpValue outgoingBody = (AmqpValue) outboudMessage.getBody();
-
- assertTrue(incomingBody.getValue() instanceof String);
- assertTrue(outgoingBody.getValue() instanceof String);
-
- assertEquals(incomingBody.getValue(), outgoingBody.getValue());
- }
@Test
public void testBodyOnlyEncodeDecode() throws Exception {
@@ -128,12 +58,10 @@ public class MessageTransformationTest {
incomingMessage.setBody(new AmqpValue("String payload for AMQP message conversion performance testing."));
- EncodedMessage encoded = encode(incomingMessage);
- ServerMessage outbound = converter.inbound(encoded);
- Message outboudMessage = ((EncodedMessage) converter.outbound(outbound, 1)).decode();
+ ICoreMessage core = new AMQPMessage(incomingMessage).toCore();
+ Message outboudMessage = AMQPConverter.getInstance().fromCore(core).getProtonMessage();
assertNull(outboudMessage.getHeader());
- assertNull(outboudMessage.getProperties());
}
@Test
@@ -144,9 +72,8 @@ public class MessageTransformationTest {
incomingMessage.setBody(new AmqpValue("String payload for AMQP message conversion performance testing."));
incomingMessage.setMessageId("ID:SomeQualifier:0:0:1");
- EncodedMessage encoded = encode(incomingMessage);
- ServerMessage outbound = converter.inbound(encoded);
- Message outboudMessage = ((EncodedMessage) converter.outbound(outbound, 1)).decode();
+ ICoreMessage core = new AMQPMessage(incomingMessage).toCore();
+ Message outboudMessage = AMQPConverter.getInstance().fromCore(core).getProtonMessage();
assertNull(outboudMessage.getHeader());
assertNotNull(outboudMessage.getProperties());
@@ -160,32 +87,9 @@ public class MessageTransformationTest {
incomingMessage.setBody(new AmqpValue("String payload for AMQP message conversion performance testing."));
incomingMessage.setDurable(true);
- EncodedMessage encoded = encode(incomingMessage);
- ServerMessage outbound = converter.inbound(encoded);
- Message outboudMessage = ((EncodedMessage) converter.outbound(outbound, 1)).decode();
-
- assertNotNull(outboudMessage.getHeader());
- assertNull(outboudMessage.getProperties());
- }
-
- @Test
- public void testMessageWithAmqpValueThatFailsJMSConversion() throws Exception {
-
- Message incomingMessage = Proton.message();
-
- incomingMessage.setBody(new AmqpValue(new Boolean(true)));
-
- EncodedMessage encoded = encode(incomingMessage);
- ServerMessage outbound = converter.inbound(encoded);
- Message outboudMessage = ((EncodedMessage) converter.outbound(outbound, 1)).decode();
+ ICoreMessage core = new AMQPMessage(incomingMessage).toCore();
+ Message outboudMessage = AMQPConverter.getInstance().fromCore(core).getProtonMessage();
- Section section = outboudMessage.getBody();
- assertNotNull(section);
- assertTrue(section instanceof AmqpValue);
- AmqpValue amqpValue = (AmqpValue) section;
- assertNotNull(amqpValue.getValue());
- assertTrue(amqpValue.getValue() instanceof Boolean);
- assertEquals(true, amqpValue.getValue());
}
@Test
@@ -233,32 +137,10 @@ public class MessageTransformationTest {
message.setMessageAnnotations(new MessageAnnotations(messageAnnotations));
message.setBody(new AmqpValue("String payload for AMQP message conversion performance testing."));
- EncodedMessage encoded = encode(message);
- ServerMessage outbound = converter.inbound(encoded);
- Message outboudMessage = ((EncodedMessage) converter.outbound(outbound, 1)).decode();
+ ICoreMessage core = new AMQPMessage(message).toCore();
+ Message outboudMessage = AMQPConverter.getInstance().fromCore(core).getProtonMessage();
- assertNotNull(outboudMessage.getHeader());
- assertNotNull(outboudMessage.getProperties());
- assertNotNull(outboudMessage.getMessageAnnotations());
- assertNotNull(outboudMessage.getApplicationProperties());
- assertNull(outboudMessage.getDeliveryAnnotations());
- assertNull(outboudMessage.getFooter());
-
- assertEquals(9, outboudMessage.getApplicationProperties().getValue().size());
+ assertEquals(10, outboudMessage.getApplicationProperties().getValue().size());
assertEquals(4, outboudMessage.getMessageAnnotations().getValue().size());
}
-
- private EncodedMessage encode(Message message) {
- ProtonJMessage amqp = (ProtonJMessage) message;
-
- ByteBuffer buffer = ByteBuffer.wrap(new byte[1024 * 4]);
- final DroppingWritableBuffer overflow = new DroppingWritableBuffer();
- int c = amqp.encode(new CompositeWritableBuffer(new WritableBuffer.ByteBufferWrapper(buffer), overflow));
- if (overflow.position() > 0) {
- buffer = ByteBuffer.wrap(new byte[1024 * 4 + overflow.position()]);
- c = amqp.encode(new WritableBuffer.ByteBufferWrapper(buffer));
- }
-
- return new EncodedMessage(1, buffer.array(), 0, c);
- }
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/message/AMQPMessageTest.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/message/AMQPMessageTest.java b/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/message/AMQPMessageTest.java
new file mode 100644
index 0000000..db40a8e
--- /dev/null
+++ b/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/message/AMQPMessageTest.java
@@ -0,0 +1,63 @@
+/**
+ * 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.message;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessage;
+import org.apache.activemq.artemis.protocol.amqp.util.NettyWritable;
+import org.apache.commons.collections.map.HashedMap;
+import org.apache.qpid.proton.amqp.UnsignedInteger;
+import org.apache.qpid.proton.amqp.messaging.ApplicationProperties;
+import org.apache.qpid.proton.amqp.messaging.Header;
+import org.apache.qpid.proton.amqp.messaging.Properties;
+import org.apache.qpid.proton.message.Message;
+import org.apache.qpid.proton.message.impl.MessageImpl;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class AMQPMessageTest {
+
+ @Test
+ public void testVerySimple() {
+ MessageImpl protonMessage = (MessageImpl) Message.Factory.create();
+ protonMessage.setHeader( new Header());
+ Properties properties = new Properties();
+ properties.setTo("someNiceLocal");
+ protonMessage.setProperties(properties);
+ protonMessage.getHeader().setDeliveryCount(new UnsignedInteger(7));
+ protonMessage.getHeader().setDurable(Boolean.TRUE);
+ protonMessage.setApplicationProperties(new ApplicationProperties(new HashedMap()));
+
+ ByteBuf nettyBuffer = Unpooled.buffer(1500);
+
+ protonMessage.encode(new NettyWritable(nettyBuffer));
+
+ byte[] bytes = new byte[nettyBuffer.writerIndex()];
+
+ nettyBuffer.readBytes(bytes);
+
+ AMQPMessage encode = new AMQPMessage(0, bytes);
+
+ Assert.assertEquals(7, encode.getHeader().getDeliveryCount().intValue());
+ Assert.assertEquals(true, encode.getHeader().getDurable());
+ Assert.assertEquals("someNiceLocal", encode.getAddress());
+
+
+ }
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTProtocolManager.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTProtocolManager.java b/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTProtocolManager.java
index 1f435ff..f4cba64 100644
--- a/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTProtocolManager.java
+++ b/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTProtocolManager.java
@@ -32,7 +32,6 @@ import org.apache.activemq.artemis.core.server.management.Notification;
import org.apache.activemq.artemis.core.server.management.NotificationListener;
import org.apache.activemq.artemis.spi.core.protocol.AbstractProtocolManager;
import org.apache.activemq.artemis.spi.core.protocol.ConnectionEntry;
-import org.apache.activemq.artemis.spi.core.protocol.MessageConverter;
import org.apache.activemq.artemis.spi.core.protocol.ProtocolManagerFactory;
import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
import org.apache.activemq.artemis.spi.core.remoting.Acceptor;
@@ -132,11 +131,6 @@ class MQTTProtocolManager extends AbstractProtocolManager<MqttMessage, MQTTInter
}
@Override
- public MessageConverter getConverter() {
- return null;
- }
-
- @Override
public void handshake(NettyServerConnection connection, ActiveMQBuffer buffer) {
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTPublishManager.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTPublishManager.java b/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTPublishManager.java
index f0385dc..67ef258 100644
--- a/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTPublishManager.java
+++ b/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTPublishManager.java
@@ -28,17 +28,19 @@ import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.Pair;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.io.IOCallback;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import org.apache.activemq.artemis.core.server.Queue;
import org.apache.activemq.artemis.core.server.ServerConsumer;
-import org.apache.activemq.artemis.core.server.ServerMessage;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
import org.apache.activemq.artemis.core.transaction.Transaction;
+import org.jboss.logging.Logger;
/**
* Handles MQTT Exactly Once (QoS level 2) Protocol.
*/
public class MQTTPublishManager {
+ private static final Logger logger = Logger.getLogger(MQTTPublishManager.class);
+
private static final String MANAGEMENT_QUEUE_PREFIX = "$sys.mqtt.queue.qos2.";
private SimpleString managementAddress;
@@ -112,19 +114,20 @@ public class MQTTPublishManager {
* to original ID and consumer in the Session state. This way we can look up the consumer Id and the message Id from
* the PubAck or PubRec message id. *
*/
- protected void sendMessage(ServerMessage message, ServerConsumer consumer, int deliveryCount) throws Exception {
+ protected void sendMessage(CoreMessage message, ServerConsumer consumer, int deliveryCount) throws Exception {
// This is to allow retries of PubRel.
if (isManagementConsumer(consumer)) {
sendPubRelMessage(message);
} else {
int qos = decideQoS(message, consumer);
if (qos == 0) {
- sendServerMessage((int) message.getMessageID(), (ServerMessageImpl) message, deliveryCount, qos);
+ // TODO-now: fix encoding
+ sendServerMessage((int) message.getMessageID(), message, deliveryCount, qos);
session.getServerSession().acknowledge(consumer.getID(), message.getMessageID());
} else if (qos == 1 || qos == 2) {
int mqttid = outboundStore.generateMqttId(message.getMessageID(), consumer.getID());
outboundStore.publish(mqttid, message.getMessageID(), consumer.getID());
- sendServerMessage(mqttid, (ServerMessageImpl) message, deliveryCount, qos);
+ sendServerMessage(mqttid, message, deliveryCount, qos);
} else {
// Client must have disconnected and it's Subscription QoS cleared
consumer.individualCancel(message.getMessageID(), false);
@@ -149,7 +152,7 @@ public class MQTTPublishManager {
*/
void sendInternal(int messageId, String topic, int qos, ByteBuf payload, boolean retain, boolean internal) throws Exception {
synchronized (lock) {
- ServerMessage serverMessage = MQTTUtil.createServerMessageFromByteBuf(session, topic, retain, qos, payload);
+ Message serverMessage = MQTTUtil.createServerMessageFromByteBuf(session, topic, retain, qos, payload);
if (qos > 0) {
serverMessage.setDurable(MQTTUtil.DURABLE_MESSAGES);
@@ -173,6 +176,7 @@ public class MQTTPublishManager {
}
tx.commit();
} catch (Throwable t) {
+ logger.warn(t.getMessage(), t);
tx.rollback();
throw t;
}
@@ -181,7 +185,7 @@ public class MQTTPublishManager {
}
}
- void sendPubRelMessage(ServerMessage message) {
+ void sendPubRelMessage(Message message) {
int messageId = message.getIntProperty(MQTTUtil.MQTT_MESSAGE_ID_KEY);
session.getProtocolHandler().sendPubRel(messageId);
}
@@ -190,7 +194,7 @@ public class MQTTPublishManager {
try {
Pair<Long, Long> ref = outboundStore.publishReceived(messageId);
if (ref != null) {
- ServerMessage m = MQTTUtil.createPubRelMessage(session, managementAddress, messageId);
+ Message m = MQTTUtil.createPubRelMessage(session, managementAddress, messageId);
session.getServerSession().send(m, true);
session.getServerSession().acknowledge(ref.getB(), ref.getA());
} else {
@@ -246,30 +250,30 @@ public class MQTTPublishManager {
}
}
- private void sendServerMessage(int messageId, ServerMessageImpl message, int deliveryCount, int qos) {
+ private void sendServerMessage(int messageId, CoreMessage message, int deliveryCount, int qos) {
String address = MQTTUtil.convertCoreAddressFilterToMQTT(message.getAddress().toString(), session.getWildcardConfiguration());
ByteBuf payload;
switch (message.getType()) {
case Message.TEXT_TYPE:
try {
- SimpleString text = message.getBodyBuffer().readNullableSimpleString();
+ SimpleString text = message.getReadOnlyBodyBuffer().readNullableSimpleString();
byte[] stringPayload = text.toString().getBytes("UTF-8");
payload = ByteBufAllocator.DEFAULT.buffer(stringPayload.length);
payload.writeBytes(stringPayload);
break;
} catch (UnsupportedEncodingException e) {
- log.warn("Unable to send message: " + message.getMessageID() + " Cause: " + e.getMessage());
+ log.warn("Unable to send message: " + message.getMessageID() + " Cause: " + e.getMessage(), e);
}
default:
- ActiveMQBuffer bufferDup = message.getBodyBufferDuplicate();
- payload = bufferDup.readBytes(message.getEndOfBodyPosition() - bufferDup.readerIndex()).byteBuf();
+ ActiveMQBuffer bufferDup = message.getReadOnlyBodyBuffer();
+ payload = bufferDup.readBytes(bufferDup.writerIndex()).byteBuf();
break;
}
session.getProtocolHandler().send(messageId, address, qos, payload, deliveryCount);
}
- private int decideQoS(ServerMessage message, ServerConsumer consumer) {
+ private int decideQoS(Message message, ServerConsumer consumer) {
int subscriptionQoS = -1;
try {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTRetainMessageManager.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTRetainMessageManager.java b/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTRetainMessageManager.java
index 596670b..0b52a0b 100644
--- a/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTRetainMessageManager.java
+++ b/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTRetainMessageManager.java
@@ -17,12 +17,12 @@
package org.apache.activemq.artemis.core.protocol.mqtt;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.server.BindingQueryResult;
import org.apache.activemq.artemis.core.server.MessageReference;
import org.apache.activemq.artemis.core.server.Queue;
import org.apache.activemq.artemis.core.server.RoutingContext;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.impl.RoutingContextImpl;
import org.apache.activemq.artemis.core.transaction.Transaction;
import org.apache.activemq.artemis.utils.LinkedListIterator;
@@ -44,7 +44,7 @@ public class MQTTRetainMessageManager {
* the subscription queue for the consumer. When a new retained message is received the message will be sent to
* the retained queue and the previous retain message consumed to remove it from the queue.
*/
- void handleRetainedMessage(ServerMessage message, String address, boolean reset, Transaction tx) throws Exception {
+ void handleRetainedMessage(Message message, String address, boolean reset, Transaction tx) throws Exception {
SimpleString retainAddress = new SimpleString(MQTTUtil.convertMQTTAddressFilterToCoreRetain(address, session.getWildcardConfiguration()));
Queue queue = session.getServer().locateQueue(retainAddress);
@@ -82,7 +82,7 @@ public class MQTTRetainMessageManager {
Queue retainedQueue = session.getServer().locateQueue(retainedQueueName);
try (LinkedListIterator<MessageReference> i = retainedQueue.iterator()) {
if (i.hasNext()) {
- ServerMessage message = i.next().getMessage().copy(session.getServer().getStorageManager().generateID());
+ Message message = i.next().getMessage().copy(session.getServer().getStorageManager().generateID());
sendToQueue(message, queue, tx);
}
}
@@ -95,7 +95,7 @@ public class MQTTRetainMessageManager {
tx.commit();
}
- private void sendToQueue(ServerMessage message, Queue queue, Transaction tx) throws Exception {
+ private void sendToQueue(Message message, Queue queue, Transaction tx) throws Exception {
RoutingContext context = new RoutingContextImpl(tx);
queue.route(message, context);
session.getServer().getPostOffice().processRoute(message, context, false);
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTSessionCallback.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTSessionCallback.java b/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTSessionCallback.java
index 548b62c..a5b908f 100644
--- a/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTSessionCallback.java
+++ b/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTSessionCallback.java
@@ -17,10 +17,12 @@
package org.apache.activemq.artemis.core.protocol.mqtt;
+
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import org.apache.activemq.artemis.core.server.MessageReference;
import org.apache.activemq.artemis.core.server.ServerConsumer;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.spi.core.protocol.SessionCallback;
import org.apache.activemq.artemis.spi.core.remoting.ReadyListener;
@@ -43,13 +45,13 @@ public class MQTTSessionCallback implements SessionCallback {
@Override
public int sendMessage(MessageReference reference,
- ServerMessage message,
+ Message message,
ServerConsumer consumer,
int deliveryCount) {
try {
- session.getMqttPublishManager().sendMessage(message, consumer, deliveryCount);
+ session.getMqttPublishManager().sendMessage((CoreMessage)message, consumer, deliveryCount);
} catch (Exception e) {
- log.warn("Unable to send message: " + message.getMessageID() + " Cause: " + e.getMessage());
+ log.warn("Unable to send message: " + message.getMessageID() + " Cause: " + e.getMessage(), e);
}
return 1;
}
@@ -70,7 +72,7 @@ public class MQTTSessionCallback implements SessionCallback {
@Override
public int sendLargeMessage(MessageReference reference,
- ServerMessage message,
+ Message message,
ServerConsumer consumer,
long bodySize,
int deliveryCount) {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTUtil.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTUtil.java b/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTUtil.java
index 7bc6b84..613fef3 100644
--- a/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTUtil.java
+++ b/artemis-protocols/artemis-mqtt-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/mqtt/MQTTUtil.java
@@ -24,12 +24,11 @@ import io.netty.handler.codec.mqtt.MqttMessageType;
import io.netty.handler.codec.mqtt.MqttPublishVariableHeader;
import io.netty.handler.codec.mqtt.MqttSubscribeMessage;
import io.netty.handler.codec.mqtt.MqttTopicSubscription;
+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.buffers.impl.ChannelBufferWrapper;
import org.apache.activemq.artemis.core.config.WildcardConfiguration;
-import org.apache.activemq.artemis.core.server.ServerMessage;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
/**
* A Utility Class for creating Server Side objects and converting MQTT concepts to/from Artemis.
@@ -93,13 +92,13 @@ public class MQTTUtil {
return MQTT_RETAIN_ADDRESS_PREFIX + MQTT_WILDCARD.convert(filter, wildcardConfiguration);
}
- private static ServerMessage createServerMessage(MQTTSession session,
+ private static ICoreMessage createServerMessage(MQTTSession session,
SimpleString address,
boolean retain,
int qos) {
long id = session.getServer().getStorageManager().generateID();
- ServerMessageImpl message = new ServerMessageImpl(id, DEFAULT_SERVER_MESSAGE_BUFFER_SIZE);
+ CoreMessage message = new CoreMessage(id, DEFAULT_SERVER_MESSAGE_BUFFER_SIZE);
message.setAddress(address);
message.putBooleanProperty(new SimpleString(MQTT_MESSAGE_RETAIN_KEY), retain);
message.putIntProperty(new SimpleString(MQTT_QOS_LEVEL_KEY), qos);
@@ -107,21 +106,20 @@ public class MQTTUtil {
return message;
}
- public static ServerMessage createServerMessageFromByteBuf(MQTTSession session,
+ public static Message createServerMessageFromByteBuf(MQTTSession session,
String topic,
boolean retain,
int qos,
ByteBuf payload) {
String coreAddress = convertMQTTAddressFilterToCore(topic, session.getWildcardConfiguration());
- ServerMessage message = createServerMessage(session, new SimpleString(coreAddress), retain, qos);
+ ICoreMessage message = createServerMessage(session, new SimpleString(coreAddress), retain, qos);
- // FIXME does this involve a copy?
- message.getBodyBuffer().writeBytes(new ChannelBufferWrapper(payload), payload.readableBytes());
+ message.getBodyBuffer().writeBytes(payload, 0, payload.readableBytes());
return message;
}
- public static ServerMessage createPubRelMessage(MQTTSession session, SimpleString address, int messageId) {
- ServerMessage message = createServerMessage(session, address, false, 1);
+ public static Message createPubRelMessage(MQTTSession session, SimpleString address, int messageId) {
+ Message message = createServerMessage(session, address, false, 1);
message.putIntProperty(new SimpleString(MQTTUtil.MQTT_MESSAGE_ID_KEY), messageId);
message.putIntProperty(new SimpleString(MQTTUtil.MQTT_MESSAGE_TYPE_KEY), MqttMessageType.PUBREL.value());
return message;
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireMessageConverter.java
----------------------------------------------------------------------
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 9b27b81..76e50ef 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
@@ -35,12 +35,12 @@ import java.util.zip.InflaterOutputStream;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
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.protocol.openwire.amq.AMQConsumer;
import org.apache.activemq.artemis.core.protocol.openwire.util.OpenWireUtil;
import org.apache.activemq.artemis.core.server.MessageReference;
-import org.apache.activemq.artemis.core.server.ServerMessage;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
import org.apache.activemq.artemis.reader.MessageUtil;
import org.apache.activemq.artemis.spi.core.protocol.MessageConverter;
import org.apache.activemq.artemis.utils.DataConstants;
@@ -69,7 +69,7 @@ import org.apache.activemq.util.MarshallingSupport;
import org.apache.activemq.wireformat.WireFormat;
import org.fusesource.hawtbuf.UTF8Buffer;
-public class OpenWireMessageConverter implements MessageConverter {
+public class OpenWireMessageConverter implements MessageConverter<OpenwireMessage> {
public static final String AMQ_PREFIX = "__HDR_";
public static final String AMQ_MSG_DLQ_DELIVERY_FAILURE_CAUSE_PROPERTY = AMQ_PREFIX + "dlqDeliveryFailureCause";
@@ -102,16 +102,26 @@ public class OpenWireMessageConverter implements MessageConverter {
}
@Override
- public Object outbound(ServerMessage message, int deliveryCount) {
- // TODO: implement this
+ public OpenwireMessage fromCore(ICoreMessage coreMessage) throws Exception {
return null;
}
@Override
- public ServerMessage inbound(Object message) throws Exception {
+ public ICoreMessage toCore(OpenwireMessage pureMessage) throws Exception {
+ return null;
+ }
+
+ // @Override
+ public Object outbound(org.apache.activemq.artemis.api.core.Message message, int deliveryCount) {
+ // TODO: implement this
+ return null;
+ }
+
+// @Override
+ public org.apache.activemq.artemis.api.core.Message inbound(Object message) throws Exception {
Message messageSend = (Message) message;
- ServerMessageImpl coreMessage = new ServerMessageImpl(-1, messageSend.getSize());
+ CoreMessage coreMessage = new CoreMessage(-1, messageSend.getSize());
String type = messageSend.getType();
if (type != null) {
@@ -157,7 +167,7 @@ public class OpenWireMessageConverter implements MessageConverter {
mdataIn.close();
TypedProperties props = new TypedProperties();
loadMapIntoProperties(props, map);
- props.encode(body);
+ props.encode(body.byteBuf());
break;
case org.apache.activemq.artemis.api.core.Message.OBJECT_TYPE:
if (messageCompressed) {
@@ -415,8 +425,9 @@ public class OpenWireMessageConverter implements MessageConverter {
}
public static MessageDispatch createMessageDispatch(MessageReference reference,
- ServerMessage message,
+ ICoreMessage message,
AMQConsumer consumer) throws IOException, JMSException {
+ // TODO-now: use new Encode here
ActiveMQMessage amqMessage = toAMQMessage(reference, message, consumer.getMarshaller(), consumer.getOpenwireDestination());
//we can use core message id for sequenceId
@@ -433,7 +444,7 @@ public class OpenWireMessageConverter implements MessageConverter {
}
private static ActiveMQMessage toAMQMessage(MessageReference reference,
- ServerMessage coreMessage,
+ ICoreMessage coreMessage,
WireFormat marshaller,
ActiveMQDestination actualDestination) throws IOException {
ActiveMQMessage amqMsg = null;
@@ -476,7 +487,7 @@ public class OpenWireMessageConverter implements MessageConverter {
}
amqMsg.setBrokerInTime(brokerInTime);
- ActiveMQBuffer buffer = coreMessage.getBodyBufferDuplicate();
+ ActiveMQBuffer buffer = coreMessage.getReadOnlyBodyBuffer();
Boolean compressProp = (Boolean) coreMessage.getObjectProperty(AMQ_MSG_COMPRESSED);
boolean isCompressed = compressProp == null ? false : compressProp.booleanValue();
amqMsg.setCompressed(isCompressed);
@@ -503,7 +514,7 @@ public class OpenWireMessageConverter implements MessageConverter {
TypedProperties mapData = new TypedProperties();
//it could be a null map
if (buffer.readableBytes() > 0) {
- mapData.decode(buffer);
+ mapData.decode(buffer.byteBuf());
Map<String, Object> map = mapData.getMap();
ByteArrayOutputStream out = new ByteArrayOutputStream(mapData.getEncodeSize());
OutputStream os = out;
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireProtocolManager.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireProtocolManager.java b/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireProtocolManager.java
index 5b62e3e..4292fe5 100644
--- a/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireProtocolManager.java
+++ b/artemis-protocols/artemis-openwire-protocol/src/main/java/org/apache/activemq/artemis/core/protocol/openwire/OpenWireProtocolManager.java
@@ -35,6 +35,7 @@ import org.apache.activemq.advisory.AdvisorySupport;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
import org.apache.activemq.artemis.api.core.BaseInterceptor;
import org.apache.activemq.artemis.api.core.Interceptor;
+import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.api.core.client.ClusterTopologyListener;
import org.apache.activemq.artemis.api.core.client.TopologyMember;
@@ -44,12 +45,10 @@ import org.apache.activemq.artemis.core.protocol.openwire.amq.AMQSession;
import org.apache.activemq.artemis.core.remoting.impl.netty.NettyServerConnection;
import org.apache.activemq.artemis.core.server.ActiveMQServer;
import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
-import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.core.server.cluster.ClusterConnection;
import org.apache.activemq.artemis.core.server.cluster.ClusterManager;
import org.apache.activemq.artemis.reader.MessageUtil;
import org.apache.activemq.artemis.spi.core.protocol.ConnectionEntry;
-import org.apache.activemq.artemis.spi.core.protocol.MessageConverter;
import org.apache.activemq.artemis.spi.core.protocol.ProtocolManager;
import org.apache.activemq.artemis.spi.core.protocol.ProtocolManagerFactory;
import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
@@ -236,11 +235,6 @@ public class OpenWireProtocolManager implements ProtocolManager<Interceptor>, Cl
}
@Override
- public MessageConverter getConverter() {
- return messageConverter;
- }
-
- @Override
public void removeHandler(String name) {
}
[04/17] activemq-artemis git commit: ARTEMIS-1009 Pure Message
Encoding.
Posted by cl...@apache.org.
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
index aa1ebf3..2b5ecaf 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ActiveMQServerImpl.java
@@ -51,6 +51,7 @@ import java.util.concurrent.atomic.AtomicInteger;
import org.apache.activemq.artemis.api.config.ActiveMQDefaultConfiguration;
import org.apache.activemq.artemis.api.core.ActiveMQDeleteAddressException;
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.client.impl.ClientSessionFactoryImpl;
import org.apache.activemq.artemis.core.config.BridgeConfiguration;
@@ -127,7 +128,6 @@ import org.apache.activemq.artemis.core.server.Queue;
import org.apache.activemq.artemis.core.server.QueueConfig;
import org.apache.activemq.artemis.core.server.QueueFactory;
import org.apache.activemq.artemis.core.server.QueueQueryResult;
-import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.core.server.SecuritySettingPlugin;
import org.apache.activemq.artemis.core.server.ServerSession;
import org.apache.activemq.artemis.core.server.ServiceComponent;
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/DivertImpl.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/DivertImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/DivertImpl.java
index 619036d..5b0d406 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/DivertImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/DivertImpl.java
@@ -25,7 +25,6 @@ import org.apache.activemq.artemis.core.server.Divert;
import org.apache.activemq.artemis.core.server.DivertConfigurationRoutingType;
import org.apache.activemq.artemis.core.server.RoutingContext;
import org.apache.activemq.artemis.api.core.RoutingType;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.cluster.Transformer;
import org.jboss.logging.Logger;
@@ -83,7 +82,7 @@ public class DivertImpl implements Divert {
}
@Override
- public void route(final ServerMessage message, final RoutingContext context) throws Exception {
+ public void route(final Message message, final RoutingContext context) throws Exception {
// We must make a copy of the message, otherwise things like returning credits to the page won't work
// properly on ack, since the original address will be overwritten
@@ -91,7 +90,7 @@ public class DivertImpl implements Divert {
logger.trace("Diverting message " + message + " into " + this);
}
- ServerMessage copy = null;
+ Message copy = null;
// Shouldn't copy if it's not routed anywhere else
if (!forwardAddress.equals(context.getAddress())) {
@@ -99,7 +98,7 @@ public class DivertImpl implements Divert {
copy = message.copy(id);
// This will set the original MessageId, and the original address
- copy.setOriginalHeaders(message, null, false);
+ copy.referenceOriginalMessage(message, null);
copy.setAddress(forwardAddress);
@@ -130,7 +129,7 @@ public class DivertImpl implements Divert {
}
@Override
- public void routeWithAck(ServerMessage message, RoutingContext context) throws Exception {
+ public void routeWithAck(Message message, RoutingContext context) throws Exception {
route(message, context);
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/JournalLoader.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/JournalLoader.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/JournalLoader.java
index 40cef50..4adb1b2 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/JournalLoader.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/JournalLoader.java
@@ -20,6 +20,7 @@ import javax.transaction.xa.Xid;
import java.util.List;
import java.util.Map;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.Pair;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.journal.Journal;
@@ -29,7 +30,6 @@ import org.apache.activemq.artemis.core.persistence.QueueBindingInfo;
import org.apache.activemq.artemis.core.persistence.impl.PageCountPending;
import org.apache.activemq.artemis.core.persistence.impl.journal.AddMessageRecord;
import org.apache.activemq.artemis.core.server.MessageReference;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.transaction.ResourceManager;
import org.apache.activemq.artemis.core.transaction.Transaction;
@@ -43,7 +43,7 @@ public interface JournalLoader {
void handleAddMessage(Map<Long, Map<Long, AddMessageRecord>> queueMap) throws Exception;
- void handleNoMessageReferences(Map<Long, ServerMessage> messages);
+ void handleNoMessageReferences(Map<Long, Message> messages);
void handleGroupingBindings(List<GroupingInfo> groupingInfos);
@@ -53,7 +53,7 @@ public interface JournalLoader {
ResourceManager resourceManager,
Map<SimpleString, List<Pair<byte[], Long>>> duplicateIDMap) throws Exception;
- void handlePreparedSendMessage(ServerMessage message, Transaction tx, long queueID) throws Exception;
+ void handlePreparedSendMessage(Message message, Transaction tx, long queueID) throws Exception;
void handlePreparedAcknowledge(long messageID,
List<MessageReference> referencesToAck,
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/LastValueQueue.java
----------------------------------------------------------------------
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 eb467ae..d059d2c 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
@@ -31,7 +31,6 @@ import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.core.server.MessageReference;
import org.apache.activemq.artemis.core.server.Queue;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.settings.HierarchicalRepository;
import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
import org.apache.activemq.artemis.core.transaction.Transaction;
@@ -74,7 +73,7 @@ public class LastValueQueue extends QueueImpl {
return;
}
- SimpleString prop = ref.getMessage().getSimpleStringProperty(Message.HDR_LAST_VALUE_NAME);
+ SimpleString prop = ref.getMessage().getSimpleStringProperty(Message.HDR_LAST_VALUE_NAME.toString());
if (prop != null) {
HolderReference hr = map.get(prop);
@@ -98,7 +97,7 @@ public class LastValueQueue extends QueueImpl {
@Override
public synchronized void addHead(final MessageReference ref, boolean scheduling) {
- SimpleString prop = ref.getMessage().getSimpleStringProperty(Message.HDR_LAST_VALUE_NAME);
+ SimpleString prop = ref.getMessage().getDeliveryAnnotationPropertyString(Message.HDR_LAST_VALUE_NAME);
if (prop != null) {
HolderReference hr = map.get(prop);
@@ -148,7 +147,7 @@ public class LastValueQueue extends QueueImpl {
@Override
protected void refRemoved(MessageReference ref) {
synchronized (this) {
- SimpleString prop = ref.getMessage().getSimpleStringProperty(Message.HDR_LAST_VALUE_NAME);
+ SimpleString prop = ref.getMessage().getSimpleStringProperty(Message.HDR_LAST_VALUE_NAME.toString());
if (prop != null) {
map.remove(prop);
@@ -223,7 +222,7 @@ public class LastValueQueue extends QueueImpl {
}
@Override
- public ServerMessage getMessage() {
+ public Message getMessage() {
return ref.getMessage();
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/MessageReferenceImpl.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/MessageReferenceImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/MessageReferenceImpl.java
index 6d9030e..bffb1ad 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/MessageReferenceImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/MessageReferenceImpl.java
@@ -18,11 +18,10 @@ package org.apache.activemq.artemis.core.server.impl;
import java.util.concurrent.atomic.AtomicInteger;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.core.server.MessageReference;
import org.apache.activemq.artemis.core.server.Queue;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.transaction.Transaction;
-import org.apache.activemq.artemis.utils.MemorySize;
/**
* Implementation of a MessageReference
@@ -35,7 +34,7 @@ public class MessageReferenceImpl implements MessageReference {
private volatile long scheduledDeliveryTime;
- private final ServerMessage message;
+ private final Message message;
private final Queue queue;
@@ -47,20 +46,7 @@ public class MessageReferenceImpl implements MessageReference {
// Static --------------------------------------------------------
- private static final int memoryOffset;
-
- static {
- // This is an estimate of how much memory a ServerMessageImpl takes up, exclusing body and properties
- // Note, it is only an estimate, it's not possible to be entirely sure with Java
- // This figure is calculated using the test utilities in org.apache.activemq.tests.unit.util.sizeof
- // The value is somewhat higher on 64 bit architectures, probably due to different alignment
-
- if (MemorySize.is64bitArch()) {
- memoryOffset = 48;
- } else {
- memoryOffset = 32;
- }
- }
+ private static final int memoryOffset = 64;
// Constructors --------------------------------------------------
@@ -80,7 +66,7 @@ public class MessageReferenceImpl implements MessageReference {
this.queue = queue;
}
- protected MessageReferenceImpl(final ServerMessage message, final Queue queue) {
+ public MessageReferenceImpl(final Message message, final Queue queue) {
this.message = message;
this.queue = queue;
@@ -155,7 +141,7 @@ public class MessageReferenceImpl implements MessageReference {
}
@Override
- public ServerMessage getMessage() {
+ public Message getMessage() {
return message;
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/PostOfficeJournalLoader.java
----------------------------------------------------------------------
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 005a994..717e2e2 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
@@ -57,7 +57,6 @@ import org.apache.activemq.artemis.core.server.Queue;
import org.apache.activemq.artemis.core.server.QueueConfig;
import org.apache.activemq.artemis.core.server.QueueFactory;
import org.apache.activemq.artemis.api.core.RoutingType;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.group.GroupingHandler;
import org.apache.activemq.artemis.core.server.group.impl.GroupBinding;
import org.apache.activemq.artemis.core.server.management.ManagementService;
@@ -233,8 +232,8 @@ public class PostOfficeJournalLoader implements JournalLoader {
}
@Override
- public void handleNoMessageReferences(Map<Long, ServerMessage> messages) {
- for (ServerMessage msg : messages.values()) {
+ public void handleNoMessageReferences(Map<Long, Message> messages) {
+ for (Message msg : messages.values()) {
if (msg.getRefCount() == 0) {
ActiveMQServerLogger.LOGGER.journalUnreferencedMessage(msg.getMessageID());
try {
@@ -284,7 +283,7 @@ public class PostOfficeJournalLoader implements JournalLoader {
}
@Override
- public void handlePreparedSendMessage(ServerMessage message, Transaction tx, long queueID) throws Exception {
+ public void handlePreparedSendMessage(Message message, Transaction tx, long queueID) throws Exception {
Queue queue = queues.get(queueID);
if (queue == null) {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/QueueImpl.java
----------------------------------------------------------------------
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 2943f15..bdbc57b 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
@@ -49,7 +49,6 @@ import org.apache.activemq.artemis.api.core.management.CoreNotificationType;
import org.apache.activemq.artemis.api.core.management.ManagementHelper;
import org.apache.activemq.artemis.core.filter.Filter;
import org.apache.activemq.artemis.core.io.IOCallback;
-import org.apache.activemq.artemis.core.message.impl.MessageImpl;
import org.apache.activemq.artemis.core.paging.cursor.PageSubscription;
import org.apache.activemq.artemis.core.paging.cursor.PagedReference;
import org.apache.activemq.artemis.core.persistence.QueueStatus;
@@ -71,7 +70,6 @@ import org.apache.activemq.artemis.core.server.Queue;
import org.apache.activemq.artemis.core.server.RoutingContext;
import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.core.server.ScheduledDeliveryHandler;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.cluster.RemoteQueueBinding;
import org.apache.activemq.artemis.core.server.cluster.impl.Redistributor;
import org.apache.activemq.artemis.core.server.management.ManagementService;
@@ -440,12 +438,12 @@ public class QueueImpl implements Queue {
}
@Override
- public void route(final ServerMessage message, final RoutingContext context) throws Exception {
+ public void route(final Message message, final RoutingContext context) throws Exception {
context.addQueue(address, this);
}
@Override
- public void routeWithAck(ServerMessage message, RoutingContext context) {
+ public void routeWithAck(Message message, RoutingContext context) {
context.addQueueWithAck(address, this);
}
@@ -922,7 +920,7 @@ public class QueueImpl implements Queue {
}
@Override
- public boolean hasMatchingConsumer(final ServerMessage message) {
+ public boolean hasMatchingConsumer(final Message message) {
for (ConsumerHolder holder : consumerList) {
Consumer consumer = holder.consumer;
@@ -1055,7 +1053,7 @@ public class QueueImpl implements Queue {
pageSubscription.ack((PagedReference) ref);
postAcknowledge(ref);
} else {
- ServerMessage message = ref.getMessage();
+ Message message = ref.getMessage();
boolean durableRef = message.isDurable() && durable;
@@ -1087,7 +1085,7 @@ public class QueueImpl implements Queue {
getRefsOperation(tx).addAck(ref);
} else {
- ServerMessage message = ref.getMessage();
+ Message message = ref.getMessage();
boolean durableRef = message.isDurable() && durable;
@@ -1111,7 +1109,7 @@ public class QueueImpl implements Queue {
@Override
public void reacknowledge(final Transaction tx, final MessageReference ref) throws Exception {
- ServerMessage message = ref.getMessage();
+ Message message = ref.getMessage();
if (message.isDurable() && durable) {
tx.setContainsPersistent();
@@ -1216,11 +1214,11 @@ public class QueueImpl implements Queue {
return expiryAddress;
}
- private SimpleString extractAddress(ServerMessage message) {
- if (message.containsProperty(Message.HDR_ORIG_MESSAGE_ID)) {
- return message.getSimpleStringProperty(Message.HDR_ORIGINAL_ADDRESS);
+ private SimpleString extractAddress(Message message) {
+ if (message.containsProperty(Message.HDR_ORIG_MESSAGE_ID.toString())) {
+ return message.getSimpleStringProperty(Message.HDR_ORIGINAL_ADDRESS.toString());
} else {
- return message.getAddress();
+ return message.getAddressSimpleString();
}
}
@@ -1244,7 +1242,9 @@ public class QueueImpl implements Queue {
List<MessageReference> scheduledMessages = scheduledDeliveryHandler.cancel(null);
if (scheduledMessages != null && scheduledMessages.size() > 0) {
for (MessageReference ref : scheduledMessages) {
- ref.getMessage().putLongProperty(Message.HDR_SCHEDULED_DELIVERY_TIME, ref.getScheduledDeliveryTime());
+
+ // TODO-now remove this, use something on Reference
+// ref.getMessage().putLongProperty(Message.HDR_SCHEDULED_DELIVERY_TIME, ref.getScheduledDeliveryTime());
ref.setScheduledDeliveryTime(0);
}
this.addHead(scheduledMessages, true);
@@ -2274,7 +2274,7 @@ public class QueueImpl implements Queue {
public boolean checkRedelivery(final MessageReference reference,
final long timeBase,
final boolean ignoreRedeliveryDelay) throws Exception {
- ServerMessage message = reference.getMessage();
+ Message message = reference.getMessage();
if (internalQueue) {
if (logger.isTraceEnabled()) {
@@ -2337,7 +2337,7 @@ public class QueueImpl implements Queue {
final boolean expiry,
final boolean rejectDuplicate,
final long... queueIDs) throws Exception {
- ServerMessage copyMessage = makeCopy(ref, expiry);
+ Message copyMessage = makeCopy(ref, expiry);
copyMessage.setAddress(toAddress);
@@ -2346,7 +2346,7 @@ public class QueueImpl implements Queue {
for (long id : queueIDs) {
buffer.putLong(id);
}
- copyMessage.putBytesProperty(MessageImpl.HDR_ROUTE_TO_IDS, buffer.array());
+ copyMessage.putBytesProperty(Message.HDR_ROUTE_TO_IDS.toString(), buffer.array());
}
postOffice.route(copyMessage, tx, false, rejectDuplicate);
@@ -2358,16 +2358,17 @@ public class QueueImpl implements Queue {
private void moveBetweenSnFQueues(final SimpleString queueSuffix,
final Transaction tx,
final MessageReference ref) throws Exception {
- ServerMessage copyMessage = makeCopy(ref, false, false);
+ Message copyMessage = makeCopy(ref, false, false);
byte[] oldRouteToIDs = null;
String targetNodeID;
Binding targetBinding;
+ // TODO-now: this needs to go away
// remove the old route
for (SimpleString propName : copyMessage.getPropertyNames()) {
- if (propName.startsWith(MessageImpl.HDR_ROUTE_TO_IDS)) {
- oldRouteToIDs = (byte[]) copyMessage.removeProperty(propName);
+ if (propName.startsWith(Message.HDR_ROUTE_TO_IDS)) {
+ oldRouteToIDs = (byte[]) copyMessage.removeProperty(propName.toString());
final String hashcodeToString = oldRouteToIDs.toString(); // don't use Arrays.toString(..) here
logger.debug("Removed property from message: " + propName + " = " + hashcodeToString + " (" + ByteBuffer.wrap(oldRouteToIDs).getLong() + ")");
@@ -2420,7 +2421,7 @@ public class QueueImpl implements Queue {
}
private Pair<String, Binding> locateTargetBinding(SimpleString queueSuffix,
- ServerMessage copyMessage,
+ Message copyMessage,
long oldQueueID) {
String targetNodeID = null;
Binding targetBinding = null;
@@ -2440,7 +2441,7 @@ public class QueueImpl implements Queue {
// parse the queue name of the remote queue binding to determine the node ID
String temp = remoteQueueBinding.getQueue().getName().toString();
targetNodeID = temp.substring(temp.lastIndexOf(".") + 1);
- logger.debug("Message formerly destined for " + oldQueueName + " with ID: " + oldQueueID + " on address " + copyMessage.getAddress() + " on node " + targetNodeID);
+ logger.debug("Message formerly destined for " + oldQueueName + " with ID: " + oldQueueID + " on address " + copyMessage.getAddressSimpleString() + " on node " + targetNodeID);
// now that we have the name of the queue we need to look through all the bindings again to find the new remote queue binding
for (Map.Entry<SimpleString, Binding> entry2 : postOffice.getAllBindings().entrySet()) {
@@ -2468,14 +2469,14 @@ public class QueueImpl implements Queue {
return new Pair<>(targetNodeID, targetBinding);
}
- private ServerMessage makeCopy(final MessageReference ref, final boolean expiry) throws Exception {
+ private Message makeCopy(final MessageReference ref, final boolean expiry) throws Exception {
return makeCopy(ref, expiry, true);
}
- private ServerMessage makeCopy(final MessageReference ref,
+ private Message makeCopy(final MessageReference ref,
final boolean expiry,
final boolean copyOriginalHeaders) throws Exception {
- ServerMessage message = ref.getMessage();
+ Message message = ref.getMessage();
/*
We copy the message and send that to the dla/expiry queue - this is
because otherwise we may end up with a ref with the same message id in the
@@ -2487,7 +2488,15 @@ public class QueueImpl implements Queue {
long newID = storageManager.generateID();
- ServerMessage copy = message.makeCopyForExpiryOrDLA(newID, ref, expiry, copyOriginalHeaders);
+ Message copy = message.copy(newID);
+
+ if (copyOriginalHeaders) {
+ copy.referenceOriginalMessage(message, ref != null ? ref.getQueue().getName().toString() : null);
+ }
+
+ if (expiry) {
+ copy.putLongProperty(Message.HDR_ACTUAL_EXPIRY_TIME.toString(), System.currentTimeMillis());
+ }
return copy;
}
@@ -2549,7 +2558,7 @@ public class QueueImpl implements Queue {
tx = new TransactionImpl(storageManager);
}
- ServerMessage copyMessage = makeCopy(ref, reason == AckReason.EXPIRED);
+ Message copyMessage = makeCopy(ref, reason == AckReason.EXPIRED);
copyMessage.setAddress(address);
@@ -2719,7 +2728,7 @@ public class QueueImpl implements Queue {
return;
}
- ServerMessage message;
+ Message message;
try {
message = ref.getMessage();
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/RefsOperation.java
----------------------------------------------------------------------
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 8e3a94b..0f3da07 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
@@ -22,12 +22,12 @@ import java.util.LinkedList;
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.persistence.StorageManager;
import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
import org.apache.activemq.artemis.core.server.MessageReference;
import org.apache.activemq.artemis.core.server.Queue;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.transaction.Transaction;
import org.apache.activemq.artemis.core.transaction.TransactionOperationAbstract;
import org.apache.activemq.artemis.core.transaction.impl.TransactionImpl;
@@ -122,7 +122,7 @@ public class RefsOperation extends TransactionOperationAbstract {
try {
Transaction ackedTX = new TransactionImpl(storageManager);
for (MessageReference ref : ackedRefs) {
- ServerMessage message = ref.getMessage();
+ Message message = ref.getMessage();
if (message.isDurable()) {
int durableRefCount = message.incrementDurableRefCount();
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ScaleDownHandler.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ScaleDownHandler.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ScaleDownHandler.java
index a5f96b1..4590c0b 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ScaleDownHandler.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ScaleDownHandler.java
@@ -39,7 +39,6 @@ import org.apache.activemq.artemis.api.core.client.ClientSessionFactory;
import org.apache.activemq.artemis.api.core.management.ManagementHelper;
import org.apache.activemq.artemis.api.core.management.ResourceNames;
import org.apache.activemq.artemis.core.client.impl.ClientSessionFactoryInternal;
-import org.apache.activemq.artemis.core.message.impl.MessageImpl;
import org.apache.activemq.artemis.core.paging.PagingManager;
import org.apache.activemq.artemis.core.paging.PagingStore;
import org.apache.activemq.artemis.core.paging.cursor.PageSubscription;
@@ -54,7 +53,6 @@ import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
import org.apache.activemq.artemis.core.server.MessageReference;
import org.apache.activemq.artemis.core.server.NodeManager;
import org.apache.activemq.artemis.core.server.Queue;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.cluster.ClusterControl;
import org.apache.activemq.artemis.core.server.cluster.ClusterController;
import org.apache.activemq.artemis.core.transaction.ResourceManager;
@@ -193,7 +191,7 @@ public class ScaleDownHandler {
buffer.putLong(queueID);
}
- message.putBytesProperty(MessageImpl.HDR_ROUTE_TO_IDS, buffer.array());
+ message.putBytesProperty(Message.HDR_ROUTE_TO_IDS.toString(), buffer.array());
if (logger.isDebugEnabled()) {
if (messageReference.isPaged()) {
@@ -264,11 +262,11 @@ public class ScaleDownHandler {
byte[] oldRouteToIDs = null;
List<SimpleString> propertiesToRemove = new ArrayList<>();
- message.removeProperty(MessageImpl.HDR_ROUTE_TO_IDS);
+ message.removeProperty(Message.HDR_ROUTE_TO_IDS.toString());
for (SimpleString propName : message.getPropertyNames()) {
- if (propName.startsWith(MessageImpl.HDR_ROUTE_TO_IDS)) {
+ if (propName.startsWith(Message.HDR_ROUTE_TO_IDS)) {
if (propName.toString().endsWith(propertyEnd)) {
- oldRouteToIDs = message.getBytesProperty(propName);
+ oldRouteToIDs = message.getBytesProperty(propName.toString());
}
propertiesToRemove.add(propName);
}
@@ -277,16 +275,17 @@ public class ScaleDownHandler {
// TODO: what if oldRouteToIDs == null ??
for (SimpleString propertyToRemove : propertiesToRemove) {
- message.removeProperty(propertyToRemove);
+ message.removeProperty(propertyToRemove.toString());
}
if (queueOnTarget) {
- message.putBytesProperty(MessageImpl.HDR_ROUTE_TO_IDS, oldRouteToIDs);
+ message.putBytesProperty(Message.HDR_ROUTE_TO_IDS.toString(), oldRouteToIDs);
} else {
- message.putBytesProperty(MessageImpl.HDR_SCALEDOWN_TO_IDS, oldRouteToIDs);
+ message.putBytesProperty(Message.HDR_SCALEDOWN_TO_IDS.toString(), oldRouteToIDs);
}
logger.debug("Scaling down message " + message + " from " + address + " to " + message.getAddress() + " on node " + targetNodeId);
+
producer.send(message.getAddress(), message);
messageCount++;
@@ -322,13 +321,13 @@ public class ScaleDownHandler {
List<TransactionOperation> allOperations = transaction.getAllOperations();
// Get the information of the Prepared TXs so it could replay the TXs
- Map<ServerMessage, Pair<List<Long>, List<Long>>> queuesToSendTo = new HashMap<>();
+ Map<Message, Pair<List<Long>, List<Long>>> queuesToSendTo = new HashMap<>();
for (TransactionOperation operation : allOperations) {
if (operation instanceof PostOfficeImpl.AddOperation) {
PostOfficeImpl.AddOperation addOperation = (PostOfficeImpl.AddOperation) operation;
List<MessageReference> refs = addOperation.getRelatedMessageReferences();
for (MessageReference ref : refs) {
- ServerMessage message = ref.getMessage();
+ Message message = ref.getMessage();
Queue queue = ref.getQueue();
long queueID;
String queueName = queue.getName().toString();
@@ -336,7 +335,7 @@ public class ScaleDownHandler {
if (queueIDs.containsKey(queueName)) {
queueID = queueIDs.get(queueName);
} else {
- queueID = createQueueIfNecessaryAndGetID(queueCreateSession, queue, message.getAddress());
+ queueID = createQueueIfNecessaryAndGetID(queueCreateSession, queue, message.getAddressSimpleString());
queueIDs.put(queueName, queueID); // store it so we don't have to look it up every time
}
Pair<List<Long>, List<Long>> queueIds = queuesToSendTo.get(message);
@@ -350,7 +349,7 @@ public class ScaleDownHandler {
RefsOperation refsOperation = (RefsOperation) operation;
List<MessageReference> refs = refsOperation.getReferencesToAcknowledge();
for (MessageReference ref : refs) {
- ServerMessage message = ref.getMessage();
+ Message message = ref.getMessage();
Queue queue = ref.getQueue();
long queueID;
String queueName = queue.getName().toString();
@@ -358,7 +357,7 @@ public class ScaleDownHandler {
if (queueIDs.containsKey(queueName)) {
queueID = queueIDs.get(queueName);
} else {
- queueID = createQueueIfNecessaryAndGetID(queueCreateSession, queue, message.getAddress());
+ queueID = createQueueIfNecessaryAndGetID(queueCreateSession, queue, message.getAddressSimpleString());
queueIDs.put(queueName, queueID); // store it so we don't have to look it up every time
}
Pair<List<Long>, List<Long>> queueIds = queuesToSendTo.get(message);
@@ -373,23 +372,23 @@ public class ScaleDownHandler {
}
ClientProducer producer = session.createProducer();
- for (Map.Entry<ServerMessage, Pair<List<Long>, List<Long>>> entry : queuesToSendTo.entrySet()) {
+ for (Map.Entry<Message, Pair<List<Long>, List<Long>>> entry : queuesToSendTo.entrySet()) {
List<Long> ids = entry.getValue().getA();
ByteBuffer buffer = ByteBuffer.allocate(ids.size() * 8);
for (Long id : ids) {
buffer.putLong(id);
}
- ServerMessage message = entry.getKey();
- message.putBytesProperty(MessageImpl.HDR_ROUTE_TO_IDS, buffer.array());
+ Message message = entry.getKey();
+ message.putBytesProperty(Message.HDR_ROUTE_TO_IDS.toString(), buffer.array());
ids = entry.getValue().getB();
if (ids.size() > 0) {
buffer = ByteBuffer.allocate(ids.size() * 8);
for (Long id : ids) {
buffer.putLong(id);
}
- message.putBytesProperty(MessageImpl.HDR_ROUTE_TO_ACK_IDS, buffer.array());
+ message.putBytesProperty(Message.HDR_ROUTE_TO_ACK_IDS.toString(), buffer.array());
}
- producer.send(message.getAddress(), message);
+ producer.send(message.getAddressSimpleString().toString(), message);
}
session.end(xid, XAResource.TMSUCCESS);
session.prepare(xid);
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerConsumerImpl.java
----------------------------------------------------------------------
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 bcc6df1..710a22b 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
@@ -31,12 +31,14 @@ import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
import org.apache.activemq.artemis.api.core.ActiveMQBuffers;
import org.apache.activemq.artemis.api.core.ActiveMQException;
import org.apache.activemq.artemis.api.core.ActiveMQIllegalStateException;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
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.BodyEncoder;
+import org.apache.activemq.artemis.core.message.LargeBodyEncoder;
+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;
import org.apache.activemq.artemis.core.postoffice.QueueBinding;
@@ -48,7 +50,6 @@ import org.apache.activemq.artemis.core.server.LargeServerMessage;
import org.apache.activemq.artemis.core.server.MessageReference;
import org.apache.activemq.artemis.core.server.Queue;
import org.apache.activemq.artemis.core.server.ServerConsumer;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.ServerSession;
import org.apache.activemq.artemis.core.server.SlowConsumerDetectionListener;
import org.apache.activemq.artemis.core.server.management.ManagementService;
@@ -205,7 +206,6 @@ public class ServerConsumerImpl implements ServerConsumer, ReadyListener {
this.creationTime = System.currentTimeMillis();
-
if (browseOnly) {
browserDeliverer = new BrowserDeliverer(messageQueue.browserIterator());
} else {
@@ -341,7 +341,7 @@ public class ServerConsumerImpl implements ServerConsumer, ReadyListener {
}
return HandleStatus.BUSY;
}
- final ServerMessage message = ref.getMessage();
+ final Message message = ref.getMessage();
if (filter != null && !filter.match(message)) {
if (logger.isTraceEnabled()) {
@@ -400,7 +400,7 @@ public class ServerConsumerImpl implements ServerConsumer, ReadyListener {
@Override
public void proceedDeliver(MessageReference reference) throws Exception {
try {
- ServerMessage message = reference.getMessage();
+ Message message = reference.getMessage();
if (message.isLargeMessage() && supportLargeMessage) {
if (largeMessageDeliverer == null) {
@@ -507,17 +507,15 @@ public class ServerConsumerImpl implements ServerConsumer, ReadyListener {
* there are no other messages to be delivered.
*/
@Override
- public void forceDelivery(final long sequence) {
- forceDelivery(sequence, new Runnable() {
- @Override
- public void run() {
- ServerMessage forcedDeliveryMessage = new ServerMessageImpl(storageManager.generateID(), 50);
+ public void forceDelivery(final long sequence) {
+ forceDelivery(sequence, () -> {
+ Message forcedDeliveryMessage = new CoreMessage(storageManager.generateID(), 50);
- forcedDeliveryMessage.putLongProperty(ClientConsumerImpl.FORCED_DELIVERY_MESSAGE, sequence);
- forcedDeliveryMessage.setAddress(messageQueue.getName());
+ forcedDeliveryMessage.putLongProperty(ClientConsumerImpl.FORCED_DELIVERY_MESSAGE, sequence);
+ forcedDeliveryMessage.setAddress(messageQueue.getName());
+
+ callback.sendMessage(null, forcedDeliveryMessage, ServerConsumerImpl.this, 0);
- callback.sendMessage(null, forcedDeliveryMessage, ServerConsumerImpl.this, 0);
- }
});
}
@@ -1018,7 +1016,7 @@ public class ServerConsumerImpl implements ServerConsumer, ReadyListener {
* @param ref
* @param message
*/
- private void deliverStandardMessage(final MessageReference ref, final ServerMessage message) {
+ private void deliverStandardMessage(final MessageReference ref, final Message message) throws ActiveMQException {
int packetSize = callback.sendMessage(ref, message, ServerConsumerImpl.this, ref.getDeliveryCount());
if (availableCredits != null) {
@@ -1070,7 +1068,7 @@ public class ServerConsumerImpl implements ServerConsumer, ReadyListener {
*/
private long positionPendingLargeMessage;
- private BodyEncoder context;
+ private LargeBodyEncoder context;
private LargeMessageDeliverer(final LargeServerMessage message, final MessageReference ref) throws Exception {
largeMessage = message;
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerMessageImpl.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerMessageImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerMessageImpl.java
deleted file mode 100644
index 39e77ca..0000000
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerMessageImpl.java
+++ /dev/null
@@ -1,341 +0,0 @@
-/*
- * 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.impl;
-
-import java.io.InputStream;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.apache.activemq.artemis.api.core.Message;
-import org.apache.activemq.artemis.api.core.SimpleString;
-import org.apache.activemq.artemis.core.message.impl.MessageImpl;
-import org.apache.activemq.artemis.core.paging.PagingStore;
-import org.apache.activemq.artemis.core.server.MessageReference;
-import org.apache.activemq.artemis.core.server.Queue;
-import org.apache.activemq.artemis.core.server.ServerMessage;
-import org.apache.activemq.artemis.utils.DataConstants;
-import org.apache.activemq.artemis.utils.MemorySize;
-import org.apache.activemq.artemis.utils.TypedProperties;
-
-public class ServerMessageImpl extends MessageImpl implements ServerMessage {
-
- private final AtomicInteger durableRefCount = new AtomicInteger();
-
- private final AtomicInteger refCount = new AtomicInteger();
-
- private PagingStore pagingStore;
-
- private static final int memoryOffset;
-
- private boolean persisted = false;
-
- static {
- // This is an estimate of how much memory a ServerMessageImpl takes up, exclusing body and properties
- // Note, it is only an estimate, it's not possible to be entirely sure with Java
- // This figure is calculated using the test utilities in org.apache.activemq.tests.unit.util.sizeof
- // The value is somewhat higher on 64 bit architectures, probably due to different alignment
-
- if (MemorySize.is64bitArch()) {
- memoryOffset = 352;
- } else {
- memoryOffset = 232;
- }
- }
-
- /*
- * Constructor for when reading from network
- */
- public ServerMessageImpl() {
- }
-
- /*
- * Construct a MessageImpl from storage, or notification, or before routing
- */
- public ServerMessageImpl(final long messageID, final int initialMessageBufferSize) {
- super(initialMessageBufferSize);
-
- this.messageID = messageID;
- }
-
- /*
- * Copy constructor
- */
- protected ServerMessageImpl(final ServerMessageImpl other) {
- super(other);
- }
-
- /*
- * Copy constructor
- */
- protected ServerMessageImpl(final ServerMessageImpl other, TypedProperties properties) {
- super(other, properties);
- }
-
- @Override
- public boolean isServerMessage() {
- return true;
- }
-
- @Override
- public ServerMessageImpl setMessageID(final long id) {
- messageID = id;
- return this;
- }
-
- @Override
- public MessageReference createReference(final Queue queue) {
- MessageReference ref = new MessageReferenceImpl(this, queue);
-
- return ref;
- }
-
- @Override
- public boolean hasInternalProperties() {
- return properties.hasInternalProperties();
- }
-
- @Override
- public int incrementRefCount() throws Exception {
- int count = refCount.incrementAndGet();
-
- if (pagingStore != null) {
- if (count == 1) {
- pagingStore.addSize(getMemoryEstimate() + MessageReferenceImpl.getMemoryEstimate());
- } else {
- pagingStore.addSize(MessageReferenceImpl.getMemoryEstimate());
- }
- }
-
- return count;
- }
-
- @Override
- public int decrementRefCount() throws Exception {
- int count = refCount.decrementAndGet();
-
- if (count < 0) {
- // this could happen on paged messages since they are not routed and incrementRefCount is never called
- return count;
- }
-
- if (pagingStore != null) {
- if (count == 0) {
- pagingStore.addSize(-getMemoryEstimate() - MessageReferenceImpl.getMemoryEstimate());
-
- if (buffer != null) {
- // release the buffer now
- buffer.byteBuf().release();
- }
- } else {
- pagingStore.addSize(-MessageReferenceImpl.getMemoryEstimate());
- }
- }
-
- return count;
- }
-
- @Override
- public int incrementDurableRefCount() {
- return durableRefCount.incrementAndGet();
- }
-
- @Override
- public int decrementDurableRefCount() {
- return durableRefCount.decrementAndGet();
- }
-
- @Override
- public int getRefCount() {
- return refCount.get();
- }
-
- @Override
- public boolean isLargeMessage() {
- return false;
- }
-
- private volatile int memoryEstimate = -1;
-
- @Override
- public int getMemoryEstimate() {
- if (memoryEstimate == -1) {
- memoryEstimate = ServerMessageImpl.memoryOffset + buffer.capacity() + properties.getMemoryOffset();
- }
-
- return memoryEstimate;
- }
-
- @Override
- public ServerMessage copy(final long newID) {
- ServerMessage m = new ServerMessageImpl(this);
-
- m.setMessageID(newID);
-
- return m;
- }
-
- @Override
- public ServerMessage copy() {
- // This is a simple copy, used only to avoid changing original properties
- return new ServerMessageImpl(this);
- }
-
- public ServerMessage makeCopyForExpiryOrDLA(final long newID,
- MessageReference originalReference,
- final boolean expiry) throws Exception {
- return makeCopyForExpiryOrDLA(newID, originalReference, expiry, true);
- }
-
- @Override
- public ServerMessage makeCopyForExpiryOrDLA(final long newID,
- MessageReference originalReference,
- final boolean expiry,
- final boolean copyOriginalHeaders) throws Exception {
- /*
- We copy the message and send that to the dla/expiry queue - this is
- because otherwise we may end up with a ref with the same message id in the
- queue more than once which would barf - this might happen if the same message had been
- expire from multiple subscriptions of a topic for example
- We set headers that hold the original message address, expiry time
- and original message id
- */
-
- ServerMessage copy = copy(newID);
-
- if (copyOriginalHeaders) {
- copy.setOriginalHeaders(this, originalReference, expiry);
- }
-
- return copy;
- }
-
- @Override
- public void setOriginalHeaders(final ServerMessage other,
- final MessageReference originalReference,
- final boolean expiry) {
- SimpleString originalQueue = other.getSimpleStringProperty(Message.HDR_ORIGINAL_QUEUE);
-
- if (originalQueue != null) {
- putStringProperty(Message.HDR_ORIGINAL_QUEUE, originalQueue);
- } else if (originalReference != null) {
- putStringProperty(Message.HDR_ORIGINAL_QUEUE, originalReference.getQueue().getName());
- }
-
- if (other.containsProperty(Message.HDR_ORIG_MESSAGE_ID)) {
- putStringProperty(Message.HDR_ORIGINAL_ADDRESS, other.getSimpleStringProperty(Message.HDR_ORIGINAL_ADDRESS));
-
- putLongProperty(Message.HDR_ORIG_MESSAGE_ID, other.getLongProperty(Message.HDR_ORIG_MESSAGE_ID));
- } else {
- putStringProperty(Message.HDR_ORIGINAL_ADDRESS, other.getAddress());
-
- putLongProperty(Message.HDR_ORIG_MESSAGE_ID, other.getMessageID());
- }
-
- // reset expiry
- setExpiration(0);
-
- if (expiry) {
- long actualExpiryTime = System.currentTimeMillis();
-
- putLongProperty(Message.HDR_ACTUAL_EXPIRY_TIME, actualExpiryTime);
- }
-
- bufferValid = false;
- }
-
- @Override
- public void setPagingStore(final PagingStore pagingStore) {
- this.pagingStore = pagingStore;
-
- // On the server side, we reset the address to point to the instance of address in the paging store
- // Otherwise each message would have its own copy of the address String which would take up more memory
- address = pagingStore.getAddress();
- }
-
- @Override
- public synchronized void forceAddress(final SimpleString address) {
- this.address = address;
- bufferValid = false;
- }
-
- @Override
- public PagingStore getPagingStore() {
- return pagingStore;
- }
-
- @Override
- public boolean storeIsPaging() {
- if (pagingStore != null) {
- return pagingStore.isPaging();
- } else {
- return false;
- }
- }
-
- @Override
- public String toString() {
- try {
- return "ServerMessage[messageID=" + messageID + ",durable=" + isDurable() + ",userID=" + getUserID() + ",priority=" + this.getPriority() + ", bodySize=" + this.getBodyBufferDuplicate().capacity() +
- ", timestamp=" + toDate(getTimestamp()) + ",expiration=" + toDate(getExpiration()) +
- ", durable=" + durable + ", address=" + getAddress() + ",properties=" + properties.toString() + "]@" + System.identityHashCode(this);
- } catch (Throwable e) {
- return "ServerMessage[messageID=" + messageID + "]";
- }
- }
-
- private static String toDate(long timestamp) {
- if (timestamp == 0) {
- return "0";
- } else {
- return new java.util.Date(timestamp).toString();
- }
-
- }
-
- @Override
- public InputStream getBodyInputStream() {
- return null;
- }
-
- // Encoding stuff
-
- @Override
- public void encodeMessageIDToBuffer() {
- // We first set the message id - this needs to be set on the buffer since this buffer will be re-used
-
- buffer.setLong(buffer.getInt(MessageImpl.BUFFER_HEADER_SPACE) + DataConstants.SIZE_INT, messageID);
- }
-
- @Override
- public byte[] getDuplicateIDBytes() {
- Object duplicateID = getDuplicateProperty();
-
- if (duplicateID == null) {
- return null;
- } else {
- if (duplicateID instanceof SimpleString) {
- return ((SimpleString) duplicateID).getData();
- } else {
- return (byte[]) duplicateID;
- }
- }
- }
-
- @Override
- public Object getDuplicateProperty() {
- return getObjectProperty(Message.HDR_DUPLICATE_DETECTION_ID);
- }
-}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerSessionImpl.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerSessionImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerSessionImpl.java
index 52ecda1..1cd19bb 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerSessionImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerSessionImpl.java
@@ -31,6 +31,7 @@ import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicLong;
+import org.apache.activemq.artemis.Closeable;
import org.apache.activemq.artemis.api.core.ActiveMQException;
import org.apache.activemq.artemis.api.core.ActiveMQIOErrorException;
import org.apache.activemq.artemis.api.core.ActiveMQIllegalStateException;
@@ -41,12 +42,10 @@ import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.api.core.client.ClientSession;
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.ClientMessageImpl;
import org.apache.activemq.artemis.core.exception.ActiveMQXAException;
import org.apache.activemq.artemis.core.filter.Filter;
import org.apache.activemq.artemis.core.filter.impl.FilterImpl;
import org.apache.activemq.artemis.core.io.IOCallback;
-import org.apache.activemq.artemis.core.message.impl.MessageInternal;
import org.apache.activemq.artemis.core.paging.PagingManager;
import org.apache.activemq.artemis.core.paging.PagingStore;
import org.apache.activemq.artemis.core.persistence.OperationContext;
@@ -66,14 +65,13 @@ import org.apache.activemq.artemis.core.server.ActiveMQServer;
import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
import org.apache.activemq.artemis.core.server.AddressQueryResult;
import org.apache.activemq.artemis.core.server.BindingQueryResult;
-import org.apache.activemq.artemis.core.server.LargeServerMessage;
import org.apache.activemq.artemis.core.server.MessageReference;
import org.apache.activemq.artemis.core.server.Queue;
import org.apache.activemq.artemis.core.server.QueueQueryResult;
import org.apache.activemq.artemis.core.server.RoutingContext;
import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.core.server.ServerConsumer;
-import org.apache.activemq.artemis.core.server.ServerMessage;
+
import org.apache.activemq.artemis.core.server.ServerSession;
import org.apache.activemq.artemis.core.server.TempQueueObserver;
import org.apache.activemq.artemis.core.server.management.ManagementService;
@@ -155,9 +153,6 @@ public class ServerSessionImpl implements ServerSession, FailureListener {
private final SimpleString managementAddress;
- // The current currentLargeMessage being processed
- private volatile LargeServerMessage currentLargeMessage;
-
protected final RoutingContext routingContext = new RoutingContextImpl(null);
protected final SessionCallback callback;
@@ -187,6 +182,8 @@ public class ServerSessionImpl implements ServerSession, FailureListener {
private Map<SimpleString, RoutingType> prefixes;
+ private Set<Closeable> closeables;
+
public ServerSessionImpl(final String name,
final String username,
final String password,
@@ -273,6 +270,14 @@ public class ServerSessionImpl implements ServerSession, FailureListener {
}
@Override
+ public void addCloseable(Closeable closeable) {
+ if (closeables == null) {
+ closeables = new HashSet<>();
+ }
+ this.closeables.add(closeable);
+ }
+
+ @Override
public void disableSecurity() {
this.securityEnabled = false;
}
@@ -376,11 +381,9 @@ public class ServerSessionImpl implements ServerSession, FailureListener {
consumers.clear();
- if (currentLargeMessage != null) {
- try {
- currentLargeMessage.deleteFile();
- } catch (Throwable error) {
- ActiveMQServerLogger.LOGGER.errorDeletingLargeMessageFile(error);
+ if (closeables != null) {
+ for (Closeable closeable : closeables) {
+ closeable.close(failed);
}
}
@@ -1272,30 +1275,12 @@ public class ServerSessionImpl implements ServerSession, FailureListener {
}
@Override
- public void sendLarge(final MessageInternal message) throws Exception {
- // need to create the LargeMessage before continue
- long id = storageManager.generateID();
-
- LargeServerMessage largeMsg = storageManager.createLargeMessage(id, message);
-
- if (logger.isTraceEnabled()) {
- logger.trace("sendLarge::" + largeMsg);
- }
-
- if (currentLargeMessage != null) {
- ActiveMQServerLogger.LOGGER.replacingIncompleteLargeMessage(currentLargeMessage.getMessageID());
- }
-
- currentLargeMessage = largeMsg;
- }
-
- @Override
- public RoutingStatus send(final ServerMessage message, final boolean direct) throws Exception {
+ public RoutingStatus send(final Message message, final boolean direct) throws Exception {
return send(message, direct, false);
}
@Override
- public RoutingStatus send(final ServerMessage message,
+ public RoutingStatus send(final Message message,
final boolean direct,
boolean noAutoCreateQueue) throws Exception {
return send(getCurrentTransaction(), message, direct, noAutoCreateQueue);
@@ -1303,7 +1288,7 @@ public class ServerSessionImpl implements ServerSession, FailureListener {
@Override
public RoutingStatus send(Transaction tx,
- final ServerMessage message,
+ final Message message,
final boolean direct,
boolean noAutoCreateQueue) throws Exception {
@@ -1319,19 +1304,20 @@ public class ServerSessionImpl implements ServerSession, FailureListener {
//case the id header already generated.
if (!message.isLargeMessage()) {
long id = storageManager.generateID();
-
+ // This will re-encode the message
message.setMessageID(id);
- message.encodeMessageIDToBuffer();
}
if (server.getConfiguration().isPopulateValidatedUser() && validatedUser != null) {
message.putStringProperty(Message.HDR_VALIDATED_USER, SimpleString.toSimpleString(validatedUser));
}
- SimpleString address = removePrefix(message.getAddress());
+ SimpleString originalAddress = message.getAddressSimpleString();
+
+ SimpleString address = removePrefix(message.getAddressSimpleString());
// In case the prefix was removed, we also need to update the message
- if (address != message.getAddress()) {
+ if (address != message.getAddressSimpleString()) {
message.setAddress(address);
}
@@ -1340,14 +1326,8 @@ public class ServerSessionImpl implements ServerSession, FailureListener {
}
if (address == null) {
- if (message.isDurable()) {
- // We need to force a re-encode when the message gets persisted or when it gets reloaded
- // it will have no address
- message.setAddress(defaultAddress);
- } else {
- // We don't want to force a re-encode when the message gets sent to the consumer
- message.setAddressTransient(defaultAddress);
- }
+ // We don't want to force a re-encode when the message gets sent to the consumer
+ message.setAddress(defaultAddress);
}
if (logger.isTraceEnabled()) {
@@ -1359,42 +1339,16 @@ public class ServerSessionImpl implements ServerSession, FailureListener {
throw ActiveMQMessageBundle.BUNDLE.noAddress();
}
- if (message.getAddress().equals(managementAddress)) {
+ if (message.getAddressSimpleString().equals(managementAddress)) {
// It's a management message
handleManagementMessage(tx, message, direct);
} else {
- result = doSend(tx, message, direct, noAutoCreateQueue);
+ result = doSend(tx, message, originalAddress, direct, noAutoCreateQueue);
}
return result;
}
- @Override
- public void sendContinuations(final int packetSize,
- final long messageBodySize,
- final byte[] body,
- final boolean continues) throws Exception {
- if (currentLargeMessage == null) {
- throw ActiveMQMessageBundle.BUNDLE.largeMessageNotInitialised();
- }
-
- // Immediately release the credits for the continuations- these don't contribute to the in-memory size
- // of the message
-
- currentLargeMessage.addBytes(body);
-
- if (!continues) {
- currentLargeMessage.releaseResources();
-
- if (messageBodySize >= 0) {
- currentLargeMessage.putLongProperty(Message.HDR_LARGE_BODY_SIZE, messageBodySize);
- }
-
- doSend(tx, currentLargeMessage, false, false);
-
- currentLargeMessage = null;
- }
- }
@Override
public void requestProducerCredits(SimpleString address, final int credits) throws Exception {
@@ -1566,10 +1520,6 @@ public class ServerSessionImpl implements ServerSession, FailureListener {
connectionFailed(me, failedOver);
}
- public void clearLargeMessage() {
- currentLargeMessage = null;
- }
-
private void installJMSHooks() {
}
@@ -1588,10 +1538,10 @@ public class ServerSessionImpl implements ServerSession, FailureListener {
}
private RoutingStatus handleManagementMessage(final Transaction tx,
- final ServerMessage message,
+ final Message message,
final boolean direct) throws Exception {
try {
- securityCheck(removePrefix(message.getAddress()), CheckType.MANAGE, this);
+ securityCheck(removePrefix(message.getAddressSimpleString()), CheckType.MANAGE, this);
} catch (ActiveMQException e) {
if (!autoCommitSends) {
tx.markAsRollbackOnly(e);
@@ -1599,9 +1549,9 @@ public class ServerSessionImpl implements ServerSession, FailureListener {
throw e;
}
- ServerMessage reply = managementService.handleMessage(message);
+ Message reply = managementService.handleMessage(message);
- SimpleString replyTo = message.getSimpleStringProperty(ClientMessageImpl.REPLYTO_HEADER_NAME);
+ SimpleString replyTo = message.getReplyTo();
if (replyTo != null) {
// TODO: move this check somewhere else? this is a JMS-specific bit of logic in the core impl
@@ -1612,7 +1562,7 @@ public class ServerSessionImpl implements ServerSession, FailureListener {
}
reply.setAddress(replyTo);
- doSend(tx, reply, direct, false);
+ doSend(tx, reply, null, direct, false);
}
return RoutingStatus.OK;
@@ -1669,21 +1619,25 @@ public class ServerSessionImpl implements ServerSession, FailureListener {
theTx.rollback();
}
+ @Override
public RoutingStatus doSend(final Transaction tx,
- final ServerMessage msg,
+ final Message msg,
+ final SimpleString originalAddress,
final boolean direct,
final boolean noAutoCreateQueue) throws Exception {
RoutingStatus result = RoutingStatus.OK;
- /**
- * TODO Checking message properties on each message is expensive. Instead we should update the API and Core Packets
- * to add the RoutingType information directly.
- */
- RoutingType routingType = null;
- if (msg.containsProperty(Message.HDR_ROUTING_TYPE)) {
- routingType = RoutingType.getType(msg.getByteProperty(Message.HDR_ROUTING_TYPE));
+ RoutingType routingType = msg.getRouteType();
+
+ if (originalAddress != null) {
+ if (originalAddress.toString().startsWith("anycast:")) {
+ routingType = RoutingType.ANYCAST;
+ } else if (originalAddress.toString().startsWith("multicast:")) {
+ routingType = RoutingType.MULTICAST;
+ }
}
- Pair<SimpleString, RoutingType> art = getAddressAndRoutingType(msg.getAddress(), routingType);
+
+ Pair<SimpleString, RoutingType> art = getAddressAndRoutingType(msg.getAddressSimpleString(), routingType);
// Consumer
// check the user has write access to this address.
@@ -1707,12 +1661,14 @@ public class ServerSessionImpl implements ServerSession, FailureListener {
result = postOffice.route(msg, routingContext, direct);
- Pair<UUID, AtomicLong> value = targetAddressInfos.get(msg.getAddress());
+ Pair<UUID, AtomicLong> value = targetAddressInfos.get(msg.getAddressSimpleString());
if (value == null) {
- targetAddressInfos.put(msg.getAddress(), new Pair<>(msg.getUserID(), new AtomicLong(1)));
+ // TODO-now: userID
+// targetAddressInfos.put(msg.getAddressSimpleString(), new Pair<>((UUID)msg.getUserID(), new AtomicLong(1)));
} else {
- value.setA(msg.getUserID());
+ // TODO-now: userID
+ value.setA((UUID)msg.getUserID());
value.getB().incrementAndGet();
}
} finally {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/ManagementService.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/ManagementService.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/ManagementService.java
index 0222928..29a2e47 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/ManagementService.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/ManagementService.java
@@ -21,6 +21,9 @@ import java.util.Set;
import java.util.concurrent.ScheduledExecutorService;
import org.apache.activemq.artemis.api.core.BroadcastGroupConfiguration;
+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;
import org.apache.activemq.artemis.api.core.TransportConfiguration;
import org.apache.activemq.artemis.api.core.management.ObjectNameBuilder;
@@ -41,8 +44,6 @@ import org.apache.activemq.artemis.core.server.ActiveMQServer;
import org.apache.activemq.artemis.core.server.Divert;
import org.apache.activemq.artemis.core.server.Queue;
import org.apache.activemq.artemis.core.server.QueueFactory;
-import org.apache.activemq.artemis.api.core.RoutingType;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.cluster.Bridge;
import org.apache.activemq.artemis.core.server.cluster.BroadcastGroup;
import org.apache.activemq.artemis.core.server.cluster.ClusterConnection;
@@ -128,5 +129,5 @@ public interface ManagementService extends NotificationService, ActiveMQComponen
Object[] getResources(Class<?> resourceType);
- ServerMessage handleMessage(ServerMessage message) throws Exception;
+ ICoreMessage handleMessage(Message message) throws Exception;
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java
index 55f2aea..f45aea7 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/management/impl/ManagementServiceImpl.java
@@ -33,7 +33,10 @@ import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ScheduledExecutorService;
import org.apache.activemq.artemis.api.core.BroadcastGroupConfiguration;
+import org.apache.activemq.artemis.api.core.ICoreMessage;
import org.apache.activemq.artemis.api.core.JsonUtil;
+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.TransportConfiguration;
import org.apache.activemq.artemis.api.core.management.AcceptorControl;
@@ -56,6 +59,7 @@ import org.apache.activemq.artemis.core.management.impl.BroadcastGroupControlImp
import org.apache.activemq.artemis.core.management.impl.ClusterConnectionControlImpl;
import org.apache.activemq.artemis.core.management.impl.DivertControlImpl;
import org.apache.activemq.artemis.core.management.impl.QueueControlImpl;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import org.apache.activemq.artemis.core.messagecounter.MessageCounter;
import org.apache.activemq.artemis.core.messagecounter.MessageCounterManager;
import org.apache.activemq.artemis.core.messagecounter.impl.MessageCounterManagerImpl;
@@ -71,13 +75,10 @@ import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
import org.apache.activemq.artemis.core.server.Divert;
import org.apache.activemq.artemis.core.server.Queue;
import org.apache.activemq.artemis.core.server.QueueFactory;
-import org.apache.activemq.artemis.api.core.RoutingType;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.cluster.Bridge;
import org.apache.activemq.artemis.core.server.cluster.BroadcastGroup;
import org.apache.activemq.artemis.core.server.cluster.ClusterConnection;
import org.apache.activemq.artemis.core.server.impl.AddressInfo;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
import org.apache.activemq.artemis.core.server.management.ManagementService;
import org.apache.activemq.artemis.core.server.management.Notification;
import org.apache.activemq.artemis.core.server.management.NotificationListener;
@@ -365,9 +366,11 @@ public class ManagementServiceImpl implements ManagementService {
}
@Override
- public ServerMessage handleMessage(final ServerMessage message) throws Exception {
+ public ICoreMessage handleMessage(Message message) throws Exception {
+ message = message.toCore();
// a reply message is sent with the result stored in the message body.
- ServerMessage reply = new ServerMessageImpl(storageManager.generateID(), 512);
+ CoreMessage reply = new CoreMessage(storageManager.generateID(), 512);
+ reply.setReplyTo(message.getReplyTo());
String resourceName = message.getStringProperty(ManagementHelper.HDR_RESOURCE_NAME);
if (logger.isDebugEnabled()) {
@@ -631,7 +634,7 @@ public class ManagementServiceImpl implements ManagementService {
long messageID = storageManager.generateID();
- ServerMessage notificationMessage = new ServerMessageImpl(messageID, 512);
+ Message notificationMessage = new CoreMessage(messageID, 512);
// Notification messages are always durable so the user can choose whether to add a durable queue to
// consume them in
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/transaction/TransactionDetail.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/transaction/TransactionDetail.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/transaction/TransactionDetail.java
index efe4cf9..0ee1b7d 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/transaction/TransactionDetail.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/transaction/TransactionDetail.java
@@ -26,8 +26,8 @@ import java.util.List;
import java.util.Map;
import org.apache.activemq.artemis.api.core.JsonUtil;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.core.server.MessageReference;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.transaction.impl.XidImpl;
import org.apache.activemq.artemis.utils.JsonLoader;
@@ -97,7 +97,7 @@ public abstract class TransactionDetail {
msgJson.add(KEY_MSG_OP_TYPE, opType);
- ServerMessage msg = ref.getMessage().copy();
+ Message msg = ref.getMessage().copy();
msgJson.add(KEY_MSG_TYPE, decodeMessageType(msg));
JsonUtil.addToObject(KEY_MSG_PROPERTIES, decodeMessageProperties(msg), msgJson);
@@ -108,7 +108,7 @@ public abstract class TransactionDetail {
return detailJson.build();
}
- public abstract String decodeMessageType(ServerMessage msg);
+ public abstract String decodeMessageType(Message msg);
- public abstract Map<String, Object> decodeMessageProperties(ServerMessage msg);
+ public abstract Map<String, Object> decodeMessageProperties(Message msg);
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/transaction/impl/CoreTransactionDetail.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/transaction/impl/CoreTransactionDetail.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/transaction/impl/CoreTransactionDetail.java
index 4730596..95036da 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/transaction/impl/CoreTransactionDetail.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/transaction/impl/CoreTransactionDetail.java
@@ -19,8 +19,8 @@ package org.apache.activemq.artemis.core.transaction.impl;
import javax.transaction.xa.Xid;
import java.util.Map;
+import org.apache.activemq.artemis.api.core.ICoreMessage;
import org.apache.activemq.artemis.api.core.Message;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.transaction.Transaction;
import org.apache.activemq.artemis.core.transaction.TransactionDetail;
@@ -31,8 +31,11 @@ public class CoreTransactionDetail extends TransactionDetail {
}
@Override
- public String decodeMessageType(ServerMessage msg) {
- int type = msg.getType();
+ public String decodeMessageType(Message msg) {
+ if (!(msg instanceof ICoreMessage)) {
+ return "N/A";
+ }
+ int type = ((ICoreMessage)msg).getType();
switch (type) {
case Message.DEFAULT_TYPE: // 0
return "Default";
@@ -52,7 +55,7 @@ public class CoreTransactionDetail extends TransactionDetail {
}
@Override
- public Map<String, Object> decodeMessageProperties(ServerMessage msg) {
+ public Map<String, Object> decodeMessageProperties(Message msg) {
return msg.toMap();
}
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/MessageConverter.java
----------------------------------------------------------------------
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 a342e13..a440e31 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
@@ -16,12 +16,12 @@
*/
package org.apache.activemq.artemis.spi.core.protocol;
-import org.apache.activemq.artemis.core.server.ServerMessage;
+import org.apache.activemq.artemis.api.core.ICoreMessage;
+import org.apache.activemq.artemis.api.core.Message;
-// TODO: use this interface properly on OpenWire
-public interface MessageConverter {
+public interface MessageConverter<ProtocolMessage extends Message> {
- ServerMessage inbound(Object messageInbound) throws Exception;
+ ICoreMessage toCore(ProtocolMessage pureMessage) throws Exception;
- Object outbound(ServerMessage messageOutbound, int deliveryCount) throws Exception;
+ ProtocolMessage fromCore(ICoreMessage coreMessage) throws Exception;
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/MessagePersister.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..14891f5
--- /dev/null
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/MessagePersister.java
@@ -0,0 +1,88 @@
+/**
+ * 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.spi.core.protocol;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
+import org.apache.activemq.artemis.api.core.Message;
+import org.apache.activemq.artemis.core.persistence.Persister;
+import org.jboss.logging.Logger;
+
+public class MessagePersister implements Persister<Message> {
+
+ 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 Map<Byte, Persister<Message>> protocols = new ConcurrentHashMap<>();
+
+
+ public static void registerProtocol(ProtocolManagerFactory manager) {
+ Persister<Message> messagePersister = manager.getPersister();
+ if (messagePersister == null) {
+ logger.warn("Cannot find persister for " + manager);
+ } else {
+ registerPersister(manager.getStoreID(), manager.getPersister());
+ }
+ }
+
+ public static void clearPersisters() {
+ protocols.clear();
+ }
+
+ public static void registerPersister(byte recordType, Persister<Message> persister) {
+ protocols.put(recordType, persister);
+ }
+
+ public static MessagePersister getInstance() {
+ return theInstance;
+ }
+
+
+ protected MessagePersister() {
+ }
+
+ protected byte getID() {
+ return (byte)0;
+ }
+
+ @Override
+ public int getEncodeSize(Message record) {
+ return 0;
+ }
+
+
+ /** Sub classes must add the first short as the protocol-id */
+ @Override
+ public void encode(ActiveMQBuffer buffer, Message record) {
+ buffer.writeByte(getID());
+ }
+
+ @Override
+ public Message decode(ActiveMQBuffer buffer, Message record) {
+ byte protocol = buffer.readByte();
+ Persister<Message> persister = protocols.get(protocol);
+ if (persister == null) {
+ throw new NullPointerException("couldn't find factory for type=" + protocol);
+ }
+ return persister.decode(buffer, record);
+ }
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/ProtocolManager.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/ProtocolManager.java b/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/ProtocolManager.java
index 890fbfe..e29d74d 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/ProtocolManager.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/ProtocolManager.java
@@ -22,12 +22,14 @@ import java.util.Map;
import io.netty.channel.ChannelPipeline;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
import org.apache.activemq.artemis.api.core.BaseInterceptor;
+import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.remoting.impl.netty.NettyServerConnection;
-import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.spi.core.remoting.Acceptor;
import org.apache.activemq.artemis.spi.core.remoting.Connection;
+/**
+ * Info: ProtocolManager is loaded by {@link org.apache.activemq.artemis.core.remoting.server.impl.RemotingServiceImpl#loadProtocolManagerFactories(Iterable)} */
public interface ProtocolManager<P extends BaseInterceptor> {
ProtocolManagerFactory<P> getFactory();
@@ -51,14 +53,6 @@ public interface ProtocolManager<P extends BaseInterceptor> {
boolean isProtocol(byte[] array);
/**
- * Gets the Message Converter towards ActiveMQ Artemis.
- * Notice this being null means no need to convert
- *
- * @return
- */
- MessageConverter getConverter();
-
- /**
* If this protocols accepts connectoins without an initial handshake.
* If true this protocol will be the failback case no other connections are made.
* New designed protocols should always require a handshake. This is only useful for legacy protocols.
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/ProtocolManagerFactory.java
----------------------------------------------------------------------
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 d3b1b2e..9574540 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
@@ -20,10 +20,25 @@ import java.util.List;
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.persistence.Persister;
import org.apache.activemq.artemis.core.server.ActiveMQServer;
public interface ProtocolManagerFactory<P extends BaseInterceptor> {
+ /** This is to be used to store the protocol-id on Messages.
+ * Messages are stored on their bare format.
+ * The protocol manager will be responsible to code or decode messages.
+ * The caveat here is that the first short-sized bytes need to be this constant. */
+ default byte getStoreID() {
+ return (byte)0;
+ }
+
+ default Persister<Message> getPersister() {
+ return null;
+ }
+
+
/**
* When you create the ProtocolManager, you should filter out any interceptors that won't belong
* to this Protocol.
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/SessionCallback.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/SessionCallback.java b/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/SessionCallback.java
index ee236c7..799e8b0 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/SessionCallback.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/spi/core/protocol/SessionCallback.java
@@ -16,10 +16,10 @@
*/
package org.apache.activemq.artemis.spi.core.protocol;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.server.MessageReference;
import org.apache.activemq.artemis.core.server.ServerConsumer;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.spi.core.remoting.ReadyListener;
public interface SessionCallback {
@@ -55,10 +55,10 @@ public interface SessionCallback {
// and I wanted to avoid re-fetching paged data in case of GCs on this specific case.
//
// Future developments may change this, but beware why I have chosen to keep the parameter separated here
- int sendMessage(MessageReference ref, ServerMessage message, ServerConsumer consumerID, int deliveryCount);
+ int sendMessage(MessageReference ref, Message message, ServerConsumer consumerID, int deliveryCount);
int sendLargeMessage(MessageReference reference,
- ServerMessage message,
+ Message message,
ServerConsumer consumerID,
long bodySize,
int deliveryCount);
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/resources/schema/artemis-configuration.xsd
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/resources/schema/artemis-configuration.xsd b/artemis-server/src/main/resources/schema/artemis-configuration.xsd
index 0c33a35..6fdef44 100644
--- a/artemis-server/src/main/resources/schema/artemis-configuration.xsd
+++ b/artemis-server/src/main/resources/schema/artemis-configuration.xsd
@@ -682,22 +682,6 @@
</xsd:annotation>
</xsd:element>
- <xsd:element name="perf-blast-pages" type="xsd:int" default="-1" maxOccurs="1" minOccurs="0">
- <xsd:annotation>
- <xsd:documentation>
- XXX Only meant to be used by project developers
- </xsd:documentation>
- </xsd:annotation>
- </xsd:element>
-
- <xsd:element name="run-sync-speed-test" type="xsd:boolean" default="false" maxOccurs="1" minOccurs="0">
- <xsd:annotation>
- <xsd:documentation>
- XXX Only meant to be used by project developers
- </xsd:documentation>
- </xsd:annotation>
- </xsd:element>
-
<xsd:element name="server-dump-interval" type="xsd:long" default="-1" maxOccurs="1" minOccurs="0">
<xsd:annotation>
<xsd:documentation>
[14/17] activemq-artemis git commit: ARTEMIS-1009 Pure Message
Encoding.
Posted by cl...@apache.org.
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/impl/CoreMessage.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/impl/CoreMessage.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/impl/CoreMessage.java
new file mode 100644
index 0000000..1e4087f
--- /dev/null
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/impl/CoreMessage.java
@@ -0,0 +1,1091 @@
+/**
+ * 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.message.impl;
+
+import java.io.InputStream;
+import java.nio.ByteBuffer;
+import java.util.LinkedList;
+import java.util.Set;
+
+import io.netty.buffer.ByteBuf;
+import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
+import org.apache.activemq.artemis.api.core.ActiveMQBuffers;
+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.RoutingType;
+import org.apache.activemq.artemis.api.core.SimpleString;
+import org.apache.activemq.artemis.api.core.encode.BodyType;
+import org.apache.activemq.artemis.core.buffers.impl.ChannelBufferWrapper;
+import org.apache.activemq.artemis.core.buffers.impl.ResetLimitWrappedActiveMQBuffer;
+import org.apache.activemq.artemis.core.message.LargeBodyEncoder;
+import org.apache.activemq.artemis.core.persistence.Persister;
+import org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl;
+import org.apache.activemq.artemis.reader.MessageUtil;
+import org.apache.activemq.artemis.utils.DataConstants;
+import org.apache.activemq.artemis.utils.TypedProperties;
+import org.apache.activemq.artemis.utils.UUID;
+import org.jboss.logging.Logger;
+
+/** Note: you shouldn't change properties using multi-threads. Change your properties before you can send it to multiple
+ * consumers */
+public class CoreMessage extends RefCountMessage implements ICoreMessage {
+
+ public static final int BUFFER_HEADER_SPACE = PacketImpl.PACKET_HEADERS_SIZE;
+
+ private volatile int memoryEstimate = -1;
+
+ private static final Logger logger = Logger.getLogger(CoreMessage.class);
+
+ // There's an integer with the number of bytes for the body
+ public static final int BODY_OFFSET = DataConstants.SIZE_INT;
+
+ /** That is the encode for the whole message, including properties..
+ it does not include the buffer for the Packet send and receive header on core protocol */
+ protected ByteBuf buffer;
+
+ private volatile boolean validBuffer = false;
+
+ protected volatile ResetLimitWrappedActiveMQBuffer writableBuffer;
+
+ Object body;
+
+ protected int endOfBodyPosition = -1;
+
+ protected int messageIDPosition = -1;
+
+ protected long messageID;
+
+ protected SimpleString address;
+
+ protected byte type;
+
+ protected boolean durable;
+
+ /**
+ * GMT milliseconds at which this message expires. 0 means never expires *
+ */
+ private long expiration;
+
+ protected long timestamp;
+
+ protected byte priority;
+
+ private UUID userID;
+
+ private int propertiesLocation = -1;
+
+ protected volatile TypedProperties properties;
+
+ public CoreMessage() {
+ }
+
+ /** On core there's no delivery annotation */
+ @Override
+ public Object getDeliveryAnnotationProperty(SimpleString key) {
+ return getObjectProperty(key);
+ }
+
+ /** On core there's no delivery annotation */
+ @Override
+ public Object removeDeliveryAnnoationProperty(SimpleString key) {
+ return removeProperty(key);
+ }
+
+ @Override
+ public void cleanupInternalProperties() {
+ if (properties.hasInternalProperties()) {
+ LinkedList<SimpleString> valuesToRemove = null;
+
+ for (SimpleString name : getPropertyNames()) {
+ // We use properties to establish routing context on clustering.
+ // However if the client resends the message after receiving, it needs to be removed
+ if ((name.startsWith(Message.HDR_ROUTE_TO_IDS) && !name.equals(Message.HDR_ROUTE_TO_IDS)) || (name.startsWith(Message.HDR_ROUTE_TO_ACK_IDS) && !name.equals(Message.HDR_ROUTE_TO_ACK_IDS))) {
+ if (valuesToRemove == null) {
+ valuesToRemove = new LinkedList<>();
+ }
+ valuesToRemove.add(name);
+ }
+ }
+
+ if (valuesToRemove != null) {
+ for (SimpleString removal : valuesToRemove) {
+ this.removeProperty(removal);
+ }
+ }
+ }
+ }
+
+ @Override
+ public boolean containsDeliveryAnnotationProperty(SimpleString property) {
+ checkProperties();
+ return properties.containsProperty(property);
+ }
+
+ @Override
+ public Persister<Message> getPersister() {
+ return CoreMessagePersister.getInstance();
+ }
+
+ public CoreMessage initBuffer(final int initialMessageBufferSize) {
+ buffer = ActiveMQBuffers.dynamicBuffer(initialMessageBufferSize).byteBuf();
+
+ // There's a bug in netty which means a dynamic buffer won't resize until you write a byte
+ buffer.writeByte((byte) 0);
+
+ buffer.setIndex(BODY_OFFSET, BODY_OFFSET);
+
+ return this;
+ }
+
+ @Override
+ public SimpleString getReplyTo() {
+ return getSimpleStringProperty(MessageUtil.REPLYTO_HEADER_NAME);
+ }
+
+ @Override
+ public RoutingType getRouteType() {
+ if (containsProperty(Message.HDR_ROUTING_TYPE)) {
+ return RoutingType.getType(getByteProperty(Message.HDR_ROUTING_TYPE));
+ }
+ return null;
+ }
+
+ @Override
+ public CoreMessage setReplyTo(SimpleString address) {
+
+ if (address == null) {
+ checkProperties();
+ properties.removeProperty(MessageUtil.REPLYTO_HEADER_NAME);
+ } else {
+ putStringProperty(MessageUtil.REPLYTO_HEADER_NAME, address);
+ }
+ return this;
+ }
+
+ @Override
+ public void receiveBuffer(ByteBuf buffer) {
+ this.buffer = buffer;
+ this.buffer.retain();
+ decode();
+ this.validBuffer = true;
+ }
+
+ @Override
+ public ActiveMQBuffer getReadOnlyBodyBuffer() {
+ checkEncode();
+ internalWritableBuffer();
+ return new ChannelBufferWrapper(buffer.slice(BODY_OFFSET, endOfBodyPosition - BUFFER_HEADER_SPACE).setIndex(0, endOfBodyPosition - BUFFER_HEADER_SPACE).asReadOnly());
+ }
+
+ /**
+ *
+ * @param sendBuffer
+ * @param deliveryCount Some protocols (AMQP) will have this as part of the message. ignored on core
+ */
+ @Override
+ public void sendBuffer(ByteBuf sendBuffer, int deliveryCount) {
+ checkEncode();
+ sendBuffer.writeBytes(buffer, 0, buffer.writerIndex());
+ }
+
+ private synchronized void checkEncode() {
+ if (!validBuffer) {
+ encode();
+ }
+ }
+
+ @Override
+ public Long getScheduledDeliveryTime() {
+ Object property = getObjectProperty(Message.HDR_SCHEDULED_DELIVERY_TIME);
+
+ if (property != null && property instanceof Number) {
+ return ((Number) property).longValue();
+ }
+
+ return null;
+ }
+
+ @Override
+ public InputStream getBodyInputStream() {
+ return null;
+ }
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ public ActiveMQBuffer getBodyBuffer() {
+ // if using the writable buffer, we must parse properties
+ checkProperties();
+
+ internalWritableBuffer();
+
+ return writableBuffer;
+ }
+
+ private void internalWritableBuffer() {
+ if (writableBuffer == null) {
+ writableBuffer = new ResetLimitWrappedActiveMQBuffer(BODY_OFFSET, buffer.duplicate(), this);
+ if (endOfBodyPosition > 0) {
+ writableBuffer.byteBuf().setIndex(BODY_OFFSET, endOfBodyPosition - BUFFER_HEADER_SPACE + BODY_OFFSET);
+ writableBuffer.resetReaderIndex();
+ }
+ }
+ }
+
+ @Override
+ public int getEndOfBodyPosition() {
+ if (endOfBodyPosition < 0) {
+ endOfBodyPosition = getBodyBuffer().writerIndex();
+ }
+ return endOfBodyPosition;
+ }
+
+
+ public TypedProperties getTypedProperties() {
+ return checkProperties();
+ }
+
+
+ @Override
+ public void messageChanged() {
+ validBuffer = false;
+ }
+
+ protected CoreMessage(CoreMessage other) {
+ this(other, other.properties);
+ }
+
+ public CoreMessage(long id, int bufferSize) {
+ this.initBuffer(bufferSize);
+ this.setMessageID(id);
+ }
+
+ protected CoreMessage(CoreMessage other, TypedProperties copyProperties) {
+ this.body = other.body;
+ this.endOfBodyPosition = other.endOfBodyPosition;
+ this.messageID = other.messageID;
+ this.address = other.address;
+ this.type = other.type;
+ this.durable = other.durable;
+ this.expiration = other.expiration;
+ this.timestamp = other.timestamp;
+ this.priority = other.priority;
+ this.userID = other.userID;
+ if (copyProperties != null) {
+ this.properties = new TypedProperties(copyProperties);
+ }
+ if (other.buffer != null) {
+ this.buffer = other.buffer.copy();
+ }
+ }
+
+ @Override
+ public void copyHeadersAndProperties(final Message msg) {
+ messageID = msg.getMessageID();
+ address = msg.getAddressSimpleString();
+ userID = (UUID)msg.getUserID();
+ type = msg.toCore().getType();
+ durable = msg.isDurable();
+ expiration = msg.getExpiration();
+ timestamp = msg.getTimestamp();
+ priority = msg.getPriority();
+
+ if (msg instanceof CoreMessage) {
+ properties = ((CoreMessage)msg).getTypedProperties();
+ } else {
+ // TODO-now: copy stuff
+ logger.warn("Must implement copyHeaderAndProperties for other messages");
+ }
+ }
+
+
+ @Override
+ public Message copy() {
+ checkEncode();
+ return new CoreMessage(this);
+ }
+
+ @Override
+ public Message copy(long newID) {
+ return copy().setMessageID(newID);
+ }
+
+ @Override
+ public long getExpiration() {
+ return expiration;
+ }
+
+ @Override
+ public long getTimestamp() {
+ return timestamp;
+ }
+
+ @Override
+ public CoreMessage setTimestamp(long timestamp) {
+ this.timestamp = timestamp;
+ return this;
+ }
+
+ @Override
+ public long getMessageID() {
+ return messageID;
+ }
+
+ @Override
+ public byte getPriority() {
+ return priority;
+ }
+
+ @Override
+ public UUID getUserID() {
+ return userID;
+ }
+
+ @Override
+ public CoreMessage setUserID(Object uuid) {
+ this.userID = (UUID)uuid;
+ return this;
+ }
+
+ @Override
+ public CoreMessage setMessageID(long messageID) {
+ this.messageID = messageID;
+ if (messageIDPosition >= 0 && validBuffer) {
+ buffer.setLong(messageIDPosition, messageID);
+ }
+ return this;
+ }
+
+ @Override
+ public CoreMessage setAddress(SimpleString address) {
+ if (validBuffer && !address.equals(this.address)) {
+ messageChanged();
+ }
+ this.address = address;
+ return this;
+ }
+
+ @Override
+ public SimpleString getAddressSimpleString() {
+ return address;
+ }
+
+
+ @Override
+ public CoreMessage setExpiration(long expiration) {
+ this.expiration = expiration;
+ messageChanged();
+ return this;
+ }
+
+ @Override
+ public CoreMessage setPriority(byte priority) {
+ this.priority = priority;
+ messageChanged();
+ return this;
+ }
+
+ public CoreMessage setUserID(UUID userID) {
+ this.userID = userID;
+ messageChanged();
+ return this;
+ }
+
+ /**
+ * I am keeping this synchronized as the decode of the Properties is lazy
+ */
+ protected TypedProperties checkProperties() {
+ if (properties == null) {
+ TypedProperties properties = new TypedProperties();
+ if (buffer != null && propertiesLocation >= 0) {
+ properties.decode(buffer.duplicate().readerIndex(propertiesLocation));
+ }
+ this.properties = properties;
+ }
+
+ return this.properties;
+ }
+
+ @Override
+ public int getMemoryEstimate() {
+ if (memoryEstimate == -1) {
+ memoryEstimate = memoryOffset +
+ (buffer != null ? buffer.capacity() : 0) +
+ (properties != null ? properties.getMemoryOffset() : 0);
+ }
+
+ return memoryEstimate;
+ }
+
+ @Override
+ public boolean isServerMessage() {
+ // even though CoreMessage is used both on server and client
+ // callers are interested in knowing if this is a server large message
+ // as it will be used to send the body from the files.
+ //
+ // this may need further refactoring when we improve large messages
+ // and expose that functionality to other protocols.
+ return false;
+ }
+
+ @Override
+ public byte getType() {
+ return type;
+ }
+
+ @Override
+ public CoreMessage setType(byte type) {
+ this.type = type;
+ return this;
+ }
+
+ private void decode() {
+ endOfBodyPosition = buffer.readInt();
+
+ buffer.skipBytes(endOfBodyPosition - BUFFER_HEADER_SPACE);
+
+ decodeHeadersAndProperties(buffer, true);
+ buffer.readerIndex(0);
+
+ internalWritableBuffer();
+ }
+
+
+ public void decodeHeadersAndProperties(final ByteBuf buffer) {
+ decodeHeadersAndProperties(buffer, false);
+ }
+
+ private void decodeHeadersAndProperties(final ByteBuf buffer, boolean lazyProperties) {
+ messageIDPosition = buffer.readerIndex();
+ messageID = buffer.readLong();
+
+ address = SimpleString.readNullableSimpleString(buffer);
+ if (buffer.readByte() == DataConstants.NOT_NULL) {
+ byte[] bytes = new byte[16];
+ buffer.readBytes(bytes);
+ userID = new UUID(UUID.TYPE_TIME_BASED, bytes);
+ } else {
+ userID = null;
+ }
+ type = buffer.readByte();
+ durable = buffer.readBoolean();
+ expiration = buffer.readLong();
+ timestamp = buffer.readLong();
+ priority = buffer.readByte();
+ if (lazyProperties) {
+ properties = null;
+ propertiesLocation = buffer.readerIndex();
+ } else {
+ properties = new TypedProperties();
+ properties.decode(buffer);
+ }
+ }
+
+
+ public synchronized CoreMessage encode() {
+
+ checkProperties();
+
+ if (writableBuffer != null) {
+ // The message encode takes into consideration the PacketImpl which is not part of this encoding
+ // so we always need to take the BUFFER_HEADER_SPACE from packet impl into consideration
+ endOfBodyPosition = writableBuffer.writerIndex() + BUFFER_HEADER_SPACE - 4;
+ } else if (endOfBodyPosition <= 0) {
+ endOfBodyPosition = BUFFER_HEADER_SPACE;
+ }
+
+ buffer.setIndex(0, 0);
+ buffer.writeInt(endOfBodyPosition);
+
+ // The end of body position
+ buffer.writerIndex(endOfBodyPosition - BUFFER_HEADER_SPACE + DataConstants.SIZE_INT);
+
+ encodeHeadersAndProperties(buffer);
+
+ validBuffer = true;
+
+ return this;
+ }
+
+ public void encodeHeadersAndProperties(final ByteBuf buffer) {
+ checkProperties();
+ messageIDPosition = buffer.writerIndex();
+ buffer.writeLong(messageID);
+ SimpleString.writeNullableSimpleString(buffer, address);
+ if (userID == null) {
+ buffer.writeByte(DataConstants.NULL);
+ } else {
+ buffer.writeByte(DataConstants.NOT_NULL);
+ buffer.writeBytes(userID.asBytes());
+ }
+ buffer.writeByte(type);
+ buffer.writeBoolean(durable);
+ buffer.writeLong(expiration);
+ buffer.writeLong(timestamp);
+ buffer.writeByte(priority);
+ properties.encode(buffer);
+ }
+
+ @Override
+ public int getHeadersAndPropertiesEncodeSize() {
+ return DataConstants.SIZE_LONG + // Message ID
+ DataConstants.SIZE_BYTE + // user id null?
+ (userID == null ? 0 : 16) +
+ /* address */SimpleString.sizeofNullableString(address) +
+ DataConstants./* Type */SIZE_BYTE +
+ DataConstants./* Durable */SIZE_BOOLEAN +
+ DataConstants./* Expiration */SIZE_LONG +
+ DataConstants./* Timestamp */SIZE_LONG +
+ DataConstants./* Priority */SIZE_BYTE +
+ /* PropertySize and Properties */checkProperties().getEncodeSize();
+ }
+
+
+ public static BodyType getBodyType(byte type) {
+ switch (type) {
+
+ case Message.DEFAULT_TYPE:
+ return BodyType.Undefined;
+
+ case Message.OBJECT_TYPE:
+ return BodyType.Object;
+
+ case Message.TEXT_TYPE:
+ return BodyType.Text;
+
+ case Message.BYTES_TYPE:
+ return BodyType.Text;
+
+ case Message.MAP_TYPE:
+ return BodyType.Map;
+
+ case Message.STREAM_TYPE:
+ return BodyType.Stream;
+
+ default:
+ return BodyType.Undefined;
+
+ }
+ }
+
+ @Override
+ public int getEncodeSize() {
+ checkEncode();
+ return buffer == null ? -1 : buffer.writerIndex();
+ }
+
+ @Override
+ public boolean isLargeMessage() {
+ return false;
+ }
+
+ @Override
+ public String getAddress() {
+ if (address == null) {
+ return null;
+ } else {
+ return address.toString();
+ }
+ }
+
+ @Override
+ public CoreMessage setAddress(String address) {
+ messageChanged();
+ this.address = SimpleString.toSimpleString(address);
+ return this;
+ }
+
+ @Override
+ public CoreMessage setBuffer(ByteBuf buffer) {
+ this.buffer = buffer;
+
+ return this;
+ }
+
+ @Override
+ public ByteBuf getBuffer() {
+ return buffer;
+ }
+
+ @Override
+ public boolean isDurable() {
+ return durable;
+ }
+
+ @Override
+ public CoreMessage setDurable(boolean durable) {
+ messageChanged();
+ this.durable = durable;
+ return this;
+ }
+
+
+ @Override
+ public CoreMessage putBooleanProperty(final String key, final boolean value) {
+ messageChanged();
+ checkProperties();
+ properties.putBooleanProperty(new SimpleString(key), value);
+ return this;
+ }
+
+ @Override
+ public CoreMessage putBooleanProperty(final SimpleString key, final boolean value) {
+ messageChanged();
+ checkProperties();
+ properties.putBooleanProperty(key, value);
+ return this;
+ }
+
+ @Override
+ public Boolean getBooleanProperty(final SimpleString key) throws ActiveMQPropertyConversionException {
+ checkProperties();
+ return properties.getBooleanProperty(key);
+ }
+
+ @Override
+ public Boolean getBooleanProperty(final String key) throws ActiveMQPropertyConversionException {
+ checkProperties();
+ return properties.getBooleanProperty(new SimpleString(key));
+ }
+
+
+ @Override
+ public CoreMessage putByteProperty(final SimpleString key, final byte value) {
+ messageChanged();
+ checkProperties();
+ properties.putByteProperty(key, value);
+ return this;
+ }
+
+
+ @Override
+ public CoreMessage putByteProperty(final String key, final byte value) {
+ messageChanged();
+ checkProperties();
+ properties.putByteProperty(new SimpleString(key), value);
+
+ return this;
+ }
+
+
+ @Override
+ public Byte getByteProperty(final SimpleString key) throws ActiveMQPropertyConversionException {
+ checkProperties();
+ return properties.getByteProperty(key);
+ }
+
+ @Override
+ public Byte getByteProperty(final String key) throws ActiveMQPropertyConversionException {
+ return getByteProperty(SimpleString.toSimpleString(key));
+ }
+
+ @Override
+ public CoreMessage putBytesProperty(final SimpleString key, final byte[] value) {
+ messageChanged();
+ checkProperties();
+ properties.putBytesProperty(key, value);
+
+ return this;
+ }
+
+ @Override
+ public CoreMessage putBytesProperty(final String key, final byte[] value) {
+ messageChanged();
+ checkProperties();
+ properties.putBytesProperty(new SimpleString(key), value);
+ return this;
+ }
+
+
+ @Override
+ public byte[] getBytesProperty(final SimpleString key) throws ActiveMQPropertyConversionException {
+ checkProperties();
+ return properties.getBytesProperty(key);
+ }
+
+ @Override
+ public byte[] getBytesProperty(final String key) throws ActiveMQPropertyConversionException {
+ return getBytesProperty(new SimpleString(key));
+ }
+
+ @Override
+ public CoreMessage putCharProperty(SimpleString key, char value) {
+ messageChanged();
+ checkProperties();
+ properties.putCharProperty(key, value);
+ return this;
+ }
+
+ @Override
+ public CoreMessage putCharProperty(String key, char value) {
+ messageChanged();
+ checkProperties();
+ properties.putCharProperty(new SimpleString(key), value);
+ return this;
+ }
+
+ @Override
+ public CoreMessage putShortProperty(final SimpleString key, final short value) {
+ messageChanged();
+ checkProperties();
+ properties.putShortProperty(key, value);
+ return this;
+ }
+
+ @Override
+ public CoreMessage putShortProperty(final String key, final short value) {
+ messageChanged();
+ checkProperties();
+ properties.putShortProperty(new SimpleString(key), value);
+ return this;
+ }
+
+
+ @Override
+ public CoreMessage putIntProperty(final SimpleString key, final int value) {
+ messageChanged();
+ checkProperties();
+ properties.putIntProperty(key, value);
+ return this;
+ }
+
+ @Override
+ public CoreMessage putIntProperty(final String key, final int value) {
+ messageChanged();
+ checkProperties();
+ properties.putIntProperty(new SimpleString(key), value);
+ return this;
+ }
+
+ @Override
+ public Integer getIntProperty(final SimpleString key) throws ActiveMQPropertyConversionException {
+ checkProperties();
+ return properties.getIntProperty(key);
+ }
+
+ @Override
+ public Integer getIntProperty(final String key) throws ActiveMQPropertyConversionException {
+ return getIntProperty(SimpleString.toSimpleString(key));
+ }
+
+
+ @Override
+ public CoreMessage putLongProperty(final SimpleString key, final long value) {
+ messageChanged();
+ checkProperties();
+ properties.putLongProperty(key, value);
+ return this;
+ }
+
+ @Override
+ public CoreMessage putLongProperty(final String key, final long value) {
+ messageChanged();
+ checkProperties();
+ properties.putLongProperty(new SimpleString(key), value);
+ return this;
+ }
+
+ @Override
+ public Long getLongProperty(final SimpleString key) throws ActiveMQPropertyConversionException {
+ checkProperties();
+ return properties.getLongProperty(key);
+ }
+
+ @Override
+ public Long getLongProperty(final String key) throws ActiveMQPropertyConversionException {
+ checkProperties();
+ return getLongProperty(SimpleString.toSimpleString(key));
+ }
+
+
+ @Override
+ public CoreMessage putFloatProperty(final SimpleString key, final float value) {
+ messageChanged();
+ checkProperties();
+ properties.putFloatProperty(key, value);
+ return this;
+ }
+
+ @Override
+ public CoreMessage putFloatProperty(final String key, final float value) {
+ messageChanged();
+ checkProperties();
+ properties.putFloatProperty(new SimpleString(key), value);
+ return this;
+ }
+
+ @Override
+ public CoreMessage putDoubleProperty(final SimpleString key, final double value) {
+ messageChanged();
+ checkProperties();
+ properties.putDoubleProperty(key, value);
+ return this;
+ }
+
+ @Override
+ public CoreMessage putDoubleProperty(final String key, final double value) {
+ messageChanged();
+ checkProperties();
+ properties.putDoubleProperty(new SimpleString(key), value);
+ return this;
+ }
+
+
+ @Override
+ public Double getDoubleProperty(final SimpleString key) throws ActiveMQPropertyConversionException {
+ messageChanged();
+ checkProperties();
+ return properties.getDoubleProperty(key);
+ }
+
+ @Override
+ public Double getDoubleProperty(final String key) throws ActiveMQPropertyConversionException {
+ checkProperties();
+ return getDoubleProperty(SimpleString.toSimpleString(key));
+ }
+
+ @Override
+ public CoreMessage putStringProperty(final SimpleString key, final SimpleString value) {
+ messageChanged();
+ checkProperties();
+ properties.putSimpleStringProperty(key, value);
+ return this;
+ }
+
+ @Override
+ public CoreMessage putStringProperty(final String key, final String value) {
+ messageChanged();
+ checkProperties();
+ properties.putSimpleStringProperty(new SimpleString(key), SimpleString.toSimpleString(value));
+ return this;
+ }
+
+ @Override
+ public CoreMessage putObjectProperty(final SimpleString key,
+ final Object value) throws ActiveMQPropertyConversionException {
+ messageChanged();
+ checkProperties();
+ TypedProperties.setObjectProperty(key, value, properties);
+ return this;
+ }
+
+ @Override
+ public Object getObjectProperty(final String key) {
+ checkProperties();
+ return getObjectProperty(SimpleString.toSimpleString(key));
+ }
+
+ @Override
+ public Object getObjectProperty(final SimpleString key) {
+ checkProperties();
+ return properties.getProperty(key);
+ }
+
+ @Override
+ public CoreMessage putObjectProperty(final String key, final Object value) throws ActiveMQPropertyConversionException {
+ messageChanged();
+ putObjectProperty(new SimpleString(key), value);
+ return this;
+ }
+
+ @Override
+ public Short getShortProperty(final SimpleString key) throws ActiveMQPropertyConversionException {
+ checkProperties();
+ return properties.getShortProperty(key);
+ }
+
+ @Override
+ public Short getShortProperty(final String key) throws ActiveMQPropertyConversionException {
+ checkProperties();
+ return properties.getShortProperty(new SimpleString(key));
+ }
+
+ @Override
+ public Float getFloatProperty(final SimpleString key) throws ActiveMQPropertyConversionException {
+ checkProperties();
+ return properties.getFloatProperty(key);
+ }
+
+ @Override
+ public Float getFloatProperty(final String key) throws ActiveMQPropertyConversionException {
+ checkProperties();
+ return properties.getFloatProperty(new SimpleString(key));
+ }
+
+ @Override
+ public String getStringProperty(final SimpleString key) throws ActiveMQPropertyConversionException {
+ SimpleString str = getSimpleStringProperty(key);
+
+ if (str == null) {
+ return null;
+ } else {
+ return str.toString();
+ }
+ }
+
+ @Override
+ public String getStringProperty(final String key) throws ActiveMQPropertyConversionException {
+ return getStringProperty(new SimpleString(key));
+ }
+
+ @Override
+ public SimpleString getSimpleStringProperty(final SimpleString key) throws ActiveMQPropertyConversionException {
+ checkProperties();
+ return properties.getSimpleStringProperty(key);
+ }
+
+ @Override
+ public SimpleString getSimpleStringProperty(final String key) throws ActiveMQPropertyConversionException {
+ checkProperties();
+ return properties.getSimpleStringProperty(new SimpleString(key));
+ }
+
+ @Override
+ public Object removeProperty(final SimpleString key) {
+ checkProperties();
+ Object oldValue = properties.removeProperty(key);
+ if (oldValue != null) {
+ messageChanged();
+ }
+ return oldValue;
+ }
+
+ @Override
+ public Object removeProperty(final String key) {
+ messageChanged();
+ checkProperties();
+ Object oldValue = properties.removeProperty(new SimpleString(key));
+ if (oldValue != null) {
+ messageChanged();
+ }
+ return oldValue;
+ }
+
+ @Override
+ public boolean containsProperty(final SimpleString key) {
+ checkProperties();
+ return properties.containsProperty(key);
+ }
+
+ @Override
+ public boolean containsProperty(final String key) {
+ checkProperties();
+ return properties.containsProperty(new SimpleString(key));
+ }
+
+ @Override
+ public Set<SimpleString> getPropertyNames() {
+ checkProperties();
+ return properties.getPropertyNames();
+ }
+
+ @Override
+ public LargeBodyEncoder getBodyEncoder() throws ActiveMQException {
+ return new DecodingContext();
+ }
+
+ private final class DecodingContext implements LargeBodyEncoder {
+
+ private int lastPos = 0;
+
+ private DecodingContext() {
+ }
+
+ @Override
+ public void open() {
+ }
+
+ @Override
+ public void close() {
+ }
+
+ @Override
+ public long getLargeBodySize() {
+ return buffer.writerIndex();
+ }
+
+ @Override
+ public int encode(final ByteBuffer bufferRead) throws ActiveMQException {
+ ActiveMQBuffer buffer = ActiveMQBuffers.wrappedBuffer(bufferRead);
+ return encode(buffer, bufferRead.capacity());
+ }
+
+ @Override
+ public int encode(final ActiveMQBuffer bufferOut, final int size) {
+ bufferOut.byteBuf().writeBytes(buffer, lastPos, size);
+ lastPos += size;
+ return size;
+ }
+ }
+
+ @Override
+ public int getPersistSize() {
+ checkEncode();
+ return buffer.writerIndex() + DataConstants.SIZE_INT;
+ }
+
+ @Override
+ public void persist(ActiveMQBuffer targetRecord) {
+ checkEncode();
+ targetRecord.writeInt(buffer.writerIndex());
+ targetRecord.writeBytes(buffer, 0, buffer.writerIndex());
+ }
+
+ @Override
+ public void reloadPersistence(ActiveMQBuffer record) {
+ int size = record.readInt();
+ initBuffer(size);
+ buffer.setIndex(0, 0).writeBytes(record.byteBuf(), size);
+ decode();
+
+ }
+
+ @Override
+ public CoreMessage toCore() {
+ return this;
+ }
+
+
+
+ @Override
+ public String toString() {
+ try {
+ return "CoreMessage[messageID=" + messageID + ",durable=" + isDurable() + ",userID=" + getUserID() + ",priority=" + this.getPriority() +
+ ", timestamp=" + toDate(getTimestamp()) + ",expiration=" + toDate(getExpiration()) +
+ ", durable=" + durable + ", address=" + getAddress() + ",properties=" + properties.toString() + "]@" + System.identityHashCode(this);
+ } catch (Throwable e) {
+ return "ServerMessage[messageID=" + messageID + "]";
+ }
+ }
+
+
+ private static String toDate(long timestamp) {
+ if (timestamp == 0) {
+ return "0";
+ } else {
+ return new java.util.Date(timestamp).toString();
+ }
+
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/impl/CoreMessagePersister.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/impl/CoreMessagePersister.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/impl/CoreMessagePersister.java
new file mode 100644
index 0000000..ddf39d2
--- /dev/null
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/impl/CoreMessagePersister.java
@@ -0,0 +1,66 @@
+/**
+ * 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.message.impl;
+
+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.persistence.Persister;
+import org.apache.activemq.artemis.utils.DataConstants;
+
+public class CoreMessagePersister implements Persister<Message> {
+
+ public static CoreMessagePersister theInstance = new CoreMessagePersister();
+
+ public static CoreMessagePersister getInstance() {
+ return theInstance;
+ }
+
+ protected CoreMessagePersister() {
+ }
+
+
+ @Override
+ public int getEncodeSize(Message record) {
+ return DataConstants.SIZE_BYTE + record.getPersistSize() +
+ SimpleString.sizeofNullableString(record.getAddressSimpleString()) + DataConstants.SIZE_LONG;
+ }
+
+
+ /** Sub classes must add the first short as the protocol-id */
+ @Override
+ public void encode(ActiveMQBuffer buffer, Message record) {
+ buffer.writeByte((byte)1);
+ buffer.writeLong(record.getMessageID());
+ buffer.writeNullableSimpleString(record.getAddressSimpleString());
+ record.persist(buffer);
+ }
+
+
+ @Override
+ public Message decode(ActiveMQBuffer buffer, Message record) {
+ // the caller must consume the first byte already, as that will be used to decide what persister (protocol) to use
+ long id = buffer.readLong();
+ SimpleString address = buffer.readNullableSimpleString();
+ record = new CoreMessage();
+ record.reloadPersistence(buffer);
+ record.setMessageID(id);
+ record.setAddress(address);
+ return record;
+ }
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/impl/MessageImpl.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/impl/MessageImpl.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/impl/MessageImpl.java
deleted file mode 100644
index f93086c..0000000
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/impl/MessageImpl.java
+++ /dev/null
@@ -1,1059 +0,0 @@
-/*
- * 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.message.impl;
-
-import java.nio.ByteBuffer;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.Unpooled;
-import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
-import org.apache.activemq.artemis.api.core.ActiveMQBuffers;
-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.SimpleString;
-import org.apache.activemq.artemis.core.buffers.impl.ChannelBufferWrapper;
-import org.apache.activemq.artemis.core.buffers.impl.ResetLimitWrappedActiveMQBuffer;
-import org.apache.activemq.artemis.core.message.BodyEncoder;
-import org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl;
-import org.apache.activemq.artemis.utils.ByteUtil;
-import org.apache.activemq.artemis.utils.DataConstants;
-import org.apache.activemq.artemis.utils.TypedProperties;
-import org.apache.activemq.artemis.utils.UUID;
-
-/**
- * A concrete implementation of a message
- * <p>
- * All messages handled by ActiveMQ Artemis core are of this type
- */
-public abstract class MessageImpl implements MessageInternal {
-
- public static final SimpleString HDR_ROUTE_TO_IDS = new SimpleString("_AMQ_ROUTE_TO");
-
- public static final SimpleString HDR_SCALEDOWN_TO_IDS = new SimpleString("_AMQ_SCALEDOWN_TO");
-
- public static final SimpleString HDR_ROUTE_TO_ACK_IDS = new SimpleString("_AMQ_ACK_ROUTE_TO");
-
- // used by the bridges to set duplicates
- public static final SimpleString HDR_BRIDGE_DUPLICATE_ID = new SimpleString("_AMQ_BRIDGE_DUP");
-
- public static final int BUFFER_HEADER_SPACE = PacketImpl.PACKET_HEADERS_SIZE;
-
- public static final int BODY_OFFSET = BUFFER_HEADER_SPACE + DataConstants.SIZE_INT;
-
- protected long messageID;
-
- protected SimpleString address;
-
- protected byte type;
-
- protected boolean durable;
-
- /**
- * GMT milliseconds at which this message expires. 0 means never expires *
- */
- private long expiration;
-
- protected long timestamp;
-
- protected TypedProperties properties;
-
- protected byte priority;
-
- protected volatile ActiveMQBuffer buffer;
-
- protected volatile ResetLimitWrappedActiveMQBuffer bodyBuffer;
-
- protected volatile boolean bufferValid;
-
- private int endOfBodyPosition = -1;
-
- private int endOfMessagePosition;
-
- private UUID userID;
-
- // Constructors --------------------------------------------------
-
- protected MessageImpl() {
- properties = new TypedProperties();
- }
-
- /**
- * overridden by the client message, we need access to the connection so we can create the appropriate ActiveMQBuffer.
- *
- * @param type
- * @param durable
- * @param expiration
- * @param timestamp
- * @param priority
- * @param initialMessageBufferSize
- */
- protected MessageImpl(final byte type,
- final boolean durable,
- final long expiration,
- final long timestamp,
- final byte priority,
- final int initialMessageBufferSize) {
- this();
- this.type = type;
- this.durable = durable;
- this.expiration = expiration;
- this.timestamp = timestamp;
- this.priority = priority;
- createBody(initialMessageBufferSize);
- }
-
- protected MessageImpl(final int initialMessageBufferSize) {
- this();
- createBody(initialMessageBufferSize);
- }
-
- /*
- * Copy constructor
- */
- protected MessageImpl(final MessageImpl other) {
- this(other, other.getProperties());
- }
-
- /*
- * Copy constructor
- */
- protected MessageImpl(final MessageImpl other, TypedProperties properties) {
- messageID = other.getMessageID();
- userID = other.getUserID();
- address = other.getAddress();
- type = other.getType();
- durable = other.isDurable();
- expiration = other.getExpiration();
- timestamp = other.getTimestamp();
- priority = other.getPriority();
- this.properties = new TypedProperties(properties);
-
- // This MUST be synchronized using the monitor on the other message to prevent it running concurrently
- // with getEncodedBuffer(), otherwise can introduce race condition when delivering concurrently to
- // many subscriptions and bridging to other nodes in a cluster
- synchronized (other) {
- bufferValid = false;
- endOfBodyPosition = -1;
- endOfMessagePosition = other.endOfMessagePosition;
-
- if (other.buffer != null) {
- // We need to copy the underlying buffer too, since the different messsages thereafter might have different
- // properties set on them, making their encoding different
- buffer = other.buffer.copy(0, other.buffer.capacity());
-
- buffer.setIndex(other.buffer.readerIndex(), buffer.capacity());
-
- bodyBuffer = new ResetLimitWrappedActiveMQBuffer(BODY_OFFSET, buffer, this);
-
- bodyBuffer.readerIndex(BODY_OFFSET);
- bodyBuffer.writerIndex(other.getBodyBuffer().writerIndex());
- endOfBodyPosition = other.endOfBodyPosition;
- }
- }
- }
-
- // Message implementation ----------------------------------------
-
- @Override
- public int getEncodeSize() {
- int headersPropsSize = getHeadersAndPropertiesEncodeSize();
-
- int bodyPos = getEndOfBodyPosition();
-
- int bodySize = bodyPos - BUFFER_HEADER_SPACE - DataConstants.SIZE_INT;
-
- return DataConstants.SIZE_INT + bodySize + DataConstants.SIZE_INT + headersPropsSize;
- }
-
- @Override
- public int getHeadersAndPropertiesEncodeSize() {
- return DataConstants.SIZE_LONG + // Message ID
- DataConstants.SIZE_BYTE + // user id null?
- (userID == null ? 0 : 16) +
- /* address */SimpleString.sizeofNullableString(address) +
- DataConstants./* Type */SIZE_BYTE +
- DataConstants./* Durable */SIZE_BOOLEAN +
- DataConstants./* Expiration */SIZE_LONG +
- DataConstants./* Timestamp */SIZE_LONG +
- DataConstants./* Priority */SIZE_BYTE +
- /* PropertySize and Properties */properties.getEncodeSize();
- }
-
- @Override
- public void encodeHeadersAndProperties(final ActiveMQBuffer buffer) {
- buffer.writeLong(messageID);
- buffer.writeNullableSimpleString(address);
- if (userID == null) {
- buffer.writeByte(DataConstants.NULL);
- } else {
- buffer.writeByte(DataConstants.NOT_NULL);
- buffer.writeBytes(userID.asBytes());
- }
- buffer.writeByte(type);
- buffer.writeBoolean(durable);
- buffer.writeLong(expiration);
- buffer.writeLong(timestamp);
- buffer.writeByte(priority);
- properties.encode(buffer);
- }
-
- @Override
- public void decodeHeadersAndProperties(final ActiveMQBuffer buffer) {
- messageID = buffer.readLong();
- address = buffer.readNullableSimpleString();
- if (buffer.readByte() == DataConstants.NOT_NULL) {
- byte[] bytes = new byte[16];
- buffer.readBytes(bytes);
- userID = new UUID(UUID.TYPE_TIME_BASED, bytes);
- } else {
- userID = null;
- }
- type = buffer.readByte();
- durable = buffer.readBoolean();
- expiration = buffer.readLong();
- timestamp = buffer.readLong();
- priority = buffer.readByte();
- properties.decode(buffer);
- }
-
- public void copyHeadersAndProperties(final MessageInternal msg) {
- messageID = msg.getMessageID();
- address = msg.getAddress();
- userID = msg.getUserID();
- type = msg.getType();
- durable = msg.isDurable();
- expiration = msg.getExpiration();
- timestamp = msg.getTimestamp();
- priority = msg.getPriority();
- properties = msg.getTypedProperties();
- }
-
- @Override
- public ActiveMQBuffer getBodyBuffer() {
- if (bodyBuffer == null) {
- bodyBuffer = new ResetLimitWrappedActiveMQBuffer(BODY_OFFSET, buffer, this);
- }
-
- return bodyBuffer;
- }
-
- @Override
- public Message writeBodyBufferBytes(byte[] bytes) {
- getBodyBuffer().writeBytes(bytes);
-
- return this;
- }
-
- @Override
- public Message writeBodyBufferString(String string) {
- getBodyBuffer().writeString(string);
-
- return this;
- }
-
- public void checkCompletion() throws ActiveMQException {
- // no op on regular messages
- }
-
- @Override
- public synchronized ActiveMQBuffer getBodyBufferDuplicate() {
-
- // Must copy buffer before sending it
-
- ByteBuf byteBuf = ChannelBufferWrapper.unwrap(getBodyBuffer().byteBuf());
- byteBuf = byteBuf.duplicate();
- byteBuf.readerIndex(getBodyBuffer().readerIndex());
- byteBuf.writerIndex(getBodyBuffer().writerIndex());
-
- return new ResetLimitWrappedActiveMQBuffer(BODY_OFFSET, byteBuf, null);
- }
-
- @Override
- public long getMessageID() {
- return messageID;
- }
-
- @Override
- public UUID getUserID() {
- return userID;
- }
-
- @Override
- public MessageImpl setUserID(final UUID userID) {
- this.userID = userID;
- return this;
- }
-
- /**
- * this doesn't need to be synchronized as setAddress is protecting the buffer,
- * not the address
- */
- @Override
- public SimpleString getAddress() {
- return address;
- }
-
- /**
- * The only reason this is synchronized is because of encoding a message versus invalidating the buffer.
- * This synchronization can probably be removed since setAddress is always called from a single thread.
- * However I will keep it as it's harmless and it's been well tested
- */
- @Override
- public Message setAddress(final SimpleString address) {
- // This is protecting the buffer
- synchronized (this) {
- if (this.address != address) {
- this.address = address;
-
- bufferValid = false;
- }
- }
-
- return this;
- }
-
- @Override
- public byte getType() {
- return type;
- }
-
- public void setType(byte type) {
- this.type = type;
- }
-
- @Override
- public boolean isDurable() {
- return durable;
- }
-
- @Override
- public MessageImpl setDurable(final boolean durable) {
- if (this.durable != durable) {
- this.durable = durable;
-
- bufferValid = false;
- }
- return this;
- }
-
- @Override
- public long getExpiration() {
- return expiration;
- }
-
- @Override
- public MessageImpl setExpiration(final long expiration) {
- if (this.expiration != expiration) {
- this.expiration = expiration;
-
- bufferValid = false;
- }
- return this;
- }
-
- @Override
- public long getTimestamp() {
- return timestamp;
- }
-
- @Override
- public MessageImpl setTimestamp(final long timestamp) {
- if (this.timestamp != timestamp) {
- this.timestamp = timestamp;
-
- bufferValid = false;
- }
- return this;
- }
-
- @Override
- public byte getPriority() {
- return priority;
- }
-
- @Override
- public MessageImpl setPriority(final byte priority) {
- if (this.priority != priority) {
- this.priority = priority;
-
- bufferValid = false;
- }
- return this;
- }
-
- @Override
- public boolean isExpired() {
- if (expiration == 0) {
- return false;
- }
-
- return System.currentTimeMillis() - expiration >= 0;
- }
-
- @Override
- public Map<String, Object> toMap() {
- Map<String, Object> map = new HashMap<>();
-
- map.put("messageID", messageID);
- if (userID != null) {
- map.put("userID", "ID:" + userID.toString());
- }
- map.put("address", address.toString());
- map.put("type", type);
- map.put("durable", durable);
- map.put("expiration", expiration);
- map.put("timestamp", timestamp);
- map.put("priority", priority);
- map.putAll(toPropertyMap());
- return map;
- }
-
- @Override
- public Map<String, Object> toPropertyMap() {
- Map<String, Object> map = new HashMap<>();
- for (SimpleString propName : properties.getPropertyNames()) {
- map.put(propName.toString(), properties.getProperty(propName));
- }
- return map;
- }
-
- @Override
- public void decodeFromBuffer(final ActiveMQBuffer buffer) {
-
- this.buffer = copyMessageBuffer(buffer);
-
- decode();
-
- //synchronize indexes
- buffer.setIndex(this.buffer.readerIndex(),this.buffer.writerIndex());
-
- // Setting up the BodyBuffer based on endOfBodyPosition set from decode
- ResetLimitWrappedActiveMQBuffer tmpbodyBuffer = new ResetLimitWrappedActiveMQBuffer(BODY_OFFSET, this.buffer, null);
- tmpbodyBuffer.readerIndex(BODY_OFFSET);
- tmpbodyBuffer.writerIndex(endOfBodyPosition);
- // only set this after the writer and reader is set,
- // otherwise the buffer would be reset through the listener
- tmpbodyBuffer.setMessage(this);
- this.bodyBuffer = tmpbodyBuffer;
-
- }
-
- private ActiveMQBuffer copyMessageBuffer(ActiveMQBuffer buffer) {
- ActiveMQBuffer copiedBuffer;
-
- ByteBuf newNettyBuffer = Unpooled.buffer( buffer.byteBuf().capacity() );
-
- int read = buffer.byteBuf().readerIndex();
- int writ = buffer.byteBuf().writerIndex();
-
- int readArt = buffer.readerIndex();
- int writArt = buffer.writerIndex();
- buffer.byteBuf().readerIndex( 0 );
-
- buffer.byteBuf().readBytes( newNettyBuffer, 0, buffer.byteBuf().writerIndex() );
- buffer.byteBuf().setIndex( read, writ );
- newNettyBuffer.setIndex( read, writ );
-
- copiedBuffer = new ChannelBufferWrapper( newNettyBuffer );
-
- buffer.setIndex( readArt, writArt );
- copiedBuffer.setIndex( readArt, writArt );
-
- return copiedBuffer;
- }
-
- @Override
- public void bodyChanged() {
- bufferValid = false;
-
- endOfBodyPosition = -1;
- }
-
- @Override
- public int getEndOfMessagePosition() {
- return endOfMessagePosition;
- }
-
- @Override
- public int getEndOfBodyPosition() {
- if (endOfBodyPosition < 0) {
- endOfBodyPosition = getBodyBuffer().writerIndex();
- }
- return endOfBodyPosition;
- }
-
- // Encode to journal or paging
- public void encode(final ActiveMQBuffer buff) {
- encodeToBuffer();
-
- buff.writeBytes(buffer, BUFFER_HEADER_SPACE, endOfMessagePosition - BUFFER_HEADER_SPACE);
- }
-
- // Decode from journal or paging
- public void decode(final ActiveMQBuffer buff) {
- int start = buff.readerIndex();
-
- endOfBodyPosition = buff.readInt();
-
- endOfMessagePosition = buff.getInt(endOfBodyPosition - BUFFER_HEADER_SPACE + start);
-
- int length = endOfMessagePosition - BUFFER_HEADER_SPACE;
-
- buffer.setIndex(0, BUFFER_HEADER_SPACE);
-
- buffer.writeBytes(buff, start, length);
-
- decode();
-
- buff.readerIndex(start + length);
- }
-
- @Override
- public synchronized ActiveMQBuffer getEncodedBuffer() {
- ActiveMQBuffer buff = encodeToBuffer();
- return buff.duplicate();
- }
-
- @Override
- public void setAddressTransient(final SimpleString address) {
- this.address = address;
- }
-
- // Properties
- // ---------------------------------------------------------------------------------------
-
- @Override
- public Message putBooleanProperty(final SimpleString key, final boolean value) {
- properties.putBooleanProperty(key, value);
-
- bufferValid = false;
-
- return this;
- }
-
- @Override
- public Message putByteProperty(final SimpleString key, final byte value) {
- properties.putByteProperty(key, value);
-
- bufferValid = false;
-
- return this;
- }
-
- @Override
- public Message putBytesProperty(final SimpleString key, final byte[] value) {
- properties.putBytesProperty(key, value);
-
- bufferValid = false;
-
- return this;
- }
-
- @Override
- public Message putCharProperty(SimpleString key, char value) {
- properties.putCharProperty(key, value);
- bufferValid = false;
-
- return this;
- }
-
- @Override
- public Message putCharProperty(String key, char value) {
- properties.putCharProperty(new SimpleString(key), value);
- bufferValid = false;
-
- return this;
- }
-
- @Override
- public Message putShortProperty(final SimpleString key, final short value) {
- properties.putShortProperty(key, value);
- bufferValid = false;
-
- return this;
- }
-
- @Override
- public Message putIntProperty(final SimpleString key, final int value) {
- properties.putIntProperty(key, value);
- bufferValid = false;
-
- return this;
- }
-
- @Override
- public Message putLongProperty(final SimpleString key, final long value) {
- properties.putLongProperty(key, value);
- bufferValid = false;
-
- return this;
- }
-
- @Override
- public Message putFloatProperty(final SimpleString key, final float value) {
- properties.putFloatProperty(key, value);
-
- bufferValid = false;
-
- return this;
- }
-
- @Override
- public Message putDoubleProperty(final SimpleString key, final double value) {
- properties.putDoubleProperty(key, value);
-
- bufferValid = false;
-
- return this;
- }
-
- @Override
- public Message putStringProperty(final SimpleString key, final SimpleString value) {
- properties.putSimpleStringProperty(key, value);
-
- bufferValid = false;
-
- return this;
- }
-
- @Override
- public Message putObjectProperty(final SimpleString key,
- final Object value) throws ActiveMQPropertyConversionException {
- TypedProperties.setObjectProperty(key, value, properties);
- bufferValid = false;
-
- return this;
- }
-
- @Override
- public Message putObjectProperty(final String key, final Object value) throws ActiveMQPropertyConversionException {
- putObjectProperty(new SimpleString(key), value);
-
- bufferValid = false;
-
- return this;
- }
-
- @Override
- public Message putBooleanProperty(final String key, final boolean value) {
- properties.putBooleanProperty(new SimpleString(key), value);
-
- bufferValid = false;
-
- return this;
- }
-
- @Override
- public Message putByteProperty(final String key, final byte value) {
- properties.putByteProperty(new SimpleString(key), value);
-
- bufferValid = false;
-
- return this;
- }
-
- @Override
- public Message putBytesProperty(final String key, final byte[] value) {
- properties.putBytesProperty(new SimpleString(key), value);
-
- bufferValid = false;
-
- return this;
- }
-
- @Override
- public Message putShortProperty(final String key, final short value) {
- properties.putShortProperty(new SimpleString(key), value);
-
- bufferValid = false;
-
- return this;
- }
-
- @Override
- public Message putIntProperty(final String key, final int value) {
- properties.putIntProperty(new SimpleString(key), value);
-
- bufferValid = false;
-
- return this;
- }
-
- @Override
- public Message putLongProperty(final String key, final long value) {
- properties.putLongProperty(new SimpleString(key), value);
-
- bufferValid = false;
-
- return this;
- }
-
- @Override
- public Message putFloatProperty(final String key, final float value) {
- properties.putFloatProperty(new SimpleString(key), value);
-
- bufferValid = false;
-
- return this;
- }
-
- @Override
- public Message putDoubleProperty(final String key, final double value) {
- properties.putDoubleProperty(new SimpleString(key), value);
-
- bufferValid = false;
-
- return this;
- }
-
- @Override
- public Message putStringProperty(final String key, final String value) {
- properties.putSimpleStringProperty(new SimpleString(key), SimpleString.toSimpleString(value));
-
- bufferValid = false;
-
- return this;
- }
-
- public Message putTypedProperties(final TypedProperties otherProps) {
- properties.putTypedProperties(otherProps);
-
- bufferValid = false;
-
- return this;
- }
-
- @Override
- public Object getObjectProperty(final SimpleString key) {
- return properties.getProperty(key);
- }
-
- @Override
- public Boolean getBooleanProperty(final SimpleString key) throws ActiveMQPropertyConversionException {
- return properties.getBooleanProperty(key);
- }
-
- @Override
- public Boolean getBooleanProperty(final String key) throws ActiveMQPropertyConversionException {
- return properties.getBooleanProperty(new SimpleString(key));
- }
-
- @Override
- public Byte getByteProperty(final SimpleString key) throws ActiveMQPropertyConversionException {
- return properties.getByteProperty(key);
- }
-
- @Override
- public Byte getByteProperty(final String key) throws ActiveMQPropertyConversionException {
- return properties.getByteProperty(new SimpleString(key));
- }
-
- @Override
- public byte[] getBytesProperty(final SimpleString key) throws ActiveMQPropertyConversionException {
- return properties.getBytesProperty(key);
- }
-
- @Override
- public byte[] getBytesProperty(final String key) throws ActiveMQPropertyConversionException {
- return getBytesProperty(new SimpleString(key));
- }
-
- @Override
- public Double getDoubleProperty(final SimpleString key) throws ActiveMQPropertyConversionException {
- return properties.getDoubleProperty(key);
- }
-
- @Override
- public Double getDoubleProperty(final String key) throws ActiveMQPropertyConversionException {
- return properties.getDoubleProperty(new SimpleString(key));
- }
-
- @Override
- public Integer getIntProperty(final SimpleString key) throws ActiveMQPropertyConversionException {
- return properties.getIntProperty(key);
- }
-
- @Override
- public Integer getIntProperty(final String key) throws ActiveMQPropertyConversionException {
- return properties.getIntProperty(new SimpleString(key));
- }
-
- @Override
- public Long getLongProperty(final SimpleString key) throws ActiveMQPropertyConversionException {
- return properties.getLongProperty(key);
- }
-
- @Override
- public Long getLongProperty(final String key) throws ActiveMQPropertyConversionException {
- return properties.getLongProperty(new SimpleString(key));
- }
-
- @Override
- public Short getShortProperty(final SimpleString key) throws ActiveMQPropertyConversionException {
- return properties.getShortProperty(key);
- }
-
- @Override
- public Short getShortProperty(final String key) throws ActiveMQPropertyConversionException {
- return properties.getShortProperty(new SimpleString(key));
- }
-
- @Override
- public Float getFloatProperty(final SimpleString key) throws ActiveMQPropertyConversionException {
- return properties.getFloatProperty(key);
- }
-
- @Override
- public Float getFloatProperty(final String key) throws ActiveMQPropertyConversionException {
- return properties.getFloatProperty(new SimpleString(key));
- }
-
- @Override
- public String getStringProperty(final SimpleString key) throws ActiveMQPropertyConversionException {
- SimpleString str = getSimpleStringProperty(key);
-
- if (str == null) {
- return null;
- } else {
- return str.toString();
- }
- }
-
- @Override
- public String getStringProperty(final String key) throws ActiveMQPropertyConversionException {
- return getStringProperty(new SimpleString(key));
- }
-
- @Override
- public SimpleString getSimpleStringProperty(final SimpleString key) throws ActiveMQPropertyConversionException {
- return properties.getSimpleStringProperty(key);
- }
-
- @Override
- public SimpleString getSimpleStringProperty(final String key) throws ActiveMQPropertyConversionException {
- return properties.getSimpleStringProperty(new SimpleString(key));
- }
-
- @Override
- public Object getObjectProperty(final String key) {
- return properties.getProperty(new SimpleString(key));
- }
-
- @Override
- public Object removeProperty(final SimpleString key) {
- bufferValid = false;
-
- return properties.removeProperty(key);
- }
-
- @Override
- public Object removeProperty(final String key) {
- bufferValid = false;
-
- return properties.removeProperty(new SimpleString(key));
- }
-
- @Override
- public boolean containsProperty(final SimpleString key) {
- return properties.containsProperty(key);
- }
-
- @Override
- public boolean containsProperty(final String key) {
- return properties.containsProperty(new SimpleString(key));
- }
-
- @Override
- public Set<SimpleString> getPropertyNames() {
- return properties.getPropertyNames();
- }
-
- @Override
- public ActiveMQBuffer getWholeBuffer() {
- return buffer;
- }
-
- @Override
- public BodyEncoder getBodyEncoder() throws ActiveMQException {
- return new DecodingContext();
- }
-
- @Override
- public TypedProperties getTypedProperties() {
- return this.properties;
- }
-
- @Override
- public boolean equals(Object other) {
-
- if (this == other) {
- return true;
- }
-
- if (other instanceof MessageImpl) {
- MessageImpl message = (MessageImpl) other;
-
- if (this.getMessageID() == message.getMessageID())
- return true;
- }
-
- return false;
- }
-
- /**
- * Debug Helper!!!!
- *
- * I'm leaving this message here without any callers for a reason:
- * During debugs it's important eventually to identify what's on the bodies, and this method will give you a good idea about them.
- * Add the message.bodyToString() to the Watch variables on the debugger view and this will show up like a charm!!!
- *
- * @return
- */
- public String bodyToString() {
- getEndOfBodyPosition();
- int readerIndex1 = this.buffer.readerIndex();
- buffer.readerIndex(0);
- byte[] buffer1 = new byte[buffer.writerIndex()];
- buffer.readBytes(buffer1);
- buffer.readerIndex(readerIndex1);
-
- byte[] buffer2 = null;
- if (bodyBuffer != null) {
- int readerIndex2 = this.bodyBuffer.readerIndex();
- bodyBuffer.readerIndex(0);
- buffer2 = new byte[bodyBuffer.writerIndex() - bodyBuffer.readerIndex()];
- bodyBuffer.readBytes(buffer2);
- bodyBuffer.readerIndex(readerIndex2);
- return "ServerMessage@" + Integer.toHexString(System.identityHashCode(this)) + "[writerIndex=" + buffer.writerIndex() + ",capacity=" + buffer.capacity() + ",bodyStart=" + getEndOfBodyPosition() + " buffer=" + ByteUtil.bytesToHex(buffer1, 1) + ", bodyBuffer=" + ByteUtil.bytesToHex(buffer2, 1);
- } else {
- return "ServerMessage@" + Integer.toHexString(System.identityHashCode(this)) + "[writerIndex=" + buffer.writerIndex() + ",capacity=" + buffer.capacity() + ",bodyStart=" + getEndOfBodyPosition() + " buffer=" + ByteUtil.bytesToHex(buffer1, 1);
- }
-
- }
-
- @Override
- public int hashCode() {
- return 31 + (int) (messageID ^ (messageID >>> 32));
- }
-
- // Public --------------------------------------------------------
-
- // Package protected ---------------------------------------------
-
- // Protected -----------------------------------------------------
-
- // Private -------------------------------------------------------
-
- public TypedProperties getProperties() {
- return properties;
- }
-
- // This must be synchronized as it can be called concurrently id the message is being delivered
- // concurrently to
- // many queues - the first caller in this case will actually encode it
- private synchronized ActiveMQBuffer encodeToBuffer() {
- if (!bufferValid) {
- int bodySize = getEndOfBodyPosition();
-
- // write it
- buffer.setInt(BUFFER_HEADER_SPACE, bodySize);
-
- // Position at end of body and skip past the message end position int.
- // check for enough room in the buffer even though it is dynamic
- if ((bodySize + 4) > buffer.capacity()) {
- buffer.setIndex(0, bodySize);
- buffer.writeInt(0);
- } else {
- buffer.setIndex(0, bodySize + DataConstants.SIZE_INT);
- }
-
- encodeHeadersAndProperties(buffer);
-
- // Write end of message position
-
- endOfMessagePosition = buffer.writerIndex();
-
- buffer.setInt(bodySize, endOfMessagePosition);
-
- bufferValid = true;
- }
-
- return buffer;
- }
-
- private void decode() {
- endOfBodyPosition = buffer.getInt(BUFFER_HEADER_SPACE);
-
- buffer.readerIndex(endOfBodyPosition + DataConstants.SIZE_INT);
-
- decodeHeadersAndProperties(buffer);
-
- endOfMessagePosition = buffer.readerIndex();
-
- bufferValid = true;
- }
-
- public void createBody(final int initialMessageBufferSize) {
- buffer = ActiveMQBuffers.dynamicBuffer(initialMessageBufferSize);
-
- // There's a bug in netty which means a dynamic buffer won't resize until you write a byte
- buffer.writeByte((byte) 0);
-
- buffer.setIndex(BODY_OFFSET, BODY_OFFSET);
- }
-
- // Inner classes -------------------------------------------------
-
- private final class DecodingContext implements BodyEncoder {
-
- private int lastPos = 0;
-
- private DecodingContext() {
- }
-
- @Override
- public void open() {
- }
-
- @Override
- public void close() {
- }
-
- @Override
- public long getLargeBodySize() {
- return buffer.writerIndex();
- }
-
- @Override
- public int encode(final ByteBuffer bufferRead) throws ActiveMQException {
- ActiveMQBuffer buffer = ActiveMQBuffers.wrappedBuffer(bufferRead);
- return encode(buffer, bufferRead.capacity());
- }
-
- @Override
- public int encode(final ActiveMQBuffer bufferOut, final int size) {
- bufferOut.writeBytes(getWholeBuffer(), lastPos, size);
- lastPos += size;
- return size;
- }
- }
-
-}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/impl/MessageInternal.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/impl/MessageInternal.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/impl/MessageInternal.java
deleted file mode 100644
index a7b2199..0000000
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/impl/MessageInternal.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * 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.message.impl;
-
-import java.io.InputStream;
-
-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.SimpleString;
-import org.apache.activemq.artemis.core.message.BodyEncoder;
-import org.apache.activemq.artemis.utils.TypedProperties;
-
-public interface MessageInternal extends Message {
-
- void decodeFromBuffer(ActiveMQBuffer buffer);
-
- int getEndOfMessagePosition();
-
- int getEndOfBodyPosition();
-
- void bodyChanged();
-
- boolean isServerMessage();
-
- ActiveMQBuffer getEncodedBuffer();
-
- int getHeadersAndPropertiesEncodeSize();
-
- ActiveMQBuffer getWholeBuffer();
-
- void encodeHeadersAndProperties(ActiveMQBuffer buffer);
-
- void decodeHeadersAndProperties(ActiveMQBuffer buffer);
-
- BodyEncoder getBodyEncoder() throws ActiveMQException;
-
- InputStream getBodyInputStream();
-
- void setAddressTransient(SimpleString address);
-
- TypedProperties getTypedProperties();
-}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQSessionContext.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQSessionContext.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQSessionContext.java
index ae1cf71..38cc177 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQSessionContext.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ActiveMQSessionContext.java
@@ -31,7 +31,9 @@ import org.apache.activemq.artemis.api.config.ActiveMQDefaultConfiguration;
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.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;
import org.apache.activemq.artemis.api.core.client.ClientConsumer;
import org.apache.activemq.artemis.api.core.client.ClientSession;
@@ -45,7 +47,7 @@ import org.apache.activemq.artemis.core.client.impl.ClientLargeMessageInternal;
import org.apache.activemq.artemis.core.client.impl.ClientMessageInternal;
import org.apache.activemq.artemis.core.client.impl.ClientProducerCreditsImpl;
import org.apache.activemq.artemis.core.client.impl.ClientSessionImpl;
-import org.apache.activemq.artemis.core.message.impl.MessageInternal;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import org.apache.activemq.artemis.core.protocol.core.Channel;
import org.apache.activemq.artemis.core.protocol.core.ChannelHandler;
import org.apache.activemq.artemis.core.protocol.core.CommandConfirmationHandler;
@@ -103,7 +105,6 @@ import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXAR
import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXASetTimeoutMessage;
import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXASetTimeoutResponseMessage;
import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionXAStartMessage;
-import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
import org.apache.activemq.artemis.spi.core.remoting.Connection;
import org.apache.activemq.artemis.spi.core.remoting.ReadyListener;
@@ -422,12 +423,12 @@ public class ActiveMQSessionContext extends SessionContext {
}
@Override
- public int getCreditsOnSendingFull(MessageInternal msgI) {
+ public int getCreditsOnSendingFull(Message msgI) {
return msgI.getEncodeSize();
}
@Override
- public void sendFullMessage(MessageInternal msgI,
+ public void sendFullMessage(ICoreMessage msgI,
boolean sendBlocking,
SendAcknowledgementHandler handler,
SimpleString defaultAddress) throws ActiveMQException {
@@ -441,16 +442,16 @@ public class ActiveMQSessionContext extends SessionContext {
}
@Override
- public int sendInitialChunkOnLargeMessage(MessageInternal msgI) throws ActiveMQException {
+ public int sendInitialChunkOnLargeMessage(Message msgI) throws ActiveMQException {
SessionSendLargeMessage initialChunk = new SessionSendLargeMessage(msgI);
sessionChannel.send(initialChunk);
- return msgI.getHeadersAndPropertiesEncodeSize();
+ return ((CoreMessage)msgI).getHeadersAndPropertiesEncodeSize();
}
@Override
- public int sendLargeMessageChunk(MessageInternal msgI,
+ public int sendLargeMessageChunk(Message msgI,
long messageBodySize,
boolean sendBlocking,
boolean lastChunk,
@@ -471,7 +472,7 @@ public class ActiveMQSessionContext extends SessionContext {
}
@Override
- public int sendServerLargeMessageChunk(MessageInternal msgI,
+ public int sendServerLargeMessageChunk(Message msgI,
long messageBodySize,
boolean sendBlocking,
boolean lastChunk,
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ChannelImpl.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ChannelImpl.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ChannelImpl.java
index 0f5cdf0..e95227d 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ChannelImpl.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/ChannelImpl.java
@@ -371,6 +371,7 @@ public final class ChannelImpl implements Channel {
if (logger.isTraceEnabled()) {
logger.trace("Sending blocking " + packet);
}
+
connection.getTransportConnection().write(buffer, false, false);
long toWait = connection.getBlockingCallTimeout();
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/PacketImpl.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/PacketImpl.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/PacketImpl.java
index 9025210..08c17e4 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/PacketImpl.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/PacketImpl.java
@@ -16,8 +16,11 @@
*/
package org.apache.activemq.artemis.core.protocol.core.impl;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
import org.apache.activemq.artemis.api.core.SimpleString;
+import org.apache.activemq.artemis.core.buffers.impl.ChannelBufferWrapper;
import org.apache.activemq.artemis.core.protocol.core.Packet;
import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
import org.apache.activemq.artemis.utils.DataConstants;
@@ -25,6 +28,7 @@ import org.apache.activemq.artemis.utils.DataConstants;
public class PacketImpl implements Packet {
// Constants -------------------------------------------------------------------------
+
public static final int ADDRESSING_CHANGE_VERSION = 129;
public static final SimpleString OLD_QUEUE_PREFIX = new SimpleString("jms.queue.");
@@ -310,7 +314,7 @@ public class PacketImpl implements Packet {
@Override
public ActiveMQBuffer encode(final RemotingConnection connection, boolean usePooled) {
- ActiveMQBuffer buffer = connection.createTransportBuffer(PacketImpl.INITIAL_PACKET_SIZE, usePooled);
+ ActiveMQBuffer buffer = createPacket(connection, usePooled);
// The standard header fields
@@ -330,6 +334,14 @@ public class PacketImpl implements Packet {
return buffer;
}
+ protected ActiveMQBuffer createPacket(RemotingConnection connection, boolean usePooled) {
+ if (connection == null) {
+ return new ChannelBufferWrapper(Unpooled.buffer(INITIAL_PACKET_SIZE));
+ } else {
+ return connection.createTransportBuffer(PacketImpl.INITIAL_PACKET_SIZE, usePooled);
+ }
+ }
+
@Override
public void decode(final ActiveMQBuffer buffer) {
channelID = buffer.readLong();
@@ -339,6 +351,22 @@ public class PacketImpl implements Packet {
size = buffer.readerIndex();
}
+ protected ByteBuf copyMessageBuffer(ByteBuf buffer, int skipBytes) {
+
+ ByteBuf newNettyBuffer = Unpooled.buffer(buffer.capacity() - PACKET_HEADERS_SIZE - skipBytes);
+
+ int read = buffer.readerIndex();
+ int writ = buffer.writerIndex();
+ buffer.readerIndex(PACKET_HEADERS_SIZE);
+
+ newNettyBuffer.writeBytes(buffer, buffer.readableBytes() - skipBytes);
+ buffer.setIndex( read, writ );
+ newNettyBuffer.setIndex( 0, writ - PACKET_HEADERS_SIZE - skipBytes);
+
+ return newNettyBuffer;
+ }
+
+
@Override
public int getPacketSize() {
if (size == -1) {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/RemotingConnectionImpl.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/RemotingConnectionImpl.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/RemotingConnectionImpl.java
index 8bd62ca..cada061 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/RemotingConnectionImpl.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/RemotingConnectionImpl.java
@@ -353,6 +353,7 @@ public class RemotingConnectionImpl extends AbstractRemotingConnection implement
}
dataReceived = true;
+
doBufferReceived(packet);
super.bufferReceived(connectionID, buffer);
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/MessagePacket.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/MessagePacket.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/MessagePacket.java
index 6a52a27..49989d3 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/MessagePacket.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/MessagePacket.java
@@ -16,22 +16,25 @@
*/
package org.apache.activemq.artemis.core.protocol.core.impl.wireformat;
-import org.apache.activemq.artemis.api.core.Message;
-import org.apache.activemq.artemis.core.message.impl.MessageInternal;
+import io.netty.buffer.Unpooled;
+import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
+import org.apache.activemq.artemis.api.core.ICoreMessage;
+import org.apache.activemq.artemis.core.buffers.impl.ChannelBufferWrapper;
import org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl;
+import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
public abstract class MessagePacket extends PacketImpl implements MessagePacketI {
- protected MessageInternal message;
+ protected ICoreMessage message;
- public MessagePacket(final byte type, final MessageInternal message) {
+ public MessagePacket(final byte type, final ICoreMessage message) {
super(type);
this.message = message;
}
@Override
- public Message getMessage() {
+ public ICoreMessage getMessage() {
return message;
}
@@ -40,4 +43,12 @@ public abstract class MessagePacket extends PacketImpl implements MessagePacketI
return super.getParentString() + ", message=" + message;
}
+ protected ActiveMQBuffer internalCreatePacket(int size, RemotingConnection connection, boolean usePooled) {
+ if (connection == null) {
+ return new ChannelBufferWrapper(Unpooled.buffer(size));
+ } else {
+ return connection.createTransportBuffer(size, usePooled);
+ }
+ }
+
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/SessionReceiveClientLargeMessage.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/SessionReceiveClientLargeMessage.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/SessionReceiveClientLargeMessage.java
index 66e509c..e9e3138 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/SessionReceiveClientLargeMessage.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/SessionReceiveClientLargeMessage.java
@@ -17,12 +17,13 @@
package org.apache.activemq.artemis.core.protocol.core.impl.wireformat;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
+
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.core.client.impl.ClientLargeMessageInternal;
-import org.apache.activemq.artemis.core.message.impl.MessageInternal;
public class SessionReceiveClientLargeMessage extends SessionReceiveLargeMessage {
- public SessionReceiveClientLargeMessage(MessageInternal message) {
+ public SessionReceiveClientLargeMessage(Message message) {
super(message);
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/SessionReceiveLargeMessage.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/SessionReceiveLargeMessage.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/SessionReceiveLargeMessage.java
index 64f96f9..dc2c458 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/SessionReceiveLargeMessage.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/SessionReceiveLargeMessage.java
@@ -18,12 +18,12 @@ package org.apache.activemq.artemis.core.protocol.core.impl.wireformat;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
import org.apache.activemq.artemis.api.core.Message;
-import org.apache.activemq.artemis.core.message.impl.MessageInternal;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl;
public class SessionReceiveLargeMessage extends PacketImpl implements MessagePacketI {
- private final MessageInternal message;
+ private final Message message;
/**
* Since we receive the message before the entire message was received,
@@ -35,13 +35,13 @@ public class SessionReceiveLargeMessage extends PacketImpl implements MessagePac
private int deliveryCount;
// To be used on decoding at the client while receiving a large message
- public SessionReceiveLargeMessage(final MessageInternal message) {
+ public SessionReceiveLargeMessage(final Message message) {
super(SESS_RECEIVE_LARGE_MSG);
this.message = message;
}
public SessionReceiveLargeMessage(final long consumerID,
- final MessageInternal message,
+ final Message message,
final long largeMessageSize,
final int deliveryCount) {
super(SESS_RECEIVE_LARGE_MSG);
@@ -55,7 +55,7 @@ public class SessionReceiveLargeMessage extends PacketImpl implements MessagePac
this.largeMessageSize = largeMessageSize;
}
- public MessageInternal getLargeMessage() {
+ public Message getLargeMessage() {
return message;
}
@@ -85,7 +85,7 @@ public class SessionReceiveLargeMessage extends PacketImpl implements MessagePac
buffer.writeInt(deliveryCount);
buffer.writeLong(largeMessageSize);
if (message != null) {
- message.encodeHeadersAndProperties(buffer);
+ ((CoreMessage)message).encodeHeadersAndProperties(buffer.byteBuf());
}
}
@@ -94,7 +94,7 @@ public class SessionReceiveLargeMessage extends PacketImpl implements MessagePac
consumerID = buffer.readLong();
deliveryCount = buffer.readInt();
largeMessageSize = buffer.readLong();
- message.decodeHeadersAndProperties(buffer);
+ ((CoreMessage)message).decodeHeadersAndProperties(buffer.byteBuf());
}
@Override
[02/17] activemq-artemis git commit: ARTEMIS-1009 Pure Message
Encoding.
Posted by cl...@apache.org.
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/InVMNonPersistentMessageBufferTest.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/InVMNonPersistentMessageBufferTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/InVMNonPersistentMessageBufferTest.java
index 450a361..d35f436 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/InVMNonPersistentMessageBufferTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/InVMNonPersistentMessageBufferTest.java
@@ -16,13 +16,13 @@
*/
package org.apache.activemq.artemis.tests.integration.client;
+import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
import org.apache.activemq.artemis.api.core.client.ClientConsumer;
import org.apache.activemq.artemis.api.core.client.ClientMessage;
import org.apache.activemq.artemis.api.core.client.ClientProducer;
import org.apache.activemq.artemis.api.core.client.ClientSession;
import org.apache.activemq.artemis.api.core.client.ClientSessionFactory;
import org.apache.activemq.artemis.api.core.client.ServerLocator;
-import org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl;
import org.apache.activemq.artemis.core.server.ActiveMQServer;
import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.tests.util.ActiveMQTestBase;
@@ -130,9 +130,9 @@ public class InVMNonPersistentMessageBufferTest extends ActiveMQTestBase {
message.getBodyBuffer().clear();
- Assert.assertEquals(PacketImpl.PACKET_HEADERS_SIZE + DataConstants.SIZE_INT, message.getBodyBuffer().writerIndex());
+ Assert.assertEquals(DataConstants.SIZE_INT, message.getBodyBuffer().writerIndex());
- Assert.assertEquals(PacketImpl.PACKET_HEADERS_SIZE + DataConstants.SIZE_INT, message.getBodyBuffer().readerIndex());
+ Assert.assertEquals(DataConstants.SIZE_INT, message.getBodyBuffer().readerIndex());
}
}
@@ -148,6 +148,18 @@ public class InVMNonPersistentMessageBufferTest extends ActiveMQTestBase {
Assert.assertNotNull(received);
+ ActiveMQBuffer buffer = received.getReadOnlyBodyBuffer();
+
+ Assert.assertEquals(body, buffer.readString());
+
+ try {
+ buffer.readByte();
+ Assert.fail("Should throw exception");
+ } catch (IndexOutOfBoundsException e) {
+ // OK
+ }
+
+
Assert.assertEquals(body, received.getBodyBuffer().readString());
try {
@@ -157,6 +169,18 @@ public class InVMNonPersistentMessageBufferTest extends ActiveMQTestBase {
} catch (IndexOutOfBoundsException e) {
// OK
}
+
+ buffer = received.getReadOnlyBodyBuffer();
+
+ Assert.assertEquals(body, buffer.readString());
+
+ try {
+ buffer.readByte();
+ Assert.fail("Should throw exception");
+ } catch (IndexOutOfBoundsException e) {
+ // OK
+ }
+
}
@Test
@@ -167,7 +191,7 @@ public class InVMNonPersistentMessageBufferTest extends ActiveMQTestBase {
message.getBodyBuffer().writeString(body);
- Assert.assertEquals(PacketImpl.PACKET_HEADERS_SIZE + DataConstants.SIZE_INT, message.getBodyBuffer().readerIndex());
+ Assert.assertEquals(DataConstants.SIZE_INT, message.getBodyBuffer().readerIndex());
String body2 = message.getBodyBuffer().readString();
@@ -175,7 +199,7 @@ public class InVMNonPersistentMessageBufferTest extends ActiveMQTestBase {
message.getBodyBuffer().resetReaderIndex();
- Assert.assertEquals(PacketImpl.PACKET_HEADERS_SIZE + DataConstants.SIZE_INT, message.getBodyBuffer().readerIndex());
+ Assert.assertEquals(DataConstants.SIZE_INT, message.getBodyBuffer().readerIndex());
String body3 = message.getBodyBuffer().readString();
@@ -189,7 +213,7 @@ public class InVMNonPersistentMessageBufferTest extends ActiveMQTestBase {
received.getBodyBuffer().resetReaderIndex();
- Assert.assertEquals(PacketImpl.PACKET_HEADERS_SIZE + DataConstants.SIZE_INT, received.getBodyBuffer().readerIndex());
+ Assert.assertEquals(DataConstants.SIZE_INT, received.getBodyBuffer().readerIndex());
String body4 = received.getBodyBuffer().readString();
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/InterruptedLargeMessageTest.java
----------------------------------------------------------------------
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 1950e12..540baf6 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
@@ -53,10 +53,8 @@ import org.apache.activemq.artemis.core.server.Queue;
import org.apache.activemq.artemis.core.server.QueueConfig;
import org.apache.activemq.artemis.core.server.QueueFactory;
import org.apache.activemq.artemis.api.core.RoutingType;
-import org.apache.activemq.artemis.core.server.ServerSession;
import org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl;
import org.apache.activemq.artemis.core.server.impl.QueueImpl;
-import org.apache.activemq.artemis.core.server.impl.ServerSessionImpl;
import org.apache.activemq.artemis.core.settings.HierarchicalRepository;
import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;
@@ -125,10 +123,10 @@ public class InterruptedLargeMessageTest extends LargeMessageTestBase {
producer.send(clientFile);
Thread.sleep(500);
-
- for (ServerSession srvSession : server.getSessions()) {
- ((ServerSessionImpl) srvSession).clearLargeMessage();
- }
+//
+// for (ServerSession srvSession : server.getSessions()) {
+// ((ServerSessionImpl) srvSession).clearLargeMessage();
+// }
server.stop(false);
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/LargeMessageTest.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/LargeMessageTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/LargeMessageTest.java
index 3577a87..025d00a 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/LargeMessageTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/LargeMessageTest.java
@@ -40,7 +40,6 @@ import org.apache.activemq.artemis.api.core.client.ServerLocator;
import org.apache.activemq.artemis.core.client.impl.ClientConsumerInternal;
import org.apache.activemq.artemis.core.config.Configuration;
import org.apache.activemq.artemis.core.config.StoreConfiguration;
-import org.apache.activemq.artemis.core.message.impl.MessageImpl;
import org.apache.activemq.artemis.core.persistence.impl.journal.JournalStorageManager;
import org.apache.activemq.artemis.core.persistence.impl.journal.LargeServerMessageImpl;
import org.apache.activemq.artemis.core.server.ActiveMQServer;
@@ -350,7 +349,7 @@ public class LargeMessageTest extends LargeMessageTestBase {
ClientProducer producer = session.createProducer(ADDRESS);
- Message clientFile = session.createMessage(true);
+ ClientMessage clientFile = session.createMessage(true);
for (int i = 0; i < messageSize; i++) {
clientFile.getBodyBuffer().writeByte(getSamplebyte(i));
}
@@ -890,7 +889,7 @@ public class LargeMessageTest extends LargeMessageTestBase {
Message clientFile = createLargeClientMessageStreaming(session, messageSize, true);
if (isSimulateBridge) {
- clientFile.putBytesProperty(MessageImpl.HDR_BRIDGE_DUPLICATE_ID, someDuplicateInfo.getBytes());
+ clientFile.putBytesProperty(Message.HDR_BRIDGE_DUPLICATE_ID, someDuplicateInfo.getBytes());
} else {
clientFile.putBytesProperty(Message.HDR_DUPLICATE_DETECTION_ID, someDuplicateInfo.getBytes());
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/clientcrash/ClientExitTest.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/clientcrash/ClientExitTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/clientcrash/ClientExitTest.java
index 70c5b22..23fa0a6 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/clientcrash/ClientExitTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/clientcrash/ClientExitTest.java
@@ -16,9 +16,9 @@
*/
package org.apache.activemq.artemis.tests.integration.clientcrash;
-import org.apache.activemq.artemis.api.core.Message;
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;
import org.apache.activemq.artemis.api.core.client.ClientSession;
import org.apache.activemq.artemis.api.core.client.ClientSessionFactory;
import org.apache.activemq.artemis.api.core.client.ServerLocator;
@@ -63,7 +63,7 @@ public class ClientExitTest extends ClientTestBase {
// read the message from the queue
- Message message = consumer.receive(15000);
+ ClientMessage message = consumer.receive(15000);
assertNotNull(message);
assertEquals(ClientExitTest.MESSAGE_TEXT, message.getBodyBuffer().readString());
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/bridge/BridgeTest.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/bridge/BridgeTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/bridge/BridgeTest.java
index 87f9255..b0f03d4 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/bridge/BridgeTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/bridge/BridgeTest.java
@@ -38,6 +38,7 @@ import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
import org.apache.activemq.artemis.api.core.ActiveMQException;
import org.apache.activemq.artemis.api.core.Interceptor;
import org.apache.activemq.artemis.api.core.Message;
+
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.api.core.TransportConfiguration;
import org.apache.activemq.artemis.api.core.client.ActiveMQClient;
@@ -68,7 +69,6 @@ import org.apache.activemq.artemis.core.server.ActiveMQServer;
import org.apache.activemq.artemis.core.server.MessageReference;
import org.apache.activemq.artemis.core.server.Queue;
import org.apache.activemq.artemis.api.core.RoutingType;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.cluster.Bridge;
import org.apache.activemq.artemis.core.server.cluster.Transformer;
import org.apache.activemq.artemis.core.server.cluster.impl.BridgeImpl;
@@ -1885,12 +1885,8 @@ public class BridgeTest extends ActiveMQTestBase {
final String BRIDGE = "myBridge";
ServiceRegistryImpl serviceRegistry = new ServiceRegistryImpl();
- Transformer transformer = new Transformer() {
- @Override
- public ServerMessage transform(ServerMessage message) {
- return null;
- }
- };
+ Transformer transformer = (Message encode) -> null;
+
serviceRegistry.addBridgeTransformer(BRIDGE, transformer);
Configuration config = createDefaultInVMConfig().addConnectorConfiguration("in-vm", new TransportConfiguration(INVM_CONNECTOR_FACTORY));
ActiveMQServer server = addServer(new ActiveMQServerImpl(config, null, null, null, serviceRegistry));
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/bridge/SimpleTransformer.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/bridge/SimpleTransformer.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/bridge/SimpleTransformer.java
index d9a817e..e462240 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/bridge/SimpleTransformer.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/bridge/SimpleTransformer.java
@@ -17,14 +17,16 @@
package org.apache.activemq.artemis.tests.integration.cluster.bridge;
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.server.ServerMessage;
import org.apache.activemq.artemis.core.server.cluster.Transformer;
public class SimpleTransformer implements Transformer {
@Override
- public ServerMessage transform(final ServerMessage message) {
+ public Message transform(final Message messageParameter) {
+ ICoreMessage message = messageParameter.toCore();
SimpleString oldProp = (SimpleString) message.getObjectProperty(new SimpleString("wibble"));
if (!oldProp.equals(new SimpleString("bing"))) {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/distribution/ClusterHeadersRemovedTest.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/distribution/ClusterHeadersRemovedTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/distribution/ClusterHeadersRemovedTest.java
index 26bcb43..8766057 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/distribution/ClusterHeadersRemovedTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/distribution/ClusterHeadersRemovedTest.java
@@ -16,12 +16,13 @@
*/
package org.apache.activemq.artemis.tests.integration.cluster.distribution;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.client.ClientConsumer;
import org.apache.activemq.artemis.api.core.client.ClientMessage;
import org.apache.activemq.artemis.api.core.client.ClientProducer;
import org.apache.activemq.artemis.api.core.client.ClientSession;
import org.apache.activemq.artemis.api.core.client.ClientSessionFactory;
-import org.apache.activemq.artemis.core.message.impl.MessageImpl;
+
import org.apache.activemq.artemis.core.server.cluster.impl.MessageLoadBalancingType;
import org.junit.Before;
import org.junit.Test;
@@ -83,7 +84,7 @@ public class ClusterHeadersRemovedTest extends ClusterTestBase {
assertNotNull(message);
- assertFalse(message.containsProperty(MessageImpl.HDR_ROUTE_TO_IDS));
+ assertFalse(message.containsProperty(Message.HDR_ROUTE_TO_IDS));
}
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/distribution/MessageRedistributionTest.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/distribution/MessageRedistributionTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/distribution/MessageRedistributionTest.java
index de5fe33..0b0fa00 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/distribution/MessageRedistributionTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/cluster/distribution/MessageRedistributionTest.java
@@ -28,7 +28,7 @@ import org.apache.activemq.artemis.api.core.client.ClientConsumer;
import org.apache.activemq.artemis.api.core.client.ClientMessage;
import org.apache.activemq.artemis.api.core.client.ClientProducer;
import org.apache.activemq.artemis.api.core.client.ClientSession;
-import org.apache.activemq.artemis.core.message.impl.MessageImpl;
+
import org.apache.activemq.artemis.core.server.Bindable;
import org.apache.activemq.artemis.core.server.cluster.impl.MessageLoadBalancingType;
import org.apache.activemq.artemis.core.server.cluster.impl.Redistributor;
@@ -474,7 +474,7 @@ public class MessageRedistributionTest extends ClusterTestBase {
bb.putLong(i);
- msg.putBytesProperty(MessageImpl.HDR_BRIDGE_DUPLICATE_ID, bytes);
+ msg.putBytesProperty(Message.HDR_BRIDGE_DUPLICATE_ID, bytes);
prod0.send(msg);
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/divert/DivertTest.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/divert/DivertTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/divert/DivertTest.java
index 510fa68..69a360e 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/divert/DivertTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/divert/DivertTest.java
@@ -20,6 +20,7 @@ import java.util.Collection;
import java.util.concurrent.TimeUnit;
import org.apache.activemq.artemis.api.core.Message;
+
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;
@@ -35,7 +36,7 @@ import org.apache.activemq.artemis.core.server.ActiveMQServer;
import org.apache.activemq.artemis.core.server.ActiveMQServers;
import org.apache.activemq.artemis.core.server.Divert;
import org.apache.activemq.artemis.api.core.RoutingType;
-import org.apache.activemq.artemis.core.server.ServerMessage;
+
import org.apache.activemq.artemis.core.server.cluster.Transformer;
import org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl;
import org.apache.activemq.artemis.core.server.impl.ServiceRegistryImpl;
@@ -1301,7 +1302,7 @@ public class DivertTest extends ActiveMQTestBase {
ServiceRegistryImpl serviceRegistry = new ServiceRegistryImpl();
Transformer transformer = new Transformer() {
@Override
- public ServerMessage transform(ServerMessage message) {
+ public Message transform(Message message) {
return null;
}
};
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/interceptors/InterceptorTest.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/interceptors/InterceptorTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/interceptors/InterceptorTest.java
index 43a4ad9..eff1615 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/interceptors/InterceptorTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/interceptors/InterceptorTest.java
@@ -50,7 +50,7 @@ import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionRec
import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionSendMessage;
import org.apache.activemq.artemis.core.server.ActiveMQServer;
import org.apache.activemq.artemis.api.core.RoutingType;
-import org.apache.activemq.artemis.core.server.ServerMessage;
+
import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;
import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
import org.apache.activemq.artemis.spi.core.security.ActiveMQJAASSecurityManager;
@@ -88,7 +88,7 @@ public class InterceptorTest extends ActiveMQTestBase {
if (packet.getType() == PacketImpl.SESS_SEND) {
SessionSendMessage p = (SessionSendMessage) packet;
- ServerMessage sm = (ServerMessage) p.getMessage();
+ Message sm = p.getMessage();
sm.putStringProperty(InterceptorTest.key, "orange");
}
@@ -165,7 +165,7 @@ public class InterceptorTest extends ActiveMQTestBase {
if (packet.getType() == PacketImpl.SESS_RECEIVE_MSG) {
SessionReceiveMessage p = (SessionReceiveMessage) packet;
- ServerMessage sm = (ServerMessage) p.getMessage();
+ Message sm = p.getMessage();
sm.putStringProperty(InterceptorTest.key, "orange");
}
@@ -319,7 +319,7 @@ public class InterceptorTest extends ActiveMQTestBase {
if (packet.getType() == PacketImpl.SESS_SEND) {
SessionSendMessage p = (SessionSendMessage) packet;
- ServerMessage sm = (ServerMessage) p.getMessage();
+ Message sm = p.getMessage();
sm.putIntProperty(key, num);
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/journal/MessageJournalTest.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..85ed04f
--- /dev/null
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/journal/MessageJournalTest.java
@@ -0,0 +1,130 @@
+/**
+ * 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.journal;
+
+import java.util.LinkedList;
+import java.util.List;
+
+import org.apache.activemq.artemis.core.journal.PreparedTransactionInfo;
+import org.apache.activemq.artemis.core.journal.RecordInfo;
+import org.apache.activemq.artemis.core.journal.TransactionFailureCallback;
+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.ProtonProtocolManagerFactory;
+import org.apache.activemq.artemis.tests.util.ActiveMQTestBase;
+import org.apache.qpid.proton.message.Message;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class MessageJournalTest extends ActiveMQTestBase {
+
+ @Test
+ public void testStoreCore() throws Throwable {
+ ActiveMQServer server = createServer(true);
+
+ server.start();
+
+ CoreMessage message = new CoreMessage().initBuffer(10 * 1024).setDurable(true);
+
+ message.setMessageID(333);
+
+ CoreProtocolManagerFactory factory = (CoreProtocolManagerFactory) server.getRemotingService().getProtocolFactoryMap().get("CORE");
+
+ Assert.assertNotNull(factory);
+
+ message.getBodyBuffer().writeByte((byte)'Z');
+
+ server.getStorageManager().storeMessage(message);
+
+ server.getStorageManager().stop();
+
+ JournalStorageManager journalStorageManager = (JournalStorageManager) server.getStorageManager();
+
+ List<RecordInfo> committedRecords = new LinkedList<>();
+
+ List<PreparedTransactionInfo> preparedTransactions = new LinkedList<>();
+
+ TransactionFailureCallback transactionFailure = new TransactionFailureCallback() {
+ @Override
+ public void failedTransaction(long transactionID, List<RecordInfo> records, List<RecordInfo> recordsToDelete) {
+
+ }
+ };
+
+ try {
+ journalStorageManager.getMessageJournal().start();
+
+ journalStorageManager.getMessageJournal().load(committedRecords, preparedTransactions, transactionFailure);
+
+ Assert.assertEquals(1, committedRecords.size());
+ } finally {
+ journalStorageManager.getMessageJournal().stop();
+ }
+
+ }
+
+
+ @Test
+ public void testStoreAMQP() throws Throwable {
+ ActiveMQServer server = createServer(true);
+
+ server.start();
+
+ ProtonProtocolManagerFactory factory = (ProtonProtocolManagerFactory) server.getRemotingService().getProtocolFactoryMap().get("AMQP");
+
+ Message protonJMessage = Message.Factory.create();
+
+ AMQPMessage message = new AMQPMessage(protonJMessage);
+
+ message.setMessageID(333);
+
+ Assert.assertNotNull(factory);
+
+ server.getStorageManager().storeMessage(message);
+
+ server.getStorageManager().stop();
+
+ JournalStorageManager journalStorageManager = (JournalStorageManager) server.getStorageManager();
+
+ List<RecordInfo> committedRecords = new LinkedList<>();
+
+ List<PreparedTransactionInfo> preparedTransactions = new LinkedList<>();
+
+ TransactionFailureCallback transactionFailure = new TransactionFailureCallback() {
+ @Override
+ public void failedTransaction(long transactionID, List<RecordInfo> records, List<RecordInfo> recordsToDelete) {
+
+ }
+ };
+
+ try {
+ journalStorageManager.getMessageJournal().start();
+
+ journalStorageManager.getMessageJournal().load(committedRecords, preparedTransactions, transactionFailure);
+
+ Assert.assertEquals(1, committedRecords.size());
+ } finally {
+ journalStorageManager.getMessageJournal().stop();
+ }
+
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/journal/NIOJournalCompactTest.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/journal/NIOJournalCompactTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/journal/NIOJournalCompactTest.java
index 38cc126..a0f23d0 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/journal/NIOJournalCompactTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/journal/NIOJournalCompactTest.java
@@ -43,9 +43,9 @@ import org.apache.activemq.artemis.core.journal.impl.JournalCompactor;
import org.apache.activemq.artemis.core.journal.impl.JournalFile;
import org.apache.activemq.artemis.core.journal.impl.JournalFileImpl;
import org.apache.activemq.artemis.core.journal.impl.JournalImpl;
+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.persistence.impl.journal.OperationContextImpl;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
import org.apache.activemq.artemis.tests.unit.core.journal.impl.JournalImplTestBase;
import org.apache.activemq.artemis.tests.unit.core.journal.impl.fakes.SimpleEncoding;
import org.apache.activemq.artemis.tests.util.ActiveMQTestBase;
@@ -1656,13 +1656,13 @@ public class NIOJournalCompactTest extends JournalImplTestBase {
long id = seqGenerator.incrementAndGet();
values[i] = id;
- ServerMessageImpl message = new ServerMessageImpl(id, 100);
+ CoreMessage message = new CoreMessage(id, 100);
message.getBodyBuffer().writeBytes(new byte[1024]);
storage.storeMessageTransactional(tx, message);
}
- ServerMessageImpl message = new ServerMessageImpl(seqGenerator.incrementAndGet(), 100);
+ CoreMessage message = new CoreMessage(seqGenerator.incrementAndGet(), 100);
survivingMsgs.add(message.getMessageID());
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/ContainerBaseTest.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/ContainerBaseTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/ContainerBaseTest.java
new file mode 100644
index 0000000..f055531
--- /dev/null
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/ContainerBaseTest.java
@@ -0,0 +1,64 @@
+/**
+ * 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.karaf;
+
+import java.io.IOException;
+
+import org.junit.After;
+import org.ops4j.pax.exam.ExamSystem;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.TestAddress;
+import org.ops4j.pax.exam.TestContainer;
+import org.ops4j.pax.exam.TestProbeBuilder;
+import org.ops4j.pax.exam.TestProbeProvider;
+import org.ops4j.pax.exam.spi.PaxExamRuntime;
+
+/**
+ * This is useful for when you want to automate remote tests.
+ */
+public abstract class ContainerBaseTest extends KarafBaseTest {
+ protected ExamSystem system;
+ protected TestProbeBuilder builder;
+ protected TestAddress testToBeCalled;
+ protected TestProbeProvider probe;
+ protected TestContainer container;
+
+ protected void setupContainer(Class testToCall, String methodToCall, Option[] options) throws IOException {
+ system = PaxExamRuntime.createTestSystem(options);
+ builder = system.createProbe();
+ testToBeCalled = builder.addTest(testToCall, methodToCall);
+ probe = builder.build();
+ container = PaxExamRuntime.createContainer(system);
+ container.start();
+ container.install(probe.getStream());
+ }
+
+ @After
+ public void shutdownContainer() {
+ if (container != null) {
+ container.stop();
+ }
+ }
+
+
+ protected void executeRemoteTest() {
+ container.call(testToBeCalled);
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/KarafBaseTest.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/KarafBaseTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/KarafBaseTest.java
new file mode 100644
index 0000000..22f1efc
--- /dev/null
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/KarafBaseTest.java
@@ -0,0 +1,212 @@
+/**
+ * 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.karaf;
+
+import javax.inject.Inject;
+import javax.security.auth.Subject;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.PrintStream;
+import java.security.PrivilegedAction;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.FutureTask;
+import java.util.concurrent.TimeUnit;
+
+import org.apache.karaf.jaas.boot.principal.RolePrincipal;
+import org.apache.karaf.jaas.boot.principal.UserPrincipal;
+import org.apache.karaf.shell.api.console.Session;
+import org.apache.karaf.shell.api.console.SessionFactory;
+import org.apache.log4j.Logger;
+import org.junit.Assert;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.karaf.options.KarafDistributionOption;
+import org.ops4j.pax.exam.karaf.options.LogLevelOption;
+import org.ops4j.pax.exam.options.UrlReference;
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.InvalidSyntaxException;
+import org.osgi.util.tracker.ServiceTracker;
+
+import static org.ops4j.pax.exam.CoreOptions.maven;
+import static org.ops4j.pax.exam.CoreOptions.mavenBundle;
+import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.debugConfiguration;
+import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.editConfigurationFilePut;
+import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.features;
+import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.karafDistributionConfiguration;
+import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.logLevel;
+
+public class KarafBaseTest extends Assert {
+
+ private static Logger LOG = Logger.getLogger(KarafBaseTest.class.getName());
+
+ public static final long ASSERTION_TIMEOUT = 30000L;
+ public static final long COMMAND_TIMEOUT = 30000L;
+ public static final String USER = "karaf";
+ public static final String PASSWORD = "karaf";
+
+ /**
+ * plug to add more options on sub tests
+ */
+ protected void testOptions(List<Option> options) throws Exception {
+ }
+
+ public Option[] configureArtemisFeatures(boolean debug, String version, String... features) throws Exception {
+
+ ArrayList<String> featureArray = new ArrayList<>();
+ featureArray.addAll(Arrays.asList(features));
+
+ List<Option> optionList = new LinkedList<>();
+
+ optionList.add(karafDistributionConfiguration().
+ frameworkUrl(maven().groupId("org.apache.karaf").
+ artifactId("apache-karaf").type("tar.gz").
+ versionAsInProject()).unpackDirectory(new File("target/containertest/unpack/")));
+ optionList.add(KarafDistributionOption.keepRuntimeFolder());
+ optionList.add(logLevel(LogLevelOption.LogLevel.INFO));
+ optionList.add(editConfigurationFilePut("etc/config.properties", "karaf.startlevel.bundle", "50"));
+
+ if (debug) {
+ // uncomment this to debug it.
+ optionList.add(debugConfiguration("5005", true));
+ }
+
+ optionList.add(features(getArtemisMQKarafFeatureUrl(version), featureArray.toArray(new String[featureArray.size()])));
+
+ testOptions(optionList);
+
+ return optionList.toArray(new Option[optionList.size()]);
+ }
+
+ public UrlReference getArtemisMQKarafFeatureUrl(String version) {
+ String type = "xml/features";
+ UrlReference urlReference;
+
+ if (version == null) {
+ urlReference = mavenBundle().groupId("org.apache.activemq").
+ artifactId("artemis-features").versionAsInProject().type(type);
+ } else {
+ urlReference = mavenBundle().groupId("org.apache.activemq").
+ artifactId("artemis-features").version(version).type(type);
+ }
+ LOG.info("FeatureURL: " + urlReference.getURL());
+ return urlReference;
+ }
+
+ ExecutorService executor = Executors.newCachedThreadPool();
+
+ @Inject
+ BundleContext bundleContext;
+
+ @Inject
+ SessionFactory sessionFactory;
+
+ protected String executeCommand(final String command, final Long timeout, final Boolean silent) {
+ String response;
+ final ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+ final PrintStream printStream = new PrintStream(byteArrayOutputStream);
+ final Session commandSession = sessionFactory.create(System.in, printStream, printStream);
+ commandSession.put("APPLICATION", System.getProperty("karaf.name", "root"));
+ commandSession.put("USER", USER);
+ FutureTask<String> commandFuture = new FutureTask<>(new Callable<String>() {
+ @Override
+ public String call() {
+
+ Subject subject = new Subject();
+ subject.getPrincipals().add(new UserPrincipal("admin"));
+ subject.getPrincipals().add(new RolePrincipal("admin"));
+ subject.getPrincipals().add(new RolePrincipal("manager"));
+ subject.getPrincipals().add(new RolePrincipal("viewer"));
+ return Subject.doAs(subject, new PrivilegedAction<String>() {
+ @Override
+ public String run() {
+ try {
+ if (!silent) {
+ System.out.println(command);
+ System.out.flush();
+ }
+ commandSession.execute(command);
+ } catch (Exception e) {
+ e.printStackTrace(System.err);
+ }
+ printStream.flush();
+ return byteArrayOutputStream.toString();
+ }
+ });
+ }
+ });
+
+ try {
+ executor.submit(commandFuture);
+ response = commandFuture.get(timeout, TimeUnit.MILLISECONDS);
+ } catch (Exception e) {
+ e.printStackTrace(System.err);
+ response = "SHELL COMMAND TIMED OUT: ";
+ }
+ LOG.info("Execute: " + command + " - Response:" + response);
+ return response;
+ }
+
+ protected String executeCommand(final String command) {
+ return executeCommand(command, COMMAND_TIMEOUT, false);
+ }
+
+ protected boolean withinReason(Callable<Boolean> callable) throws Throwable {
+ long max = System.currentTimeMillis() + ASSERTION_TIMEOUT;
+ while (true) {
+ try {
+ return callable.call();
+ } catch (Throwable t) {
+ if (System.currentTimeMillis() < max) {
+ TimeUnit.SECONDS.sleep(1);
+ continue;
+ } else {
+ throw t;
+ }
+ }
+ }
+ }
+
+ public boolean verifyBundleInstalled(final String bundleName) throws Exception {
+ boolean found = false;
+ for (Bundle bundle : bundleContext.getBundles()) {
+ LOG.debug("Checking: " + bundle.getSymbolicName());
+ if (bundle.getSymbolicName().contains(bundleName)) {
+ found = true;
+ break;
+ }
+ }
+ return found;
+ }
+
+ protected Object waitForService(String filter, long timeout) throws InvalidSyntaxException, InterruptedException {
+ ServiceTracker<Object, Object> st = new ServiceTracker<>(bundleContext, bundleContext.createFilter(filter), null);
+ try {
+ st.open();
+ return st.waitForService(timeout);
+ } finally {
+ st.close();
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/distribution/ArtemisFeatureTest.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/distribution/ArtemisFeatureTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/distribution/ArtemisFeatureTest.java
new file mode 100644
index 0000000..b47a6e0
--- /dev/null
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/distribution/ArtemisFeatureTest.java
@@ -0,0 +1,101 @@
+/**
+ * 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.karaf.distribution;
+
+import javax.jms.Connection;
+import javax.jms.Message;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageProducer;
+import javax.jms.Queue;
+import java.util.concurrent.Callable;
+
+import org.apache.activemq.artemis.core.client.impl.ClientMessageImpl;
+import org.apache.activemq.artemis.tests.integration.karaf.KarafBaseTest;
+import org.apache.log4j.Logger;
+import org.apache.qpid.jms.JmsConnectionFactory;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.Configuration;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.ProbeBuilder;
+import org.ops4j.pax.exam.TestProbeBuilder;
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.osgi.framework.Constants;
+
+/**
+ * Useful docs about this test: https://ops4j1.jira.com/wiki/display/paxexam/FAQ
+ */
+@RunWith(PaxExam.class)
+public class ArtemisFeatureTest extends KarafBaseTest {
+
+ private static Logger LOG = Logger.getLogger(ArtemisFeatureTest.class.getName());
+
+ @ProbeBuilder
+ public TestProbeBuilder probeConfiguration(TestProbeBuilder probe) {
+ probe.setHeader(Constants.DYNAMICIMPORT_PACKAGE, "*,org.ops4j.pax.exam.options.*,org.apache.felix.service.*;status=provisional");
+ return probe;
+ }
+
+ @Configuration
+ public Option[] configure() throws Exception {
+ return configureArtemisFeatures(false, null, "artemis");
+ }
+ @Test
+ public void testSample() throws Throwable {
+ System.out.println("Hello!!!");
+ ClientMessageImpl message = new ClientMessageImpl();
+ }
+
+ @Test(timeout = 5 * 60 * 1000)
+ public void test() throws Throwable {
+ executeCommand("bundle:list");
+
+ withinReason(new Callable<Boolean>() {
+ @Override
+ public Boolean call() throws Exception {
+ assertTrue("artemis bundle installed", verifyBundleInstalled("artemis-server-osgi"));
+ return true;
+ }
+ });
+
+ Object service = waitForService("(objectClass=org.apache.activemq.artemis.core.server.ActiveMQServer)", 30000);
+ assertNotNull(service);
+ LOG.info("have service " + service);
+
+ executeCommand("service:list -n");
+
+ Connection connection = null;
+ try {
+ JmsConnectionFactory factory = new JmsConnectionFactory("amqp://localhost:5672");
+ connection = factory.createConnection(USER, PASSWORD);
+ connection.start();
+
+ javax.jms.Session sess = connection.createSession(false, javax.jms.Session.AUTO_ACKNOWLEDGE);
+ Queue queue = sess.createQueue("exampleQueue");
+ MessageProducer producer = sess.createProducer(queue);
+ producer.send(sess.createTextMessage("TEST"));
+
+ MessageConsumer consumer = sess.createConsumer(queue);
+ Message msg = consumer.receive(5000);
+ assertNotNull(msg);
+ } finally {
+ if (connection != null) {
+ connection.close();
+ }
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/distribution/package-info.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/distribution/package-info.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/distribution/package-info.java
new file mode 100644
index 0000000..5af5077
--- /dev/null
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/distribution/package-info.java
@@ -0,0 +1,21 @@
+/*
+ * 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.
+ */
+
+/**
+ * This contains tests that will validate the Artemis distribution
+ */
+package org.apache.activemq.artemis.tests.integration.karaf.distribution;
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/version/ProbeRemoteServer.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/version/ProbeRemoteServer.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/version/ProbeRemoteServer.java
new file mode 100644
index 0000000..7b4eea0
--- /dev/null
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/version/ProbeRemoteServer.java
@@ -0,0 +1,51 @@
+/**
+ * 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.karaf.version;
+
+import org.apache.activemq.artemis.core.client.impl.ClientMessageImpl;
+import org.apache.activemq.artemis.core.config.impl.ConfigurationImpl;
+import org.apache.activemq.artemis.core.server.ActiveMQServer;
+import org.apache.activemq.artemis.core.server.ActiveMQServers;
+import org.apache.activemq.artemis.core.server.JournalType;
+import org.junit.Ignore;
+import org.junit.Test;
+
+// Ignored as this is executed by PaxExam on RemoteTest
+@Ignore
+public class ProbeRemoteServer {
+
+ ActiveMQServer server;
+
+ @Test
+ public void probe1() throws Exception {
+ System.out.println("probe1 with ");
+ ClientMessageImpl message = new ClientMessageImpl();
+
+ ConfigurationImpl config = new ConfigurationImpl().setSecurityEnabled(false).setJournalMinFiles(2).
+ setJournalFileSize(100 * 1024).setJournalType(JournalType.NIO).
+ setJournalDirectory("./data/journal").
+ setBindingsDirectory("./data/binding").
+ setPagingDirectory("./data/paging").
+ setLargeMessagesDirectory("./data/lm").setJournalCompactMinFiles(0).setJournalCompactPercentage(0).setClusterPassword("mycluster").setJournalDatasync(false).setSecurityEnabled(false);
+ config.addAcceptorConfiguration("netty", "tcp://localhost:61616");
+
+ server = ActiveMQServers.newActiveMQServer(config, false);
+
+ server.start();
+ }
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/version/RemoteTest.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/version/RemoteTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/version/RemoteTest.java
new file mode 100644
index 0000000..10e97b3
--- /dev/null
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/version/RemoteTest.java
@@ -0,0 +1,38 @@
+/**
+ * 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.karaf.version;
+
+import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;
+import org.apache.activemq.artemis.tests.integration.karaf.ContainerBaseTest;
+import org.junit.Test;
+
+public class RemoteTest extends ContainerBaseTest {
+
+ @Test
+ public void testValidateRemote() throws Exception {
+ setupContainer(ProbeRemoteServer.class, "probe1", configureArtemisFeatures(false, "1.5.1", "artemis-core"));
+
+ executeRemoteTest();
+
+ ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory();
+ factory.createConnection().close();
+
+ container.stop();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/version/VersionWireTest.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/version/VersionWireTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/version/VersionWireTest.java
new file mode 100644
index 0000000..be2fac5
--- /dev/null
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/version/VersionWireTest.java
@@ -0,0 +1,104 @@
+/**
+ * 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.karaf.version;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.PrintStream;
+import java.util.List;
+
+import org.apache.activemq.artemis.api.core.Message;
+import org.apache.activemq.artemis.core.client.impl.ClientMessageImpl;
+import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;
+import org.apache.activemq.artemis.tests.integration.karaf.KarafBaseTest;
+import org.apache.log4j.Logger;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.ops4j.pax.exam.Configuration;
+import org.ops4j.pax.exam.Option;
+import org.ops4j.pax.exam.ProbeBuilder;
+import org.ops4j.pax.exam.TestProbeBuilder;
+import org.ops4j.pax.exam.junit.PaxExam;
+import org.ops4j.pax.exam.spi.reactors.ExamReactorStrategy;
+import org.ops4j.pax.exam.spi.reactors.PerMethod;
+
+import static org.ops4j.pax.exam.CoreOptions.vmOptions;
+
+// uncomment this to be able to debug it
+// import static org.ops4j.pax.exam.karaf.options.KarafDistributionOption.debugConfiguration;
+
+/**
+ * Useful docs about this test: https://ops4j1.jira.com/wiki/display/paxexam/FAQ
+ */
+@RunWith(PaxExam.class)
+@ExamReactorStrategy(PerMethod.class)
+public class VersionWireTest extends KarafBaseTest {
+
+ File file = new File(System.getProperty("./target/generated.bin", System.getProperty("testFile", "./target/generated.bin")));
+
+
+ private static Logger LOG = Logger.getLogger(VersionWireTest.class.getName());
+
+ /**
+ * plug to add more options on sub tests
+ */
+ @Override
+ protected void testOptions(List<Option> options) throws Exception {
+ options.add(vmOptions("-DtestFile=" + file.getCanonicalPath()));
+ }
+
+ @ProbeBuilder
+ public TestProbeBuilder probeConfiguration(TestProbeBuilder probe) throws Exception {
+
+ file.deleteOnExit();
+ System.out.println("Path::" + file.getCanonicalPath());
+ PrintStream out = new PrintStream(new FileOutputStream(file));
+ out.println("hello");
+ out.close();
+ System.out.println("probing!!!");
+ Message message = new ClientMessageImpl();
+ System.out.println("probed!!!");
+ return probe;
+ }
+
+
+ @Configuration
+ public Option[] configure1_5() throws Exception {
+
+ ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory();
+ factory.setBlockOnDurableSend(false);
+
+ return configureArtemisFeatures(false, "1.5.0", "artemis-core");
+
+ }
+
+ @Configuration
+ public Option[] configure13() throws Exception {
+ return configureArtemisFeatures(false, null, "artemis-core");
+ }
+
+
+ @Test
+ public void testSample() throws Throwable {
+ System.out.println("Path::" + file.getCanonicalPath());
+
+ Assert.assertTrue(file.getCanonicalPath() + " don't exist", file.exists());
+ System.out.println("Hello!!!");
+ ClientMessageImpl message = new ClientMessageImpl();
+ }
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/version/package-info.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/version/package-info.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/version/package-info.java
new file mode 100644
index 0000000..459e912
--- /dev/null
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/karaf/version/package-info.java
@@ -0,0 +1,21 @@
+/*
+ * 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.
+ */
+
+/**
+ * Tests to check wire compatibility.
+ */
+package org.apache.activemq.artemis.tests.integration.karaf.version;
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ManagementHelperTest.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ManagementHelperTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ManagementHelperTest.java
index 0719b38..3151408 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ManagementHelperTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ManagementHelperTest.java
@@ -20,7 +20,7 @@ import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
-import org.apache.activemq.artemis.api.core.Message;
+import org.apache.activemq.artemis.api.core.client.ClientMessage;
import org.apache.activemq.artemis.api.core.management.ManagementHelper;
import org.apache.activemq.artemis.core.client.impl.ClientMessageImpl;
import org.apache.activemq.artemis.tests.integration.IntegrationTestLogger;
@@ -48,7 +48,7 @@ public class ManagementHelperTest extends Assert {
String operationName = RandomUtil.randomString();
String param = RandomUtil.randomString();
String[] params = new String[]{RandomUtil.randomString(), RandomUtil.randomString(), RandomUtil.randomString()};
- Message msg = new ClientMessageImpl((byte) 0, false, 0, 0, (byte) 4, 1000);
+ ClientMessage msg = new ClientMessageImpl((byte) 0, false, 0, 0, (byte) 4, 1000);
ManagementHelper.putOperationInvocation(msg, resource, operationName, param, params);
Object[] parameters = ManagementHelper.retrieveOperationParameters(msg);
@@ -135,7 +135,7 @@ public class ManagementHelperTest extends Assert {
Object[] params = new Object[]{i, s, d, b, l, map, strArray, maps};
- Message msg = new ClientMessageImpl((byte) 0, false, 0, 0, (byte) 4, 1000);
+ ClientMessageImpl msg = new ClientMessageImpl((byte) 0, false, 0, 0, (byte) 4, 1000);
ManagementHelper.putOperationInvocation(msg, resource, operationName, params);
Object[] parameters = ManagementHelper.retrieveOperationParameters(msg);
@@ -201,7 +201,7 @@ public class ManagementHelperTest extends Assert {
Object[] params = new Object[]{"hello", map};
- Message msg = new ClientMessageImpl((byte) 0, false, 0, 0, (byte) 4, 1000);
+ ClientMessageImpl msg = new ClientMessageImpl((byte) 0, false, 0, 0, (byte) 4, 1000);
ManagementHelper.putOperationInvocation(msg, resource, operationName, params);
Object[] parameters = ManagementHelper.retrieveOperationParameters(msg);
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ManagementServiceImplTest.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ManagementServiceImplTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ManagementServiceImplTest.java
index 1afc732..151341f 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ManagementServiceImplTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/management/ManagementServiceImplTest.java
@@ -16,19 +16,20 @@
*/
package org.apache.activemq.artemis.tests.integration.management;
+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.api.core.management.AddressControl;
import org.apache.activemq.artemis.api.core.management.ManagementHelper;
import org.apache.activemq.artemis.api.core.management.QueueControl;
import org.apache.activemq.artemis.api.core.management.ResourceNames;
import org.apache.activemq.artemis.core.config.Configuration;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import org.apache.activemq.artemis.core.persistence.impl.nullpm.NullStorageManager;
import org.apache.activemq.artemis.core.server.ActiveMQServer;
import org.apache.activemq.artemis.core.server.ActiveMQServers;
import org.apache.activemq.artemis.core.server.Queue;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.impl.AddressInfo;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
import org.apache.activemq.artemis.core.server.management.impl.ManagementServiceImpl;
import org.apache.activemq.artemis.tests.integration.server.FakeStorageManager;
import org.apache.activemq.artemis.tests.unit.core.postoffice.impl.FakeQueue;
@@ -50,10 +51,10 @@ public class ManagementServiceImplTest extends ActiveMQTestBase {
server.start();
// invoke attribute and operation on the server
- ServerMessage message = new ServerMessageImpl(1, 100);
+ CoreMessage message = new CoreMessage(1, 100);
ManagementHelper.putOperationInvocation(message, ResourceNames.BROKER, "createQueue", queue, address);
- ServerMessage reply = server.getManagementService().handleMessage(message);
+ Message reply = server.getManagementService().handleMessage(message);
Assert.assertTrue(ManagementHelper.hasOperationSucceeded(reply));
}
@@ -66,10 +67,10 @@ public class ManagementServiceImplTest extends ActiveMQTestBase {
server.start();
// invoke attribute and operation on the server
- ServerMessage message = new ServerMessageImpl(1, 100);
+ CoreMessage message = new CoreMessage(1, 100);
ManagementHelper.putOperationInvocation(message, ResourceNames.BROKER, "thereIsNoSuchOperation");
- ServerMessage reply = server.getManagementService().handleMessage(message);
+ ICoreMessage reply = server.getManagementService().handleMessage(message);
Assert.assertFalse(ManagementHelper.hasOperationSucceeded(reply));
Assert.assertNotNull(ManagementHelper.getResult(reply));
@@ -83,10 +84,10 @@ public class ManagementServiceImplTest extends ActiveMQTestBase {
server.start();
// invoke attribute and operation on the server
- ServerMessage message = new ServerMessageImpl(1, 100);
+ ICoreMessage message = new CoreMessage(1, 100);
ManagementHelper.putOperationInvocation(message, "Resouce.Does.Not.Exist", "toString");
- ServerMessage reply = server.getManagementService().handleMessage(message);
+ ICoreMessage reply = server.getManagementService().handleMessage(message);
Assert.assertFalse(ManagementHelper.hasOperationSucceeded(reply));
Assert.assertNotNull(ManagementHelper.getResult(reply));
@@ -100,11 +101,11 @@ public class ManagementServiceImplTest extends ActiveMQTestBase {
server.start();
// invoke attribute and operation on the server
- ServerMessage message = new ServerMessageImpl(1, 100);
+ ICoreMessage message = new CoreMessage(1, 100);
ManagementHelper.putAttribute(message, ResourceNames.BROKER, "started");
- ServerMessage reply = server.getManagementService().handleMessage(message);
+ ICoreMessage reply = server.getManagementService().handleMessage(message);
Assert.assertTrue(ManagementHelper.hasOperationSucceeded(reply));
Assert.assertTrue((Boolean) ManagementHelper.getResult(reply));
@@ -118,11 +119,11 @@ public class ManagementServiceImplTest extends ActiveMQTestBase {
server.start();
// invoke attribute and operation on the server
- ServerMessage message = new ServerMessageImpl(1, 100);
+ ICoreMessage message = new CoreMessage(1, 100);
ManagementHelper.putAttribute(message, ResourceNames.BROKER, "attribute.Does.Not.Exist");
- ServerMessage reply = server.getManagementService().handleMessage(message);
+ ICoreMessage reply = server.getManagementService().handleMessage(message);
Assert.assertFalse(ManagementHelper.hasOperationSucceeded(reply));
Assert.assertNotNull(ManagementHelper.getResult(reply));
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/paging/PagingSendTest.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/paging/PagingSendTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/paging/PagingSendTest.java
index 1f0d7e0..3675416 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/paging/PagingSendTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/paging/PagingSendTest.java
@@ -26,7 +26,6 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.activemq.artemis.api.core.ActiveMQException;
-import org.apache.activemq.artemis.api.core.Message;
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;
@@ -289,7 +288,7 @@ public class PagingSendTest extends ActiveMQTestBase {
List<String> messageIds = new ArrayList<>();
ClientProducer producer = session.createProducer(queueAddr);
for (int i = 0; i < batchSize; i++) {
- Message message = session.createMessage(true);
+ ClientMessage message = session.createMessage(true);
message.getBodyBuffer().writeBytes(new byte[1024]);
String id = UUID.randomUUID().toString();
message.putStringProperty("id", id);
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/paging/PagingTest.java
----------------------------------------------------------------------
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 1714947..48127d2 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
@@ -42,6 +42,7 @@ import org.apache.activemq.artemis.api.core.ActiveMQException;
import org.apache.activemq.artemis.api.core.ActiveMQExceptionType;
import org.apache.activemq.artemis.api.core.Message;
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.api.core.client.ClientConsumer;
import org.apache.activemq.artemis.api.core.client.ClientMessage;
@@ -75,7 +76,6 @@ import org.apache.activemq.artemis.core.persistence.impl.journal.OperationContex
import org.apache.activemq.artemis.core.server.ActiveMQServer;
import org.apache.activemq.artemis.core.server.JournalType;
import org.apache.activemq.artemis.core.server.Queue;
-import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl;
import org.apache.activemq.artemis.core.server.impl.AddressInfo;
import org.apache.activemq.artemis.core.settings.impl.AddressFullMessagePolicy;
@@ -5536,7 +5536,7 @@ public class PagingTest extends ActiveMQTestBase {
for (int i = 0; i < 100; i++) {
Message msg = session.createMessage(true);
- msg.getBodyBuffer().writeBytes(new byte[1024]);
+ msg.toCore().getBodyBuffer().writeBytes(new byte[1024]);
prod.send(msg);
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/persistence/DeleteMessagesOnStartupTest.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/persistence/DeleteMessagesOnStartupTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/persistence/DeleteMessagesOnStartupTest.java
index 90f7c5f..615a924 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/persistence/DeleteMessagesOnStartupTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/persistence/DeleteMessagesOnStartupTest.java
@@ -21,17 +21,17 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.config.Configuration;
import org.apache.activemq.artemis.core.config.StoreConfiguration;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import org.apache.activemq.artemis.core.persistence.AddressBindingInfo;
import org.apache.activemq.artemis.core.persistence.GroupingInfo;
import org.apache.activemq.artemis.core.persistence.QueueBindingInfo;
import org.apache.activemq.artemis.core.persistence.impl.journal.JournalStorageManager;
import org.apache.activemq.artemis.core.server.Queue;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.impl.PostOfficeJournalLoader;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
import org.apache.activemq.artemis.tests.unit.core.postoffice.impl.FakeQueue;
import org.apache.activemq.artemis.tests.unit.core.server.impl.fakes.FakePostOffice;
import org.junit.Assert;
@@ -40,8 +40,6 @@ import org.junit.runners.Parameterized;
public class DeleteMessagesOnStartupTest extends StorageManagerTestBase {
- volatile boolean deleteMessages = false;
-
ArrayList<Long> deletedMessage = new ArrayList<>();
public DeleteMessagesOnStartupTest(StoreConfiguration.StoreType storeType) {
@@ -63,12 +61,12 @@ public class DeleteMessagesOnStartupTest extends StorageManagerTestBase {
HashMap<Long, Queue> queues = new HashMap<>();
queues.put(100L, theQueue);
- ServerMessage msg = new ServerMessageImpl(1, 100);
+ Message msg = new CoreMessage(1, 100);
journal.storeMessage(msg);
for (int i = 2; i < 100; i++) {
- journal.storeMessage(new ServerMessageImpl(i, 100));
+ journal.storeMessage(new CoreMessage(i, 100));
}
journal.storeReference(100, 1, true);
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/persistence/ExportFormatTest.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/persistence/ExportFormatTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/persistence/ExportFormatTest.java
index 8833b92..16cedd2 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/persistence/ExportFormatTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/persistence/ExportFormatTest.java
@@ -47,27 +47,27 @@ public class ExportFormatTest extends ActiveMQTestBase {
// Case the format was changed, and the change was agreed, use _testCreateFormat to recreate this field
String journalFile = "#File,JournalFileImpl: (activemq-data-1.amq id = 1, recordID = 1)\n" +
- "operation@AddRecordTX,txID@0,id@5,userRecordType@31,length@65,isUpdate@false,compactCount@0,data@AAAAEQAAAE4AAAAAAAAABQEAAAAEQQAxAAAA_wAAAAAAAAAAAAABTh2ZufQEAQAAAAEAAAAGawBlAHkABgAAAAA=\n" +
- "operation@UpdateTX,txID@0,id@5,userRecordType@32,length@8,isUpdate@true,compactCount@0,data@AAAAAAAAAAM=\n" +
- "operation@AddRecordTX,txID@0,id@6,userRecordType@31,length@65,isUpdate@false,compactCount@0,data@AAAAEQAAAE4AAAAAAAAABgEAAAAEQQAxAAAA_wAAAAAAAAAAAAABTh2ZufcEAQAAAAEAAAAGawBlAHkABgAAAAE=\n" +
- "operation@UpdateTX,txID@0,id@6,userRecordType@32,length@8,isUpdate@true,compactCount@0,data@AAAAAAAAAAM=\n" +
- "operation@AddRecordTX,txID@0,id@7,userRecordType@31,length@65,isUpdate@false,compactCount@0,data@AAAAEQAAAE4AAAAAAAAABwEAAAAEQQAxAAAA_wAAAAAAAAAAAAABTh2ZufcEAQAAAAEAAAAGawBlAHkABgAAAAI=\n" +
+ "operation@AddRecordTX,txID@0,id@7,userRecordType@45,length@83,isUpdate@false,compactCount@0,data@AQAAAAAAAAAHAQAAAARBADEAAAAAPQAAAA0AAAAAAAAABwEAAAAEQQAxAAAAAQAAAAAAAAAAAAABWpf6WFoEAQAAAAEAAAAGawBlAHkABgAAAAA=\n" +
"operation@UpdateTX,txID@0,id@7,userRecordType@32,length@8,isUpdate@true,compactCount@0,data@AAAAAAAAAAM=\n" +
- "operation@AddRecordTX,txID@0,id@8,userRecordType@31,length@65,isUpdate@false,compactCount@0,data@AAAAEQAAAE4AAAAAAAAACAEAAAAEQQAxAAAA_wAAAAAAAAAAAAABTh2ZufgEAQAAAAEAAAAGawBlAHkABgAAAAM=\n" +
+ "operation@AddRecordTX,txID@0,id@8,userRecordType@45,length@83,isUpdate@false,compactCount@0,data@AQAAAAAAAAAIAQAAAARBADEAAAAAPQAAAA0AAAAAAAAACAEAAAAEQQAxAAAAAQAAAAAAAAAAAAABWpf6WF4EAQAAAAEAAAAGawBlAHkABgAAAAE=\n" +
"operation@UpdateTX,txID@0,id@8,userRecordType@32,length@8,isUpdate@true,compactCount@0,data@AAAAAAAAAAM=\n" +
- "operation@AddRecordTX,txID@0,id@9,userRecordType@31,length@65,isUpdate@false,compactCount@0,data@AAAAEQAAAE4AAAAAAAAACQEAAAAEQQAxAAAA_wAAAAAAAAAAAAABTh2ZufgEAQAAAAEAAAAGawBlAHkABgAAAAQ=\n" +
+ "operation@AddRecordTX,txID@0,id@9,userRecordType@45,length@83,isUpdate@false,compactCount@0,data@AQAAAAAAAAAJAQAAAARBADEAAAAAPQAAAA0AAAAAAAAACQEAAAAEQQAxAAAAAQAAAAAAAAAAAAABWpf6WF4EAQAAAAEAAAAGawBlAHkABgAAAAI=\n" +
"operation@UpdateTX,txID@0,id@9,userRecordType@32,length@8,isUpdate@true,compactCount@0,data@AAAAAAAAAAM=\n" +
+ "operation@AddRecordTX,txID@0,id@10,userRecordType@45,length@83,isUpdate@false,compactCount@0,data@AQAAAAAAAAAKAQAAAARBADEAAAAAPQAAAA0AAAAAAAAACgEAAAAEQQAxAAAAAQAAAAAAAAAAAAABWpf6WF8EAQAAAAEAAAAGawBlAHkABgAAAAM=\n" +
+ "operation@UpdateTX,txID@0,id@10,userRecordType@32,length@8,isUpdate@true,compactCount@0,data@AAAAAAAAAAM=\n" +
+ "operation@AddRecordTX,txID@0,id@11,userRecordType@45,length@83,isUpdate@false,compactCount@0,data@AQAAAAAAAAALAQAAAARBADEAAAAAPQAAAA0AAAAAAAAACwEAAAAEQQAxAAAAAQAAAAAAAAAAAAABWpf6WF8EAQAAAAEAAAAGawBlAHkABgAAAAQ=\n" +
+ "operation@UpdateTX,txID@0,id@11,userRecordType@32,length@8,isUpdate@true,compactCount@0,data@AAAAAAAAAAM=\n" +
"operation@Commit,txID@0,numberOfRecords@10\n" +
- "operation@AddRecord,id@13,userRecordType@31,length@65,isUpdate@false,compactCount@0,data@AAAAEQAAAE4AAAAAAAAADQEAAAAEQQAxAAAA_wAAAAAAAAAAAAABTh2ZuhQEAQAAAAEAAAAGawBlAHkABgAAAAU=\n" +
- "operation@Update,id@13,userRecordType@32,length@8,isUpdate@true,compactCount@0,data@AAAAAAAAAAM=\n" +
- "operation@AddRecord,id@14,userRecordType@31,length@65,isUpdate@false,compactCount@0,data@AAAAEQAAAE4AAAAAAAAADgEAAAAEQQAxAAAA_wAAAAAAAAAAAAABTh2ZuhcEAQAAAAEAAAAGawBlAHkABgAAAAY=\n" +
- "operation@Update,id@14,userRecordType@32,length@8,isUpdate@true,compactCount@0,data@AAAAAAAAAAM=\n" +
- "operation@AddRecord,id@15,userRecordType@31,length@65,isUpdate@false,compactCount@0,data@AAAAEQAAAE4AAAAAAAAADwEAAAAEQQAxAAAA_wAAAAAAAAAAAAABTh2ZuhsEAQAAAAEAAAAGawBlAHkABgAAAAc=\n" +
+ "operation@AddRecord,id@15,userRecordType@45,length@83,isUpdate@false,compactCount@0,data@AQAAAAAAAAAPAQAAAARBADEAAAAAPQAAAA0AAAAAAAAADwEAAAAEQQAxAAAAAQAAAAAAAAAAAAABWpf6WLAEAQAAAAEAAAAGawBlAHkABgAAAAU=\n" +
"operation@Update,id@15,userRecordType@32,length@8,isUpdate@true,compactCount@0,data@AAAAAAAAAAM=\n" +
- "operation@AddRecord,id@16,userRecordType@31,length@65,isUpdate@false,compactCount@0,data@AAAAEQAAAE4AAAAAAAAAEAEAAAAEQQAxAAAA_wAAAAAAAAAAAAABTh2Zuh4EAQAAAAEAAAAGawBlAHkABgAAAAg=\n" +
+ "operation@AddRecord,id@16,userRecordType@45,length@83,isUpdate@false,compactCount@0,data@AQAAAAAAAAAQAQAAAARBADEAAAAAPQAAAA0AAAAAAAAAEAEAAAAEQQAxAAAAAQAAAAAAAAAAAAABWpf6WLIEAQAAAAEAAAAGawBlAHkABgAAAAY=\n" +
"operation@Update,id@16,userRecordType@32,length@8,isUpdate@true,compactCount@0,data@AAAAAAAAAAM=\n" +
- "operation@AddRecord,id@17,userRecordType@31,length@65,isUpdate@false,compactCount@0,data@AAAAEQAAAE4AAAAAAAAAEQEAAAAEQQAxAAAA_wAAAAAAAAAAAAABTh2ZuiIEAQAAAAEAAAAGawBlAHkABgAAAAk=\n" +
+ "operation@AddRecord,id@17,userRecordType@45,length@83,isUpdate@false,compactCount@0,data@AQAAAAAAAAARAQAAAARBADEAAAAAPQAAAA0AAAAAAAAAEQEAAAAEQQAxAAAAAQAAAAAAAAAAAAABWpf6WLgEAQAAAAEAAAAGawBlAHkABgAAAAc=\n" +
"operation@Update,id@17,userRecordType@32,length@8,isUpdate@true,compactCount@0,data@AAAAAAAAAAM=\n" +
+ "operation@AddRecord,id@18,userRecordType@45,length@83,isUpdate@false,compactCount@0,data@AQAAAAAAAAASAQAAAARBADEAAAAAPQAAAA0AAAAAAAAAEgEAAAAEQQAxAAAAAQAAAAAAAAAAAAABWpf6WLwEAQAAAAEAAAAGawBlAHkABgAAAAg=\n" +
+ "operation@Update,id@18,userRecordType@32,length@8,isUpdate@true,compactCount@0,data@AAAAAAAAAAM=\n" +
+ "operation@AddRecord,id@19,userRecordType@45,length@83,isUpdate@false,compactCount@0,data@AQAAAAAAAAATAQAAAARBADEAAAAAPQAAAA0AAAAAAAAAEwEAAAAEQQAxAAAAAQAAAAAAAAAAAAABWpf6WL4EAQAAAAEAAAAGawBlAHkABgAAAAk=\n" +
+ "operation@Update,id@19,userRecordType@32,length@8,isUpdate@true,compactCount@0,data@AAAAAAAAAAM=\n" +
"#File,JournalFileImpl: (activemq-data-2.amq id = 2, recordID = 2)";
@Test
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/replication/ReplicationTest.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/replication/ReplicationTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/replication/ReplicationTest.java
index 1ae9527..ab32517 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/replication/ReplicationTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/replication/ReplicationTest.java
@@ -58,6 +58,7 @@ import org.apache.activemq.artemis.core.journal.PreparedTransactionInfo;
import org.apache.activemq.artemis.core.journal.RecordInfo;
import org.apache.activemq.artemis.core.journal.TransactionFailureCallback;
import org.apache.activemq.artemis.core.journal.impl.JournalFile;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import org.apache.activemq.artemis.core.paging.PagedMessage;
import org.apache.activemq.artemis.core.paging.PagingManager;
import org.apache.activemq.artemis.core.paging.PagingStore;
@@ -65,6 +66,7 @@ import org.apache.activemq.artemis.core.paging.impl.PagedMessageImpl;
import org.apache.activemq.artemis.core.paging.impl.PagingManagerImpl;
import org.apache.activemq.artemis.core.paging.impl.PagingStoreFactoryNIO;
import org.apache.activemq.artemis.core.persistence.OperationContext;
+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.JournalStorageManager;
import org.apache.activemq.artemis.core.persistence.impl.journal.OperationContextImpl;
@@ -74,10 +76,8 @@ import org.apache.activemq.artemis.core.replication.ReplicatedJournal;
import org.apache.activemq.artemis.core.replication.ReplicationManager;
import org.apache.activemq.artemis.core.server.ActiveMQComponent;
import org.apache.activemq.artemis.core.server.ActiveMQServer;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.cluster.ClusterController;
import org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
import org.apache.activemq.artemis.core.settings.HierarchicalRepository;
import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
@@ -228,7 +228,7 @@ public final class ReplicationTest extends ActiveMQTestBase {
Assert.assertTrue("Expecting no active tokens:" + manager.getActiveTokens(), manager.getActiveTokens().isEmpty());
- ServerMessage msg = new ServerMessageImpl(1, 1024);
+ CoreMessage msg = new CoreMessage().initBuffer(1024).setMessageID(1);
SimpleString dummy = new SimpleString("dummy");
msg.setAddress(dummy);
@@ -259,12 +259,12 @@ public final class ReplicationTest extends ActiveMQTestBase {
blockOnReplication(storage, manager);
- ServerMessageImpl serverMsg = new ServerMessageImpl();
+ CoreMessage serverMsg = new CoreMessage();
serverMsg.setMessageID(500);
serverMsg.setAddress(new SimpleString("tttt"));
ActiveMQBuffer buffer = ActiveMQBuffers.dynamicBuffer(100);
- serverMsg.encodeHeadersAndProperties(buffer);
+ serverMsg.encodeHeadersAndProperties(buffer.byteBuf());
manager.largeMessageBegin(500);
@@ -619,6 +619,62 @@ public final class ReplicationTest extends ActiveMQTestBase {
static final class FakeJournal implements Journal {
@Override
+ public void appendAddRecord(long id,
+ byte recordType,
+ Persister persister,
+ Object record,
+ boolean sync) throws Exception {
+
+ }
+
+ @Override
+ public void appendAddRecord(long id,
+ byte recordType,
+ Persister persister,
+ Object record,
+ boolean sync,
+ IOCompletion completionCallback) throws Exception {
+
+ }
+
+ @Override
+ public void appendUpdateRecord(long id,
+ byte recordType,
+ Persister persister,
+ Object record,
+ boolean sync) throws Exception {
+
+ }
+
+ @Override
+ public void appendUpdateRecord(long id,
+ byte recordType,
+ Persister persister,
+ Object record,
+ boolean sync,
+ IOCompletion callback) throws Exception {
+
+ }
+
+ @Override
+ public void appendAddRecordTransactional(long txID,
+ long id,
+ byte recordType,
+ Persister persister,
+ Object record) throws Exception {
+
+ }
+
+ @Override
+ public void appendUpdateRecordTransactional(long txID,
+ long id,
+ byte recordType,
+ Persister persister,
+ Object record) throws Exception {
+
+ }
+
+ @Override
public void appendAddRecord(final long id,
final byte recordType,
final byte[] record,
@@ -756,11 +812,6 @@ public final class ReplicationTest extends ActiveMQTestBase {
}
@Override
- public void perfBlast(final int pages) {
-
- }
-
- @Override
public boolean isStarted() {
return false;
[03/17] activemq-artemis git commit: ARTEMIS-1009 Pure Message
Encoding.
Posted by cl...@apache.org.
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImplTest.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImplTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImplTest.java
index f374979..5e9a95a 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImplTest.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/config/impl/ConfigurationImplTest.java
@@ -77,7 +77,6 @@ public class ConfigurationImplTest extends ActiveMQTestBase {
Assert.assertEquals(ArtemisConstants.DEFAULT_JOURNAL_BUFFER_SIZE_AIO, conf.getJournalBufferSize_AIO());
Assert.assertEquals(ArtemisConstants.DEFAULT_JOURNAL_BUFFER_SIZE_NIO, conf.getJournalBufferSize_NIO());
Assert.assertEquals(ActiveMQDefaultConfiguration.isDefaultJournalLogWriteRate(), conf.isLogJournalWriteRate());
- Assert.assertEquals(ActiveMQDefaultConfiguration.getDefaultJournalPerfBlastPages(), conf.getJournalPerfBlastPages());
Assert.assertEquals(ActiveMQDefaultConfiguration.isDefaultMessageCounterEnabled(), conf.isMessageCounterEnabled());
Assert.assertEquals(ActiveMQDefaultConfiguration.getDefaultMessageCounterMaxDayHistory(), conf.getMessageCounterMaxDayHistory());
Assert.assertEquals(ActiveMQDefaultConfiguration.getDefaultMessageCounterSamplePeriod(), conf.getMessageCounterSamplePeriod());
@@ -232,10 +231,6 @@ public class ConfigurationImplTest extends ActiveMQTestBase {
conf.setLogJournalWriteRate(b);
Assert.assertEquals(b, conf.isLogJournalWriteRate());
- i = RandomUtil.randomInt();
- conf.setJournalPerfBlastPages(i);
- Assert.assertEquals(i, conf.getJournalPerfBlastPages());
-
l = RandomUtil.randomLong();
conf.setServerDumpInterval(l);
Assert.assertEquals(l, conf.getServerDumpInterval());
@@ -434,10 +429,6 @@ public class ConfigurationImplTest extends ActiveMQTestBase {
conf.setLogJournalWriteRate(b);
Assert.assertEquals(b, conf.isLogJournalWriteRate());
- i = RandomUtil.randomInt();
- conf.setJournalPerfBlastPages(i);
- Assert.assertEquals(i, conf.getJournalPerfBlastPages());
-
l = RandomUtil.randomLong();
conf.setServerDumpInterval(l);
Assert.assertEquals(l, conf.getServerDumpInterval());
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/test/java/org/apache/activemq/artemis/core/filter/impl/FilterTest.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/filter/impl/FilterTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/filter/impl/FilterTest.java
index d73accd..1eb749b 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/filter/impl/FilterTest.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/filter/impl/FilterTest.java
@@ -18,10 +18,10 @@ package org.apache.activemq.artemis.core.filter.impl;
import org.apache.activemq.artemis.api.core.ActiveMQException;
import org.apache.activemq.artemis.api.core.ActiveMQInvalidFilterExpressionException;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.filter.Filter;
-import org.apache.activemq.artemis.core.server.ServerMessage;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import org.apache.activemq.artemis.tests.util.SilentTestCase;
import org.apache.activemq.artemis.utils.RandomUtil;
import org.junit.Assert;
@@ -35,13 +35,13 @@ public class FilterTest extends SilentTestCase {
private Filter filter;
- private ServerMessage message;
+ private Message message;
@Override
@Before
public void setUp() throws Exception {
super.setUp();
- message = new ServerMessageImpl(1, 1000);
+ message = new CoreMessage().initBuffer(1024).setMessageID(1);
}
@Test
@@ -59,7 +59,7 @@ public class FilterTest extends SilentTestCase {
message.putStringProperty(new SimpleString("color"), new SimpleString("RED"));
Assert.assertTrue(filter.match(message));
- message = new ServerMessageImpl();
+ message = new CoreMessage();
Assert.assertFalse(filter.match(message));
}
@@ -94,7 +94,7 @@ public class FilterTest extends SilentTestCase {
filter = FilterImpl.createFilter(new SimpleString("AMQDurable='NON_DURABLE'"));
- message = new ServerMessageImpl();
+ message = new CoreMessage();
message.setDurable(true);
Assert.assertFalse(filter.match(message));
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/group/impl/ClusteredResetMockTest.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/group/impl/ClusteredResetMockTest.java b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/group/impl/ClusteredResetMockTest.java
index 0e9a3f2..2f18c21 100644
--- a/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/group/impl/ClusteredResetMockTest.java
+++ b/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/group/impl/ClusteredResetMockTest.java
@@ -23,6 +23,9 @@ import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import org.apache.activemq.artemis.api.core.BroadcastGroupConfiguration;
+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;
import org.apache.activemq.artemis.api.core.TransportConfiguration;
import org.apache.activemq.artemis.api.core.management.ManagementHelper;
@@ -43,8 +46,6 @@ import org.apache.activemq.artemis.core.server.ActiveMQServer;
import org.apache.activemq.artemis.core.server.Divert;
import org.apache.activemq.artemis.core.server.Queue;
import org.apache.activemq.artemis.core.server.QueueFactory;
-import org.apache.activemq.artemis.api.core.RoutingType;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.cluster.Bridge;
import org.apache.activemq.artemis.core.server.cluster.BroadcastGroup;
import org.apache.activemq.artemis.core.server.cluster.ClusterConnection;
@@ -329,7 +330,7 @@ public class ClusteredResetMockTest extends ActiveMQTestBase {
}
@Override
- public ServerMessage handleMessage(ServerMessage message) throws Exception {
+ public ICoreMessage handleMessage(Message message) throws Exception {
return null;
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/test/java/org/apache/activemq/artemis/core/server/impl/ScheduledDeliveryHandlerTest.java
----------------------------------------------------------------------
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 622f042..2bd8cb2 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
@@ -16,7 +16,6 @@
*/
package org.apache.activemq.artemis.core.server.impl;
-import java.io.InputStream;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedList;
@@ -31,27 +30,26 @@ import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
+import io.netty.buffer.ByteBuf;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
-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.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.BodyEncoder;
-import org.apache.activemq.artemis.core.paging.PagingStore;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import org.apache.activemq.artemis.core.paging.cursor.PageSubscription;
+import org.apache.activemq.artemis.core.persistence.Persister;
import org.apache.activemq.artemis.core.server.Consumer;
import org.apache.activemq.artemis.core.server.MessageReference;
import org.apache.activemq.artemis.core.server.Queue;
import org.apache.activemq.artemis.core.server.RoutingContext;
-import org.apache.activemq.artemis.api.core.RoutingType;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.transaction.Transaction;
import org.apache.activemq.artemis.utils.ActiveMQThreadFactory;
import org.apache.activemq.artemis.utils.LinkedListIterator;
import org.apache.activemq.artemis.utils.RandomUtil;
import org.apache.activemq.artemis.utils.ReferenceCounter;
-import org.apache.activemq.artemis.utils.TypedProperties;
import org.apache.activemq.artemis.utils.UUID;
import org.junit.Assert;
import org.junit.Test;
@@ -283,214 +281,164 @@ public class ScheduledDeliveryHandlerTest extends Assert {
}
}
- class FakeMessage implements ServerMessage {
-
- final long id;
-
- FakeMessage(final long id) {
- this.id = id;
- }
-
- @Override
- public FakeMessage setMessageID(long id) {
- return this;
- }
-
- @Override
- public long getMessageID() {
- return id;
- }
+ class FakeMessage extends RefCountMessage {
@Override
- public MessageReference createReference(Queue queue) {
+ public RoutingType getRouteType() {
return null;
}
@Override
- public void forceAddress(SimpleString address) {
-
- }
-
- @Override
- public int incrementRefCount() throws Exception {
- return 0;
- }
-
- @Override
- public int decrementRefCount() throws Exception {
- return 0;
+ public SimpleString getReplyTo() {
+ return null;
}
@Override
- public int incrementDurableRefCount() {
- return 0;
+ public Message setReplyTo(SimpleString address) {
+ return null;
}
@Override
- public int decrementDurableRefCount() {
- return 0;
+ public boolean containsDeliveryAnnotationProperty(SimpleString property) {
+ return false;
}
@Override
- public ServerMessage copy(long newID) {
+ public Object removeDeliveryAnnoationProperty(SimpleString key) {
return null;
}
@Override
- public ServerMessage copy() {
+ public Object getDeliveryAnnotationProperty(SimpleString key) {
return null;
}
@Override
- public int getMemoryEstimate() {
- return 0;
- }
+ public void persist(ActiveMQBuffer targetRecord) {
- @Override
- public int getRefCount() {
- return 0;
}
@Override
- public ServerMessage makeCopyForExpiryOrDLA(long newID,
- MessageReference originalReference,
- boolean expiry,
- boolean copyOriginalHeaders) throws Exception {
+ public Long getScheduledDeliveryTime() {
return null;
}
@Override
- public void setOriginalHeaders(ServerMessage other, MessageReference originalReference, boolean expiry) {
-
- }
-
- @Override
- public void setPagingStore(PagingStore store) {
+ public void reloadPersistence(ActiveMQBuffer record) {
}
@Override
- public PagingStore getPagingStore() {
+ public Persister<Message> getPersister() {
return null;
}
@Override
- public boolean hasInternalProperties() {
- return false;
- }
-
- @Override
- public boolean storeIsPaging() {
- return false;
+ public int getPersistSize() {
+ return 0;
}
+ final long id;
@Override
- public void encodeMessageIDToBuffer() {
-
+ public CoreMessage toCore() {
+ return null;
}
- @Override
- public byte[] getDuplicateIDBytes() {
- return new byte[0];
+ FakeMessage(final long id) {
+ this.id = id;
}
@Override
- public Object getDuplicateProperty() {
- return null;
+ public FakeMessage setMessageID(long id) {
+ return this;
}
@Override
- public void encode(ActiveMQBuffer buffer) {
-
+ public long getMessageID() {
+ return id;
}
@Override
- public void decode(ActiveMQBuffer buffer) {
-
+ public int incrementRefCount() throws Exception {
+ return 0;
}
@Override
- public void decodeFromBuffer(ActiveMQBuffer buffer) {
-
+ public int decrementRefCount() throws Exception {
+ return 0;
}
@Override
- public int getEndOfMessagePosition() {
+ public int incrementDurableRefCount() {
return 0;
}
@Override
- public int getEndOfBodyPosition() {
+ public int decrementDurableRefCount() {
return 0;
}
@Override
- public void bodyChanged() {
-
+ public Message copy(long newID) {
+ return null;
}
@Override
- public boolean isServerMessage() {
- return false;
+ public Message copy() {
+ return null;
}
@Override
- public ActiveMQBuffer getEncodedBuffer() {
- return null;
+ public int getMemoryEstimate() {
+ return 0;
}
@Override
- public int getHeadersAndPropertiesEncodeSize() {
+ public int getRefCount() {
return 0;
}
@Override
- public ActiveMQBuffer getWholeBuffer() {
- return null;
+ public byte[] getDuplicateIDBytes() {
+ return new byte[0];
}
@Override
- public void encodeHeadersAndProperties(ActiveMQBuffer buffer) {
-
+ public Object getDuplicateProperty() {
+ return null;
}
@Override
- public void decodeHeadersAndProperties(ActiveMQBuffer buffer) {
+ public void messageChanged() {
}
@Override
- public BodyEncoder getBodyEncoder() throws ActiveMQException {
+ public UUID getUserID() {
return null;
}
@Override
- public InputStream getBodyInputStream() {
+ public String getAddress() {
return null;
}
@Override
- public void setAddressTransient(SimpleString address) {
-
- }
-
- @Override
- public TypedProperties getTypedProperties() {
+ public SimpleString getAddressSimpleString() {
return null;
}
@Override
- public UUID getUserID() {
+ public Message setBuffer(ByteBuf buffer) {
return null;
}
@Override
- public FakeMessage setUserID(UUID userID) {
- return this;
+ public ByteBuf getBuffer() {
+ return null;
}
-
@Override
- public SimpleString getAddress() {
+ public Message setAddress(String address) {
return null;
}
@@ -500,11 +448,6 @@ public class ScheduledDeliveryHandlerTest extends Assert {
}
@Override
- public byte getType() {
- return 0;
- }
-
- @Override
public boolean isDurable() {
return false;
}
@@ -560,16 +503,6 @@ public class ScheduledDeliveryHandlerTest extends Assert {
}
@Override
- public ActiveMQBuffer getBodyBuffer() {
- return null;
- }
-
- @Override
- public ActiveMQBuffer getBodyBufferDuplicate() {
- return null;
- }
-
- @Override
public Message putBooleanProperty(SimpleString key, boolean value) {
return null;
}
@@ -825,13 +758,23 @@ public class ScheduledDeliveryHandlerTest extends Assert {
}
@Override
- public FakeMessage writeBodyBufferBytes(byte[] bytes) {
- return this;
+ public Message setUserID(Object userID) {
+ return null;
}
@Override
- public FakeMessage writeBodyBufferString(String string) {
- return this;
+ public void copyHeadersAndProperties(Message msg) {
+
+ }
+
+ @Override
+ public void receiveBuffer(ByteBuf buffer) {
+
+ }
+
+ @Override
+ public void sendBuffer(ByteBuf buffer, int count) {
+
}
}
@@ -1221,7 +1164,7 @@ public class ScheduledDeliveryHandlerTest extends Assert {
}
@Override
- public boolean hasMatchingConsumer(ServerMessage message) {
+ public boolean hasMatchingConsumer(Message message) {
return false;
}
@@ -1338,12 +1281,12 @@ public class ScheduledDeliveryHandlerTest extends Assert {
}
@Override
- public void route(ServerMessage message, RoutingContext context) throws Exception {
+ public void route(Message message, RoutingContext context) throws Exception {
}
@Override
- public void routeWithAck(ServerMessage message, RoutingContext context) {
+ public void routeWithAck(Message message, RoutingContext context) {
}
@@ -1366,5 +1309,9 @@ public class ScheduledDeliveryHandlerTest extends Assert {
public void decDelivering(int size) {
}
+
+
+
+
}
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/test/java/org/apache/activemq/artemis/core/transaction/impl/TransactionImplTest.java
----------------------------------------------------------------------
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 ee80054..b1ea206 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,13 +26,13 @@ import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicInteger;
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;
import org.apache.activemq.artemis.core.io.IOCallback;
import org.apache.activemq.artemis.core.io.SequentialFile;
import org.apache.activemq.artemis.core.journal.Journal;
import org.apache.activemq.artemis.core.journal.JournalLoadInformation;
-import org.apache.activemq.artemis.core.message.impl.MessageInternal;
import org.apache.activemq.artemis.core.paging.PageTransactionInfo;
import org.apache.activemq.artemis.core.paging.PagedMessage;
import org.apache.activemq.artemis.core.paging.PagingManager;
@@ -53,7 +53,6 @@ import org.apache.activemq.artemis.core.replication.ReplicationManager;
import org.apache.activemq.artemis.core.server.LargeServerMessage;
import org.apache.activemq.artemis.core.server.MessageReference;
import org.apache.activemq.artemis.core.server.RouteContextList;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.files.FileStoreMonitor;
import org.apache.activemq.artemis.core.server.group.impl.GroupBinding;
import org.apache.activemq.artemis.core.server.impl.AddressInfo;
@@ -323,7 +322,7 @@ public class TransactionImplTest extends ActiveMQTestBase {
}
@Override
- public void storeMessage(ServerMessage message) throws Exception {
+ public void storeMessage(Message message) throws Exception {
}
@@ -368,7 +367,7 @@ public class TransactionImplTest extends ActiveMQTestBase {
}
@Override
- public void storeMessageTransactional(long txID, ServerMessage message) throws Exception {
+ public void storeMessageTransactional(long txID, Message message) throws Exception {
}
@@ -439,7 +438,7 @@ public class TransactionImplTest extends ActiveMQTestBase {
}
@Override
- public LargeServerMessage createLargeMessage(long id, MessageInternal message) throws Exception {
+ public LargeServerMessage createLargeMessage(long id, Message message) throws Exception {
return null;
}
@@ -489,11 +488,6 @@ public class TransactionImplTest extends ActiveMQTestBase {
}
@Override
- public void updatePageTransaction(PageTransactionInfo pageTransaction, int depage) throws Exception {
-
- }
-
- @Override
public void deletePageTransactional(long recordID) throws Exception {
}
@@ -643,7 +637,7 @@ public class TransactionImplTest extends ActiveMQTestBase {
@Override
public boolean addToPage(PagingStore store,
- ServerMessage msg,
+ Message msg,
Transaction tx,
RouteContextList listCtx) throws Exception {
return false;
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/test/java/org/apache/activemq/artemis/tests/util/ActiveMQTestBase.java
----------------------------------------------------------------------
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 2f12b05..0bb177d 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
@@ -65,6 +65,7 @@ import java.util.concurrent.atomic.AtomicInteger;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
import org.apache.activemq.artemis.api.core.ActiveMQException;
import org.apache.activemq.artemis.api.core.ActiveMQExceptionType;
+import org.apache.activemq.artemis.api.core.ICoreMessage;
import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.Pair;
import org.apache.activemq.artemis.api.core.SimpleString;
@@ -94,6 +95,7 @@ import org.apache.activemq.artemis.core.journal.RecordInfo;
import org.apache.activemq.artemis.core.journal.impl.JournalFile;
import org.apache.activemq.artemis.core.journal.impl.JournalImpl;
import org.apache.activemq.artemis.core.journal.impl.JournalReaderCallback;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import org.apache.activemq.artemis.core.paging.PagingStore;
import org.apache.activemq.artemis.core.persistence.impl.journal.OperationContextImpl;
import org.apache.activemq.artemis.core.postoffice.Binding;
@@ -117,14 +119,12 @@ import org.apache.activemq.artemis.core.server.JournalType;
import org.apache.activemq.artemis.core.server.MessageReference;
import org.apache.activemq.artemis.core.server.NodeManager;
import org.apache.activemq.artemis.core.server.Queue;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.cluster.ClusterConnection;
import org.apache.activemq.artemis.core.server.cluster.ClusterManager;
import org.apache.activemq.artemis.core.server.cluster.RemoteQueueBinding;
import org.apache.activemq.artemis.core.server.cluster.impl.MessageLoadBalancingType;
import org.apache.activemq.artemis.core.server.impl.Activation;
import org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
import org.apache.activemq.artemis.core.server.impl.SharedNothingBackupActivation;
import org.apache.activemq.artemis.core.settings.impl.AddressFullMessagePolicy;
import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
@@ -855,7 +855,7 @@ public abstract class ActiveMQTestBase extends Assert {
return testDir1 + "/journal";
}
- protected String getJournalDir(final int index, final boolean backup) {
+ public String getJournalDir(final int index, final boolean backup) {
return getJournalDir(getTestDir(), index, backup);
}
@@ -2079,8 +2079,8 @@ public abstract class ActiveMQTestBase extends Assert {
}
}
- protected ServerMessage generateMessage(final long id) {
- ServerMessage message = new ServerMessageImpl(id, 1000);
+ protected Message generateMessage(final long id) {
+ ICoreMessage message = new CoreMessage(id, 1000);
message.setMessageID(id);
@@ -2092,9 +2092,9 @@ public abstract class ActiveMQTestBase extends Assert {
}
protected MessageReference generateReference(final Queue queue, final long id) {
- ServerMessage message = generateMessage(id);
+ Message message = generateMessage(id);
- return message.createReference(queue);
+ return MessageReference.Factory.createReference(message, queue);
}
protected int calculateRecordSize(final int size, final int alignment) {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/test/resources/ConfigurationTest-full-config.xml
----------------------------------------------------------------------
diff --git a/artemis-server/src/test/resources/ConfigurationTest-full-config.xml b/artemis-server/src/test/resources/ConfigurationTest-full-config.xml
index 9ed5584..0691e95 100644
--- a/artemis-server/src/test/resources/ConfigurationTest-full-config.xml
+++ b/artemis-server/src/test/resources/ConfigurationTest-full-config.xml
@@ -231,8 +231,6 @@
<journal-compact-percentage>33</journal-compact-percentage>
<journal-compact-min-files>123</journal-compact-min-files>
<journal-max-io>56546</journal-max-io>
- <perf-blast-pages>5</perf-blast-pages>
- <run-sync-speed-test>true</run-sync-speed-test>
<server-dump-interval>5000</server-dump-interval>
<memory-warning-threshold>95</memory-warning-threshold>
<memory-measure-interval>54321</memory-measure-interval>
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-tools/src/test/resources/artemis-configuration.xsd
----------------------------------------------------------------------
diff --git a/artemis-tools/src/test/resources/artemis-configuration.xsd b/artemis-tools/src/test/resources/artemis-configuration.xsd
index fcb7a20..090f968 100644
--- a/artemis-tools/src/test/resources/artemis-configuration.xsd
+++ b/artemis-tools/src/test/resources/artemis-configuration.xsd
@@ -673,22 +673,6 @@
</xsd:annotation>
</xsd:element>
- <xsd:element name="perf-blast-pages" type="xsd:int" default="-1" maxOccurs="1" minOccurs="0">
- <xsd:annotation>
- <xsd:documentation>
- XXX Only meant to be used by project developers
- </xsd:documentation>
- </xsd:annotation>
- </xsd:element>
-
- <xsd:element name="run-sync-speed-test" type="xsd:boolean" default="false" maxOccurs="1" minOccurs="0">
- <xsd:annotation>
- <xsd:documentation>
- XXX Only meant to be used by project developers
- </xsd:documentation>
- </xsd:annotation>
- </xsd:element>
-
<xsd:element name="server-dump-interval" type="xsd:long" default="-1" maxOccurs="1" minOccurs="0">
<xsd:annotation>
<xsd:documentation>
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/examples/features/standard/bridge/src/main/java/org/apache/activemq/artemis/jms/example/HatColourChangeTransformer.java
----------------------------------------------------------------------
diff --git a/examples/features/standard/bridge/src/main/java/org/apache/activemq/artemis/jms/example/HatColourChangeTransformer.java b/examples/features/standard/bridge/src/main/java/org/apache/activemq/artemis/jms/example/HatColourChangeTransformer.java
index d7a7bdc..df9d79e 100644
--- a/examples/features/standard/bridge/src/main/java/org/apache/activemq/artemis/jms/example/HatColourChangeTransformer.java
+++ b/examples/features/standard/bridge/src/main/java/org/apache/activemq/artemis/jms/example/HatColourChangeTransformer.java
@@ -16,14 +16,14 @@
*/
package org.apache.activemq.artemis.jms.example;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.cluster.Transformer;
public class HatColourChangeTransformer implements Transformer {
@Override
- public ServerMessage transform(final ServerMessage message) {
+ public Message transform(final Message message) {
SimpleString propName = new SimpleString("hat");
SimpleString oldProp = message.getSimpleStringProperty(propName);
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/examples/features/standard/divert/src/main/java/org/apache/activemq/artemis/jms/example/AddForwardingTimeTransformer.java
----------------------------------------------------------------------
diff --git a/examples/features/standard/divert/src/main/java/org/apache/activemq/artemis/jms/example/AddForwardingTimeTransformer.java b/examples/features/standard/divert/src/main/java/org/apache/activemq/artemis/jms/example/AddForwardingTimeTransformer.java
index 22272d0..2f75d4c 100644
--- a/examples/features/standard/divert/src/main/java/org/apache/activemq/artemis/jms/example/AddForwardingTimeTransformer.java
+++ b/examples/features/standard/divert/src/main/java/org/apache/activemq/artemis/jms/example/AddForwardingTimeTransformer.java
@@ -16,16 +16,13 @@
*/
package org.apache.activemq.artemis.jms.example;
-import org.apache.activemq.artemis.api.core.SimpleString;
-import org.apache.activemq.artemis.core.server.ServerMessage;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.core.server.cluster.Transformer;
public class AddForwardingTimeTransformer implements Transformer {
@Override
- public ServerMessage transform(final ServerMessage message) {
- message.putLongProperty(new SimpleString("time_of_forward"), System.currentTimeMillis());
-
+ public Message transform(final Message message) {
return message;
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/pom.xml
----------------------------------------------------------------------
diff --git a/pom.xml b/pom.xml
index 5b056ad..e9a5bad 100644
--- a/pom.xml
+++ b/pom.xml
@@ -82,11 +82,11 @@
<jetty.version>9.4.0.M1</jetty.version>
<jgroups.version>3.6.9.Final</jgroups.version>
<maven.assembly.plugin.version>2.4</maven.assembly.plugin.version>
- <netty.version>4.1.5.Final</netty.version>
- <proton.version>0.16.0</proton.version>
+ <netty.version>4.1.8.Final</netty.version>
+ <proton.version>0.17.0</proton.version>
<resteasy.version>3.0.19.Final</resteasy.version>
<slf4j.version>1.7.21</slf4j.version>
- <qpid.jms.version>0.11.0</qpid.jms.version>
+ <qpid.jms.version>0.20.0</qpid.jms.version>
<johnzon.version>0.9.5</johnzon.version>
<json-p.spec.version>1.0-alpha-1</json-p.spec.version>
<javax.inject.version>1</javax.inject.version>
@@ -1006,6 +1006,7 @@
<arg>-Xep:StaticAccessedFromInstance:ERROR</arg>
<arg>-Xep:SynchronizeOnNonFinalField:ERROR</arg>
<arg>-Xep:WaitNotInLoop:ERROR</arg>
+ <arg>-Xdiags:verbose</arg>
</compilerArgs>
</configuration>
<dependencies>
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/artemis-test-support/src/main/java/org/apache/activemq/transport/amqp/client/transport/PartialPooledByteBufAllocator.java
----------------------------------------------------------------------
diff --git a/tests/artemis-test-support/src/main/java/org/apache/activemq/transport/amqp/client/transport/PartialPooledByteBufAllocator.java b/tests/artemis-test-support/src/main/java/org/apache/activemq/transport/amqp/client/transport/PartialPooledByteBufAllocator.java
index 12f5568..17f601a 100644
--- a/tests/artemis-test-support/src/main/java/org/apache/activemq/transport/amqp/client/transport/PartialPooledByteBufAllocator.java
+++ b/tests/artemis-test-support/src/main/java/org/apache/activemq/transport/amqp/client/transport/PartialPooledByteBufAllocator.java
@@ -37,6 +37,11 @@ public class PartialPooledByteBufAllocator implements ByteBufAllocator {
}
@Override
+ public int calculateNewCapacity(int minNewCapacity, int maxCapacity) {
+ return POOLED.calculateNewCapacity(minNewCapacity, maxCapacity);
+ }
+
+ @Override
public ByteBuf buffer() {
return UNPOOLED.heapBuffer();
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/artemis-test-support/src/main/java/org/apache/activemq/transport/amqp/client/util/UnmodifiableDelivery.java
----------------------------------------------------------------------
diff --git a/tests/artemis-test-support/src/main/java/org/apache/activemq/transport/amqp/client/util/UnmodifiableDelivery.java b/tests/artemis-test-support/src/main/java/org/apache/activemq/transport/amqp/client/util/UnmodifiableDelivery.java
index dea8602..d9bddcb 100644
--- a/tests/artemis-test-support/src/main/java/org/apache/activemq/transport/amqp/client/util/UnmodifiableDelivery.java
+++ b/tests/artemis-test-support/src/main/java/org/apache/activemq/transport/amqp/client/util/UnmodifiableDelivery.java
@@ -51,6 +51,12 @@ public class UnmodifiableDelivery implements Delivery {
}
}
+ /* waiting Pull Request sent
+ @Override
+ public int getDataLength() {
+ return delivery.getDataLength();
+ } */
+
@Override
public DeliveryState getLocalState() {
return delivery.getLocalState();
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/extra-tests/src/test/java/org/apache/activemq/artemis/tests/extras/benchmarks/journal/gcfree/EncodersBench.java
----------------------------------------------------------------------
diff --git a/tests/extra-tests/src/test/java/org/apache/activemq/artemis/tests/extras/benchmarks/journal/gcfree/EncodersBench.java b/tests/extra-tests/src/test/java/org/apache/activemq/artemis/tests/extras/benchmarks/journal/gcfree/EncodersBench.java
index 833302d..162a512 100644
--- a/tests/extra-tests/src/test/java/org/apache/activemq/artemis/tests/extras/benchmarks/journal/gcfree/EncodersBench.java
+++ b/tests/extra-tests/src/test/java/org/apache/activemq/artemis/tests/extras/benchmarks/journal/gcfree/EncodersBench.java
@@ -23,6 +23,7 @@ import java.util.concurrent.TimeUnit;
import io.netty.buffer.Unpooled;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
import org.apache.activemq.artemis.core.buffers.impl.ChannelBufferWrapper;
+import org.apache.activemq.artemis.core.journal.EncoderPersister;
import org.apache.activemq.artemis.core.journal.EncodingSupport;
import org.apache.activemq.artemis.core.journal.impl.dataformat.JournalAddRecord;
import org.apache.activemq.artemis.core.journal.impl.dataformat.JournalInternalRecord;
@@ -61,7 +62,7 @@ public class EncodersBench {
this.byteBuffer.order(ByteOrder.nativeOrder());
this.addJournalRecordEncoder = new AddJournalRecordEncoder();
- this.record = new JournalAddRecord(true, 1, (byte) 1, ZeroEncodingSupport.Instance);
+ this.record = new JournalAddRecord(true, 1, (byte) 1, EncoderPersister.getInstance(), ZeroEncodingSupport.Instance);
this.record.setFileID(1);
this.record.setCompactCount((short) 1);
this.outBuffer = new ChannelBufferWrapper(Unpooled.directBuffer(this.record.getEncodeSize(), this.record.getEncodeSize()).order(ByteOrder.nativeOrder()));
@@ -86,7 +87,7 @@ public class EncodersBench {
@Benchmark
public int encodeUnalignedWithGarbage() {
outBuffer.clear();
- final JournalAddRecord addRecord = new JournalAddRecord(true, 1, (byte) 1, ZeroEncodingSupport.Instance);
+ final JournalAddRecord addRecord = new JournalAddRecord(true, 1, (byte) 1, EncoderPersister.getInstance(), ZeroEncodingSupport.Instance);
addRecord.setFileID(1);
addRecord.setCompactCount((short) 1);
addRecord.encode(outBuffer);
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/extra-tests/src/test/java/org/apache/activemq/artemis/tests/extras/byteman/JMSBridgeReconnectionTest.java
----------------------------------------------------------------------
diff --git a/tests/extra-tests/src/test/java/org/apache/activemq/artemis/tests/extras/byteman/JMSBridgeReconnectionTest.java b/tests/extra-tests/src/test/java/org/apache/activemq/artemis/tests/extras/byteman/JMSBridgeReconnectionTest.java
index ef71e89..03e2ddc 100644
--- a/tests/extra-tests/src/test/java/org/apache/activemq/artemis/tests/extras/byteman/JMSBridgeReconnectionTest.java
+++ b/tests/extra-tests/src/test/java/org/apache/activemq/artemis/tests/extras/byteman/JMSBridgeReconnectionTest.java
@@ -19,8 +19,8 @@ package org.apache.activemq.artemis.tests.extras.byteman;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.core.client.impl.ClientProducerCredits;
-import org.apache.activemq.artemis.core.message.impl.MessageInternal;
import org.apache.activemq.artemis.core.protocol.core.Packet;
import org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl;
import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionSendMessage;
@@ -111,7 +111,7 @@ public class JMSBridgeReconnectionTest extends BridgeTestBase {
static int count = 20;
static CountDownLatch stopLatch = new CountDownLatch(1);
- public static void pause2(MessageInternal msgI, boolean sendBlocking, final ClientProducerCredits theCredits) {
+ public static void pause2(Message msgI, boolean sendBlocking, final ClientProducerCredits theCredits) {
if (msgI.containsProperty("__AMQ_CID")) {
count--;
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/extra-tests/src/test/java/org/apache/activemq/artemis/tests/extras/byteman/MessageCopyTest.java
----------------------------------------------------------------------
diff --git a/tests/extra-tests/src/test/java/org/apache/activemq/artemis/tests/extras/byteman/MessageCopyTest.java b/tests/extra-tests/src/test/java/org/apache/activemq/artemis/tests/extras/byteman/MessageCopyTest.java
deleted file mode 100644
index 1ff58cd..0000000
--- a/tests/extra-tests/src/test/java/org/apache/activemq/artemis/tests/extras/byteman/MessageCopyTest.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * 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.extras.byteman;
-
-import java.util.ArrayList;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.atomic.AtomicInteger;
-
-import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
-import org.apache.activemq.artemis.api.core.SimpleString;
-import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionSendMessage;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
-import org.apache.activemq.artemis.utils.RandomUtil;
-import org.jboss.byteman.contrib.bmunit.BMRule;
-import org.jboss.byteman.contrib.bmunit.BMRules;
-import org.jboss.byteman.contrib.bmunit.BMUnitRunner;
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-@RunWith(BMUnitRunner.class)
-public class MessageCopyTest {
-
- @Test
- @BMRules(
-
- rules = {@BMRule(
- name = "message-copy0",
- targetClass = "org.apache.activemq.artemis.core.server.impl.ServerMessageImpl",
- targetMethod = "copy()",
- targetLocation = "ENTRY",
- action = "System.out.println(\"copy\"), waitFor(\"encode-done\")"), @BMRule(
- name = "message-copy-done",
- targetClass = "org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionSendMessage",
- targetMethod = "encode(org.apache.activemq.artemis.spi.core.protocol.RemotingConnection)",
- targetLocation = "EXIT",
- action = "System.out.println(\"encodeDone\"), signalWake(\"encode-done\", true)"), @BMRule(
- name = "message-copy1",
- targetClass = "org.apache.activemq.artemis.core.buffers.impl.ChannelBufferWrapper",
- targetMethod = "copy(int, int)",
- condition = "Thread.currentThread().getName().equals(\"T1\")",
- targetLocation = "EXIT",
- action = "System.out.println(\"setIndex at \" + Thread.currentThread().getName()), waitFor(\"finish-read\")"), @BMRule(
- name = "JMSServer.stop wait-init",
- targetClass = "org.apache.activemq.artemis.tests.extras.byteman.MessageCopyTest",
- targetMethod = "simulateRead",
- targetLocation = "EXIT",
- action = "signalWake(\"finish-read\", true)")})
- public void testMessageCopyIssue() throws Exception {
- final long RUNS = 1;
- final ServerMessageImpl msg = new ServerMessageImpl(123, 18);
-
- msg.setMessageID(RandomUtil.randomLong());
- msg.encodeMessageIDToBuffer();
- msg.setAddress(new SimpleString("Batatantkashf aksjfh aksfjh askfdjh askjfh "));
-
- final AtomicInteger errors = new AtomicInteger(0);
-
- int T1_number = 1;
- int T2_number = 1;
-
- final CountDownLatch latchAlign = new CountDownLatch(T1_number + T2_number);
- final CountDownLatch latchReady = new CountDownLatch(1);
- class T1 extends Thread {
-
- T1() {
- super("T1");
- }
-
- @Override
- public void run() {
- latchAlign.countDown();
- try {
- latchReady.await();
- } catch (Exception ignored) {
- }
-
- for (int i = 0; i < RUNS; i++) {
- try {
- ServerMessageImpl newMsg = (ServerMessageImpl) msg.copy();
- } catch (Throwable e) {
- e.printStackTrace();
- errors.incrementAndGet();
- }
- }
- }
- }
-
- class T2 extends Thread {
-
- T2() {
- super("T2");
- }
-
- @Override
- public void run() {
- latchAlign.countDown();
- try {
- latchReady.await();
- } catch (Exception ignored) {
- }
-
- for (int i = 0; i < RUNS; i++) {
- try {
- SessionSendMessage ssm = new SessionSendMessage(msg);
- ActiveMQBuffer buf = ssm.encode(null);
- System.out.println("reading at buf = " + buf);
- simulateRead(buf);
- } catch (Throwable e) {
- e.printStackTrace();
- errors.incrementAndGet();
- }
- }
- }
- }
-
- ArrayList<Thread> threads = new ArrayList<>();
-
- for (int i = 0; i < T1_number; i++) {
- T1 t = new T1();
- threads.add(t);
- t.start();
- }
-
- for (int i = 0; i < T2_number; i++) {
- T2 t2 = new T2();
- threads.add(t2);
- t2.start();
- }
-
- latchAlign.await();
-
- latchReady.countDown();
-
- for (Thread t : threads) {
- t.join();
- }
-
- Assert.assertEquals(0, errors.get());
- }
-
- private void simulateRead(ActiveMQBuffer buf) {
- buf.setIndex(buf.capacity() / 2, buf.capacity() / 2);
-
- // ok this is not actually happening during the read process, but changing this shouldn't affect the buffer on copy
- buf.writeBytes(new byte[1024]);
- }
-
-}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/DuplicateDetectionTest.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/DuplicateDetectionTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/DuplicateDetectionTest.java
index 8456765..0860e97 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/DuplicateDetectionTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/DuplicateDetectionTest.java
@@ -33,7 +33,7 @@ import org.apache.activemq.artemis.api.core.client.ClientSession;
import org.apache.activemq.artemis.api.core.client.ClientSessionFactory;
import org.apache.activemq.artemis.api.core.client.ServerLocator;
import org.apache.activemq.artemis.core.config.Configuration;
-import org.apache.activemq.artemis.core.message.impl.MessageImpl;
+
import org.apache.activemq.artemis.core.postoffice.impl.PostOfficeImpl;
import org.apache.activemq.artemis.core.server.ActiveMQServer;
import org.apache.activemq.artemis.core.transaction.impl.XidImpl;
@@ -191,13 +191,13 @@ public class DuplicateDetectionTest extends ActiveMQTestBase {
Assert.assertNull(message2);
message = createMessage(session, 3);
- message.putBytesProperty(MessageImpl.HDR_BRIDGE_DUPLICATE_ID, dupID.getData());
+ message.putBytesProperty(Message.HDR_BRIDGE_DUPLICATE_ID, dupID.getData());
producer.send(message);
message2 = consumer.receive(1000);
Assert.assertEquals(3, message2.getObjectProperty(propKey));
message = createMessage(session, 4);
- message.putBytesProperty(MessageImpl.HDR_BRIDGE_DUPLICATE_ID, dupID.getData());
+ message.putBytesProperty(Message.HDR_BRIDGE_DUPLICATE_ID, dupID.getData());
producer.send(message);
message2 = consumer.receiveImmediate();
Assert.assertNull(message2);
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/AmqpDescribedTypePayloadTest.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/AmqpDescribedTypePayloadTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/AmqpDescribedTypePayloadTest.java
index bbb9c26..138f3cc 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/AmqpDescribedTypePayloadTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/AmqpDescribedTypePayloadTest.java
@@ -24,6 +24,7 @@ import javax.jms.Destination;
import javax.jms.Message;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
+import javax.jms.ObjectMessage;
import javax.jms.Session;
import org.apache.activemq.ActiveMQConnectionFactory;
@@ -35,6 +36,7 @@ import org.apache.activemq.transport.amqp.client.AmqpNoLocalFilter;
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.junit.Test;
/**
@@ -119,7 +121,7 @@ public class AmqpDescribedTypePayloadTest extends AmqpClientTestSupport {
assertEquals(1, queue.getMessageCount());
// Receive and resend with OpenWire JMS client
- ActiveMQConnectionFactory factory = new ActiveMQConnectionFactory("tcp://localhost:61616");
+ JmsConnectionFactory factory = new JmsConnectionFactory("amqp://localhost:61616");
Connection jmsConnection = factory.createConnection();
try {
Session jmsSession = jmsConnection.createSession(false, Session.AUTO_ACKNOWLEDGE);
@@ -129,7 +131,7 @@ public class AmqpDescribedTypePayloadTest extends AmqpClientTestSupport {
Message received = jmsConsumer.receive(5000);
assertNotNull(received);
- assertTrue(received instanceof BytesMessage);
+ assertTrue(received instanceof ObjectMessage);
MessageProducer jmsProducer = jmsSession.createProducer(destination);
jmsProducer.send(received);
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/AmqpSendReceiveTest.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/AmqpSendReceiveTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/AmqpSendReceiveTest.java
index 0f006bc..70ff658 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/AmqpSendReceiveTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/AmqpSendReceiveTest.java
@@ -243,27 +243,6 @@ public class AmqpSendReceiveTest extends AmqpClientTestSupport {
assertEquals(2, server.locateQueue(SimpleString.toSimpleString(queueC)).getMessageCount() + server.locateQueue(SimpleString.toSimpleString(queueB)).getMessageCount());
}
- @Test
- public void testAmbiguousMessageRouting() throws Exception {
- final String addressA = "addressA";
- final String queueA = "queueA";
- final String queueB = "queueB";
- final String queueC = "queueC";
- final String queueD = "queueD";
-
- ActiveMQServerControl serverControl = server.getActiveMQServerControl();
- serverControl.createAddress(addressA, RoutingType.ANYCAST.toString() + "," + RoutingType.MULTICAST.toString());
- serverControl.createQueue(addressA, queueA, RoutingType.ANYCAST.toString());
- serverControl.createQueue(addressA, queueB, RoutingType.ANYCAST.toString());
- serverControl.createQueue(addressA, queueC, RoutingType.MULTICAST.toString());
- serverControl.createQueue(addressA, queueD, RoutingType.MULTICAST.toString());
-
- sendMessages(addressA, 1);
-
- assertEquals(1, server.locateQueue(SimpleString.toSimpleString(queueA)).getMessageCount() + server.locateQueue(SimpleString.toSimpleString(queueB)).getMessageCount());
- assertEquals(2, server.locateQueue(SimpleString.toSimpleString(queueC)).getMessageCount() + server.locateQueue(SimpleString.toSimpleString(queueD)).getMessageCount());
- }
-
@Test(timeout = 60000)
public void testMessageDurableFalse() throws Exception {
sendMessages(getTestName(), 1, false);
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/ProtonTest.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/ProtonTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/ProtonTest.java
index 7962005..39daee4 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/ProtonTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/amqp/ProtonTest.java
@@ -16,28 +16,6 @@
*/
package org.apache.activemq.artemis.tests.integration.amqp;
-import static org.apache.activemq.artemis.protocol.amqp.proton.AmqpSupport.DELAYED_DELIVERY;
-import static org.apache.activemq.artemis.protocol.amqp.proton.AmqpSupport.PRODUCT;
-import static org.apache.activemq.artemis.protocol.amqp.proton.AmqpSupport.VERSION;
-import static org.apache.activemq.artemis.protocol.amqp.proton.AmqpSupport.contains;
-
-import java.io.IOException;
-import java.io.Serializable;
-import java.lang.reflect.Field;
-import java.net.URI;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Random;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicInteger;
-
import javax.jms.BytesMessage;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
@@ -61,7 +39,24 @@ import javax.jms.Topic;
import javax.jms.TopicPublisher;
import javax.jms.TopicSession;
import javax.jms.TopicSubscriber;
+import java.io.IOException;
+import java.io.Serializable;
+import java.lang.reflect.Field;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Random;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicInteger;
+import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.api.core.management.ResourceNames;
import org.apache.activemq.artemis.core.config.Configuration;
@@ -71,14 +66,13 @@ import org.apache.activemq.artemis.core.remoting.impl.netty.NettyConnector;
import org.apache.activemq.artemis.core.remoting.impl.netty.TransportConstants;
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.server.impl.AddressInfo;
import org.apache.activemq.artemis.core.settings.impl.AddressFullMessagePolicy;
import org.apache.activemq.artemis.core.settings.impl.AddressSettings;
+import org.apache.activemq.artemis.protocol.amqp.broker.ProtonProtocolManagerFactory;
import org.apache.activemq.artemis.protocol.amqp.client.AMQPClientConnectionFactory;
import org.apache.activemq.artemis.protocol.amqp.client.ProtonClientConnectionManager;
import org.apache.activemq.artemis.protocol.amqp.client.ProtonClientProtocolManager;
-import org.apache.activemq.artemis.protocol.amqp.broker.ProtonProtocolManagerFactory;
import org.apache.activemq.artemis.protocol.amqp.proton.AmqpSupport;
import org.apache.activemq.artemis.protocol.amqp.proton.ProtonServerReceiverContext;
import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
@@ -105,6 +99,11 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
+import static org.apache.activemq.artemis.protocol.amqp.proton.AmqpSupport.DELAYED_DELIVERY;
+import static org.apache.activemq.artemis.protocol.amqp.proton.AmqpSupport.PRODUCT;
+import static org.apache.activemq.artemis.protocol.amqp.proton.AmqpSupport.VERSION;
+import static org.apache.activemq.artemis.protocol.amqp.proton.AmqpSupport.contains;
+
@RunWith(Parameterized.class)
public class ProtonTest extends ProtonTestBase {
@@ -224,6 +223,7 @@ public class ProtonTest extends ProtonTestBase {
TextMessage message = session.createTextMessage("test-message");
producer.send(message);
+
producer.close();
connection.start();
@@ -378,7 +378,7 @@ public class ProtonTest extends ProtonTestBase {
receiver.flow(1);
// Shouldn't get this since we delayed the message.
- assertNull(receiver.receive(5, TimeUnit.SECONDS));
+ assertNull(receiver.receive(1, TimeUnit.SECONDS));
} finally {
connection.close();
}
@@ -827,12 +827,7 @@ public class ProtonTest extends ProtonTestBase {
AmqpReceiver receiver = session.createReceiver(coreAddress);
server.destroyQueue(new SimpleString(coreAddress), null, false, true);
- Wait.waitFor(new Wait.Condition() {
- @Override
- public boolean isSatisfied() throws Exception {
- return receiver.isClosed();
- }
- });
+ Wait.waitFor(receiver::isClosed);
assertTrue(receiver.isClosed());
} finally {
amqpConnection.close();
@@ -851,12 +846,7 @@ public class ProtonTest extends ProtonTestBase {
connection.disconnect(true);
}
- Wait.waitFor(new Wait.Condition() {
- @Override
- public boolean isSatisfied() throws Exception {
- return amqpConnection.isClosed();
- }
- });
+ Wait.waitFor(amqpConnection::isClosed);
assertTrue(amqpConnection.isClosed());
assertEquals(AmqpSupport.CONNECTION_FORCED, amqpConnection.getConnection().getRemoteCondition().getCondition());
@@ -937,7 +927,7 @@ public class ProtonTest extends ProtonTestBase {
request.setText("[]");
sender.send(request);
- AmqpMessage response = receiver.receive(50, TimeUnit.SECONDS);
+ AmqpMessage response = receiver.receive(5, TimeUnit.SECONDS);
Assert.assertNotNull(response);
assertNotNull(response);
Object section = response.getWrappedMessage().getBody();
@@ -1001,12 +991,7 @@ public class ProtonTest extends ProtonTestBase {
final ActiveMQServer remote = createAMQPServer(5673);
remote.start();
try {
- Wait.waitFor(new Wait.Condition() {
- @Override
- public boolean isSatisfied() throws Exception {
- return remote.isActive();
- }
- });
+ Wait.waitFor(remote::isActive);
} catch (Exception e) {
remote.stop();
throw e;
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/AckBatchSizeTest.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/AckBatchSizeTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/AckBatchSizeTest.java
index beac414..847b69e 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/AckBatchSizeTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/AckBatchSizeTest.java
@@ -63,7 +63,8 @@ public class AckBatchSizeTest extends ActiveMQTestBase {
ActiveMQServer server = createServer(false);
server.start();
int numMessages = 100;
- ServerLocator locator = createInVMNonHALocator().setAckBatchSize(numMessages * getMessageEncodeSize(addressA)).setBlockOnAcknowledge(true);
+ int originalSize = getMessageEncodeSize(addressA);
+ ServerLocator locator = createInVMNonHALocator().setAckBatchSize(numMessages * originalSize).setBlockOnAcknowledge(true);
ClientSessionFactory cf = createSessionFactory(locator);
ClientSession sendSession = cf.createSession(false, true, true);
@@ -71,20 +72,25 @@ public class AckBatchSizeTest extends ActiveMQTestBase {
session.createQueue(addressA, queueA, false);
ClientProducer cp = sendSession.createProducer(addressA);
for (int i = 0; i < numMessages; i++) {
- cp.send(sendSession.createMessage(false));
+ ClientMessage message = (ClientMessage)sendSession.createMessage(false).setAddress(addressA);
+ Assert.assertEquals(originalSize, message.getEncodeSize());
+ cp.send(message);
+ Assert.assertEquals(originalSize, message.getEncodeSize());
}
ClientConsumer consumer = session.createConsumer(queueA);
session.start();
for (int i = 0; i < numMessages - 1; i++) {
+ System.out.println("Receive ");
ClientMessage m = consumer.receive(5000);
-
+ Assert.assertEquals(0, m.getPropertyNames().size());
+ Assert.assertEquals("expected to be " + originalSize, originalSize, m.getEncodeSize());
m.acknowledge();
}
ClientMessage m = consumer.receive(5000);
Queue q = (Queue) server.getPostOffice().getBinding(queueA).getBindable();
- Assert.assertEquals(100, q.getDeliveringCount());
+ Assert.assertEquals(numMessages, q.getDeliveringCount());
m.acknowledge();
Assert.assertEquals(0, q.getDeliveringCount());
sendSession.close();
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/AcknowledgeTest.java
----------------------------------------------------------------------
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 0597dd5..042effd 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
@@ -21,10 +21,14 @@ import java.util.Set;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;
+import io.netty.buffer.ByteBuf;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
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.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;
@@ -34,6 +38,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.persistence.Persister;
import org.apache.activemq.artemis.core.protocol.core.impl.ActiveMQConsumerContext;
import org.apache.activemq.artemis.core.server.ActiveMQServer;
import org.apache.activemq.artemis.core.server.Queue;
@@ -332,10 +337,138 @@ public class AcknowledgeTest extends ActiveMQTestBase {
}
}
- class FakeMessageWithID implements Message {
+ class FakeMessageWithID extends RefCountMessage {
final long id;
+ @Override
+ public RoutingType getRouteType() {
+ return null;
+ }
+
+ @Override
+ public SimpleString getReplyTo() {
+ return null;
+ }
+
+ @Override
+ public Message setReplyTo(SimpleString address) {
+ return null;
+ }
+
+ @Override
+ public boolean containsDeliveryAnnotationProperty(SimpleString property) {
+ return false;
+ }
+
+ @Override
+ public Object removeDeliveryAnnoationProperty(SimpleString key) {
+ return null;
+ }
+
+ @Override
+ public Object getDeliveryAnnotationProperty(SimpleString key) {
+ return null;
+ }
+
+ @Override
+ public int getPersistSize() {
+ return 0;
+ }
+
+ @Override
+ public void persist(ActiveMQBuffer targetRecord) {
+ }
+
+ @Override
+ public Persister<Message> getPersister() {
+ return null;
+ }
+
+ @Override
+ public void reloadPersistence(ActiveMQBuffer record) {
+
+ }
+
+ @Override
+ public Long getScheduledDeliveryTime() {
+ return null;
+ }
+
+ @Override
+ public ICoreMessage toCore() {
+ return null;
+ }
+
+ @Override
+ public void receiveBuffer(ByteBuf buffer) {
+
+ }
+
+ @Override
+ public void sendBuffer(ByteBuf buffer, int count) {
+
+ }
+ @Override
+ public Message setUserID(Object userID) {
+ return null;
+ }
+
+ @Override
+ public void copyHeadersAndProperties(Message msg) {
+
+ }
+
+ @Override
+ public void messageChanged() {
+
+ }
+
+ @Override
+ public Message copy() {
+ return null;
+ }
+
+ @Override
+ public Message copy(long newID) {
+ return null;
+ }
+
+ @Override
+ public Message setMessageID(long id) {
+ return null;
+ }
+
+ @Override
+ public int getRefCount() {
+ return 0;
+ }
+
+ @Override
+ public int incrementRefCount() throws Exception {
+ return 0;
+ }
+
+ @Override
+ public int decrementRefCount() throws Exception {
+ return 0;
+ }
+
+ @Override
+ public int incrementDurableRefCount() {
+ return 0;
+ }
+
+ @Override
+ public int decrementDurableRefCount() {
+ return 0;
+ }
+
+ @Override
+ public int getMemoryEstimate() {
+ return 0;
+ }
+
FakeMessageWithID(final long id) {
this.id = id;
}
@@ -351,23 +484,33 @@ public class AcknowledgeTest extends ActiveMQTestBase {
}
@Override
- public FakeMessageWithID setUserID(UUID userID) {
- return this;
+ public String getAddress() {
+ return null;
}
@Override
- public SimpleString getAddress() {
+ public SimpleString getAddressSimpleString() {
return null;
}
@Override
- public Message setAddress(SimpleString address) {
+ public Message setBuffer(ByteBuf buffer) {
return null;
}
@Override
- public byte getType() {
- return 0;
+ public ByteBuf getBuffer() {
+ return null;
+ }
+
+ @Override
+ public Message setAddress(String address) {
+ return null;
+ }
+
+ @Override
+ public Message setAddress(SimpleString address) {
+ return null;
}
@Override
@@ -426,16 +569,6 @@ public class AcknowledgeTest extends ActiveMQTestBase {
}
@Override
- public ActiveMQBuffer getBodyBuffer() {
- return null;
- }
-
- @Override
- public ActiveMQBuffer getBodyBufferDuplicate() {
- return null;
- }
-
- @Override
public Message putBooleanProperty(SimpleString key, boolean value) {
return null;
}
@@ -689,15 +822,5 @@ public class AcknowledgeTest extends ActiveMQTestBase {
public Map<String, Object> toPropertyMap() {
return null;
}
-
- @Override
- public FakeMessageWithID writeBodyBufferBytes(byte[] bytes) {
- return this;
- }
-
- @Override
- public FakeMessageWithID writeBodyBufferString(String string) {
- return this;
- }
}
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/ConsumerTest.java
----------------------------------------------------------------------
diff --git a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/ConsumerTest.java b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/ConsumerTest.java
index 8f00b2a..b957291 100644
--- a/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/ConsumerTest.java
+++ b/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/ConsumerTest.java
@@ -16,6 +16,18 @@
*/
package org.apache.activemq.artemis.tests.integration.client;
+import javax.jms.BytesMessage;
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.DeliveryMode;
+import javax.jms.MapMessage;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageProducer;
+import javax.jms.ObjectMessage;
+import javax.jms.Session;
+import javax.jms.StreamMessage;
+import javax.jms.TextMessage;
+import java.io.Serializable;
import java.util.Arrays;
import java.util.Collection;
import java.util.Set;
@@ -27,6 +39,7 @@ import org.apache.activemq.artemis.api.core.ActiveMQException;
import org.apache.activemq.artemis.api.core.ActiveMQIllegalStateException;
import org.apache.activemq.artemis.api.core.Interceptor;
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;
@@ -41,10 +54,13 @@ import org.apache.activemq.artemis.core.protocol.core.Packet;
import org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl;
import org.apache.activemq.artemis.core.server.ActiveMQServer;
import org.apache.activemq.artemis.core.server.Queue;
+import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;
import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
import org.apache.activemq.artemis.tests.util.ActiveMQTestBase;
import org.apache.activemq.artemis.tests.util.Wait;
+import org.apache.activemq.artemis.utils.ByteUtil;
import org.apache.activemq.artemis.utils.ConcurrentHashSet;
+import org.apache.qpid.jms.JmsConnectionFactory;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
@@ -54,15 +70,17 @@ import org.junit.runners.Parameterized;
@RunWith(value = Parameterized.class)
public class ConsumerTest extends ActiveMQTestBase {
- @Parameterized.Parameters(name = "isNetty={0}")
+ @Parameterized.Parameters(name = "isNetty={0}, persistent={1}")
public static Collection getParameters() {
- return Arrays.asList(new Object[][]{{true}, {false}});
+ return Arrays.asList(new Object[][]{{true, true}, {false, false}, {false, true}, {true, false}});
}
- public ConsumerTest(boolean netty) {
+ public ConsumerTest(boolean netty, boolean durable) {
this.netty = netty;
+ this.durable = durable;
}
+ private final boolean durable;
private final boolean netty;
private ActiveMQServer server;
@@ -79,13 +97,31 @@ public class ConsumerTest extends ActiveMQTestBase {
public void setUp() throws Exception {
super.setUp();
- server = createServer(false, isNetty());
+ server = createServer(durable, isNetty());
server.start();
locator = createFactory(isNetty());
}
+ @Before
+ public void createQueue() throws Exception {
+
+ ServerLocator locator = createFactory(isNetty());
+
+ ClientSessionFactory sf = createSessionFactory(locator);
+
+ ClientSession session = sf.createSession(false, true, true, true);
+
+ server.createQueue(QUEUE, RoutingType.ANYCAST, QUEUE, null, true, false);
+
+ session.close();
+
+ sf.close();
+
+ locator.close();
+ }
+
@Test
public void testStressConnection() throws Exception {
@@ -113,34 +149,220 @@ public class ConsumerTest extends ActiveMQTestBase {
ClientSession session = sf.createSession(false, true, true, false);
- session.createQueue(QUEUE, QUEUE, null, false);
-
- ClientConsumer consumer = session.createConsumer(QUEUE);
-
ClientProducer producer = session.createProducer(QUEUE);
ClientMessage message = session.createMessage(Message.TEXT_TYPE, true, 0, System.currentTimeMillis(), (byte) 4);
message.getBodyBuffer().writeString("hi");
message.putStringProperty("hello", "elo");
producer.send(message);
+ session.commit();
+
+ session.close();
+ if (durable) {
+ server.stop();
+ server.start();
+ }
+ sf = createSessionFactory(locator);
+ session = sf.createSession(false, true, true, false);
+ ClientConsumer consumer = session.createConsumer(QUEUE);
+
session.start();
if (cancelOnce) {
- final ClientConsumerInternal consumerInternal = (ClientConsumerInternal)consumer;
+ final ClientConsumerInternal consumerInternal = (ClientConsumerInternal) consumer;
Wait.waitFor(() -> consumerInternal.getBufferSize() > 0);
consumer.close();
consumer = session.createConsumer(QUEUE);
}
ClientMessage message2 = consumer.receive(1000);
+ Assert.assertNotNull(message2);
+
System.out.println("Id::" + message2.getMessageID());
System.out.println("Received " + message2);
+ System.out.println("Clie:" + ByteUtil.bytesToHex(message2.getBuffer().array(), 4));
+
+ System.out.println("String::" + message2.getReadOnlyBodyBuffer().readString());
+
+ Assert.assertEquals("elo", message2.getStringProperty("hello"));
+
+ Assert.assertEquals("hi", message2.getReadOnlyBodyBuffer().readString());
+
session.close();
}
+ @Test
+ public void testSendReceiveAMQP() throws Throwable {
+
+ if (!isNetty()) {
+ // no need to run the test, there's no AMQP support
+ return;
+ }
+
+ internalSend(true, true);
+ }
+
+ @Test
+ public void testSendReceiveCore() throws Throwable {
+
+ if (!isNetty()) {
+ // no need to run the test, there's no AMQP support
+ return;
+ }
+
+ internalSend(false, false);
+ }
+
+ @Test
+ public void testSendAMQPReceiveCore() throws Throwable {
+
+ if (!isNetty()) {
+ // no need to run the test, there's no AMQP support
+ return;
+ }
+
+ internalSend(true, false);
+ }
+
+ @Test
+ public void testSendCoreReceiveAMQP() throws Throwable {
+
+ if (!isNetty()) {
+ // no need to run the test, there's no AMQP support
+ return;
+ }
+
+ internalSend(false, true);
+ }
+
+
+
+ public static class MyTest implements Serializable {
+ int i;
+
+ public int getI() {
+ return i;
+ }
+
+ public MyTest setI(int i) {
+ this.i = i;
+ return this;
+ }
+ }
+
+
+ public void internalSend(boolean amqpSender, boolean amqpConsumer) throws Throwable {
+
+ ConnectionFactory factoryAMQP = new JmsConnectionFactory("amqp://localhost:61616");
+ ConnectionFactory factoryCore = new ActiveMQConnectionFactory();
+
+
+ Connection connection = (amqpSender ? factoryAMQP : factoryCore).createConnection();
+
+ try {
+ Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ javax.jms.Queue queue = session.createQueue(QUEUE.toString());
+ MessageProducer producer = session.createProducer(queue);
+ producer.setDeliveryMode(DeliveryMode.PERSISTENT);
+
+ long time = System.currentTimeMillis();
+ int NUMBER_OF_MESSAGES = 100;
+ for (int i = 0; i < NUMBER_OF_MESSAGES; i++) {
+ TextMessage msg = session.createTextMessage("hello " + i);
+ msg.setIntProperty("mycount", i);
+ producer.send(msg);
+
+ ObjectMessage objectMessage = session.createObjectMessage(new MyTest().setI(i));
+ producer.send(objectMessage);
+
+ MapMessage mapMessage = session.createMapMessage();
+ mapMessage.setInt("intOne", i);
+ mapMessage.setString("stringOne", Integer.toString(i));
+ producer.send(mapMessage);
+
+ StreamMessage stream = session.createStreamMessage();
+ stream.writeBoolean(true);
+ stream.writeInt(i);
+ producer.send(stream);
+
+ BytesMessage bytes = session.createBytesMessage();
+ bytes.writeUTF("string " + i);
+ producer.send(bytes);
+ }
+ long end = System.currentTimeMillis();
+
+ System.out.println("Time = " + (end - time));
+
+ {
+ TextMessage dummyMessage = session.createTextMessage();
+ dummyMessage.setJMSType("car");
+ dummyMessage.setStringProperty("color", "red");
+ dummyMessage.setLongProperty("weight", 3000);
+ dummyMessage.setText("testSelectorExampleFromSpecs:1");
+ producer.send(dummyMessage);
+
+ dummyMessage = session.createTextMessage();
+ dummyMessage.setJMSType("car");
+ dummyMessage.setStringProperty("color", "blue");
+ dummyMessage.setLongProperty("weight", 3000);
+ dummyMessage.setText("testSelectorExampleFromSpecs:2");
+ producer.send(dummyMessage);
+ }
+
+
+
+
+ connection.close();
+
+ if (this.durable) {
+ server.stop();
+ server.start();
+ }
+
+ connection = (amqpConsumer ? factoryAMQP : factoryCore).createConnection();
+ session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);
+ queue = session.createQueue(QUEUE.toString());
+
+ connection.start();
+
+ MessageConsumer consumer = session.createConsumer(queue);
+
+ for (int i = 0; i < NUMBER_OF_MESSAGES; i++) {
+ TextMessage message = (TextMessage) consumer.receive(1000);
+ Assert.assertNotNull(message);
+ Assert.assertEquals(i, message.getIntProperty("mycount"));
+ Assert.assertEquals("hello " + i, message.getText());
+
+ ObjectMessage objectMessage = (ObjectMessage)consumer.receive(5000);
+ Assert.assertNotNull(objectMessage);
+ Assert.assertEquals(i, ((MyTest)objectMessage.getObject()).getI());
+
+ MapMessage mapMessage = (MapMessage) consumer.receive(1000);
+ Assert.assertNotNull(mapMessage);
+ Assert.assertEquals(i, mapMessage.getInt("intOne"));
+ Assert.assertEquals(Integer.toString(i), mapMessage.getString("stringOne"));
+
+ StreamMessage stream = (StreamMessage)consumer.receive(5000);
+ Assert.assertTrue(stream.readBoolean());
+ Assert.assertEquals(i, stream.readInt());
+
+ BytesMessage bytes = (BytesMessage) consumer.receive(5000);
+ Assert.assertEquals("string " + i, bytes.readUTF());
+ }
+
+ consumer.close();
+
+ consumer = session.createConsumer(queue, "JMSType = 'car' AND color = 'blue' AND weight > 2500");
+
+ TextMessage msg = (TextMessage) consumer.receive(1000);
+ Assert.assertEquals("testSelectorExampleFromSpecs:2", msg.getText());
+ } finally {
+ connection.close();
+ }
+ }
@Test
public void testConsumerAckImmediateAutoCommitTrue() throws Exception {
@@ -148,8 +370,6 @@ public class ConsumerTest extends ActiveMQTestBase {
ClientSession session = sf.createSession(false, true, true, true);
- session.createQueue(QUEUE, QUEUE, null, false);
-
ClientProducer producer = session.createProducer(QUEUE);
final int numMessages = 100;
@@ -180,8 +400,6 @@ public class ConsumerTest extends ActiveMQTestBase {
ClientSession session = sf.createSession(false, true, false, true);
- session.createQueue(QUEUE, QUEUE, null, false);
-
ClientProducer producer = session.createProducer(QUEUE);
final int numMessages = 100;
@@ -212,8 +430,6 @@ public class ConsumerTest extends ActiveMQTestBase {
ClientSession session = sf.createSession(false, true, true, true);
- session.createQueue(QUEUE, QUEUE, null, false);
-
ClientProducer producer = session.createProducer(QUEUE);
final int numMessages = 100;
@@ -247,8 +463,6 @@ public class ConsumerTest extends ActiveMQTestBase {
ClientSession session = sf.createSession(false, true, true, true);
- session.createQueue(QUEUE, QUEUE, null, false);
-
ClientProducer producer = session.createProducer(QUEUE);
final int numMessages = 100;
@@ -284,11 +498,9 @@ public class ConsumerTest extends ActiveMQTestBase {
ClientSession session = sf.createSession(false, true, true);
- session.createQueue(QUEUE, QUEUE, null, false);
-
ClientProducer producer = session.createProducer(QUEUE);
- final int numMessages = 10000;
+ final int numMessages = 100;
for (int i = 0; i < numMessages; i++) {
ClientMessage message = createTextMessage(session, "m" + i);
@@ -338,8 +550,6 @@ public class ConsumerTest extends ActiveMQTestBase {
ClientSession session = sf.createSession(false, true, true);
- session.createQueue(QUEUE, QUEUE, null, false);
-
session.start();
ClientProducer producer = session.createProducer(QUEUE);
@@ -372,8 +582,6 @@ public class ConsumerTest extends ActiveMQTestBase {
ClientSession session = sf.createSession(false, true, true);
session.start();
- session.createQueue(QUEUE, QUEUE, null, false);
-
ClientConsumer consumer = session.createConsumer(QUEUE);
consumer.setMessageHandler(new MessageHandler() {
@@ -394,8 +602,6 @@ public class ConsumerTest extends ActiveMQTestBase {
ClientSession session = sf.createSession(false, true, true);
- session.createQueue(QUEUE, QUEUE, null, false);
-
ClientConsumer consumer = session.createConsumer(QUEUE);
consumer.setMessageHandler(new MessageHandler() {
@@ -436,7 +642,7 @@ public class ConsumerTest extends ActiveMQTestBase {
sessions.add(session);
- session.createQueue(QUEUE, QUEUE.concat("" + i), null, false);
+ session.createQueue(QUEUE, QUEUE.concat("" + i), null, true);
if (i == 0) {
session.createQueue(QUEUE_RESPONSE, QUEUE_RESPONSE);
@@ -550,8 +756,6 @@ public class ConsumerTest extends ActiveMQTestBase {
ClientSession session = sf.createTransactedSession();
- session.createQueue(QUEUE, QUEUE, null, false);
-
ClientProducer producer = session.createProducer(QUEUE);
final int numMessages = 100;
@@ -598,7 +802,6 @@ public class ConsumerTest extends ActiveMQTestBase {
ServerLocator locator = addServerLocator(ServerLocatorImpl.newLocator("vm:/1"));
ClientSessionFactory factory = locator.createSessionFactory();
ClientSession session = factory.createSession();
- session.createQueue(QUEUE, QUEUE);
ClientProducer producer = session.createProducer(QUEUE);
producer.send(session.createMessage(true));
@@ -620,8 +823,6 @@ public class ConsumerTest extends ActiveMQTestBase {
ClientSession session = sf.createTransactedSession();
- session.createQueue(QUEUE, QUEUE, null, false);
-
ClientProducer producer = session.createProducer(QUEUE);
final int numMessages = 100;
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/tests/integration-tests/src/test/java/org/apache/activemq/artemis/tests/integration/client/HangConsumerTest.java
----------------------------------------------------------------------
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 81e0ca4..201a96b 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
@@ -28,6 +28,8 @@ import java.util.concurrent.TimeUnit;
import org.apache.activemq.artemis.api.core.ActiveMQException;
import org.apache.activemq.artemis.api.core.Interceptor;
+
+import org.apache.activemq.artemis.api.core.Message;
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;
@@ -56,7 +58,6 @@ import org.apache.activemq.artemis.core.server.MessageReference;
import org.apache.activemq.artemis.core.server.Queue;
import org.apache.activemq.artemis.core.server.QueueConfig;
import org.apache.activemq.artemis.core.server.ServerConsumer;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.impl.ActiveMQServerImpl;
import org.apache.activemq.artemis.core.server.impl.QueueFactoryImpl;
import org.apache.activemq.artemis.core.server.impl.QueueImpl;
@@ -519,7 +520,7 @@ public class HangConsumerTest extends ActiveMQTestBase {
* @see SessionCallback#sendJmsMessage(org.apache.activemq.artemis.core.server.ServerMessage, long, int)
*/
@Override
- public int sendMessage(MessageReference ref, ServerMessage message, ServerConsumer consumer, int deliveryCount) {
+ public int sendMessage(MessageReference ref, Message message, ServerConsumer consumer, int deliveryCount) {
inCall.countDown();
try {
callbackSemaphore.acquire();
@@ -541,7 +542,7 @@ public class HangConsumerTest extends ActiveMQTestBase {
*/
@Override
public int sendLargeMessage(MessageReference reference,
- ServerMessage message,
+ Message message,
ServerConsumer consumer,
long bodySize,
int deliveryCount) {
[09/17] activemq-artemis git commit: ARTEMIS-1009 Pure Message
Encoding.
Posted by cl...@apache.org.
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/ProtonServerSenderContext.java
----------------------------------------------------------------------
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 2e19f07..4e33c9b 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
@@ -21,15 +21,19 @@ import java.util.Map;
import java.util.Objects;
import java.util.Set;
-import org.apache.activemq.artemis.api.core.ActiveMQQueueExistsException;
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.PooledByteBufAllocator;
import org.apache.activemq.artemis.api.core.ActiveMQExceptionType;
+import org.apache.activemq.artemis.api.core.ActiveMQQueueExistsException;
+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.postoffice.impl.CompositeAddress;
import org.apache.activemq.artemis.core.server.AddressQueryResult;
import org.apache.activemq.artemis.core.server.QueueQueryResult;
-import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.core.transaction.Transaction;
import org.apache.activemq.artemis.jms.client.ActiveMQConnection;
+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.exceptions.ActiveMQAMQPException;
import org.apache.activemq.artemis.protocol.amqp.exceptions.ActiveMQAMQPIllegalStateException;
@@ -38,7 +42,6 @@ import org.apache.activemq.artemis.protocol.amqp.exceptions.ActiveMQAMQPNotFound
import org.apache.activemq.artemis.protocol.amqp.exceptions.ActiveMQAMQPResourceLimitExceededException;
import org.apache.activemq.artemis.protocol.amqp.logger.ActiveMQAMQPProtocolMessageBundle;
import org.apache.activemq.artemis.protocol.amqp.util.CreditsSemaphore;
-import org.apache.activemq.artemis.protocol.amqp.util.NettyWritable;
import org.apache.activemq.artemis.selector.filter.FilterException;
import org.apache.activemq.artemis.selector.impl.SelectorParser;
import org.apache.qpid.proton.amqp.DescribedType;
@@ -61,9 +64,6 @@ import org.apache.qpid.proton.engine.EndpointState;
import org.apache.qpid.proton.engine.Sender;
import org.jboss.logging.Logger;
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.PooledByteBufAllocator;
-
/**
* TODO: Merge {@link ProtonServerSenderContext} and {@link org.apache.activemq.artemis.protocol.amqp.client.ProtonClientSenderContext} once we support 'global' link names. The split is a workaround for outgoing links
*/
@@ -474,7 +474,7 @@ public class ProtonServerSenderContext extends ProtonInitializable implements Pr
if (closed) {
return;
}
- Object message = delivery.getContext();
+ Message message = (Message)delivery.getContext();
boolean preSettle = sender.getRemoteSenderSettleMode() == SenderSettleMode.SETTLED;
@@ -518,6 +518,7 @@ public class ProtonServerSenderContext extends ProtonInitializable implements Pr
try {
sessionSPI.ack(null, brokerConsumer, message);
} catch (Exception e) {
+ e.printStackTrace();
throw ActiveMQAMQPProtocolMessageBundle.BUNDLE.errorAcknowledgingMessage(message.toString(), e.getMessage());
}
} else if (remoteState instanceof Released) {
@@ -566,7 +567,7 @@ public class ProtonServerSenderContext extends ProtonInitializable implements Pr
/**
* handle an out going message from ActiveMQ Artemis, send via the Proton Sender
*/
- public int deliverMessage(Object message, int deliveryCount) throws Exception {
+ public int deliverMessage(AMQPMessage message, int deliveryCount) throws Exception {
if (closed) {
return 0;
}
@@ -590,16 +591,7 @@ public class ProtonServerSenderContext extends ProtonInitializable implements Pr
ByteBuf nettyBuffer = PooledByteBufAllocator.DEFAULT.heapBuffer(1024);
try {
- long messageFormat = 0;
-
- // Encode the Server Message into the given Netty Buffer as an AMQP
- // Message transformed from the internal message model.
- try {
- messageFormat = sessionSPI.encodeMessage(message, deliveryCount, new NettyWritable(nettyBuffer));
- } catch (Throwable e) {
- log.warn(e.getMessage(), e);
- throw new ActiveMQAMQPInternalErrorException(e.getMessage(), e);
- }
+ message.sendBuffer(nettyBuffer, deliveryCount);
int size = nettyBuffer.writerIndex();
@@ -609,7 +601,7 @@ public class ProtonServerSenderContext extends ProtonInitializable implements Pr
}
final Delivery delivery;
delivery = sender.delivery(tag, 0, tag.length);
- delivery.setMessageFormat((int) messageFormat);
+ delivery.setMessageFormat((int) message.getMessageFormat());
delivery.setContext(message);
// this will avoid a copy.. patch provided by Norman using buffer.array()
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/ProtonTransactionHandler.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/ProtonTransactionHandler.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/ProtonTransactionHandler.java
index 51f42a3..1afeba8 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/ProtonTransactionHandler.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/ProtonTransactionHandler.java
@@ -22,6 +22,7 @@ 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.logger.ActiveMQAMQPProtocolMessageBundle;
import org.apache.activemq.artemis.protocol.amqp.util.DeliveryUtil;
+import org.apache.activemq.artemis.protocol.amqp.util.NettyWritable;
import org.apache.qpid.proton.amqp.Binary;
import org.apache.qpid.proton.amqp.Symbol;
import org.apache.qpid.proton.amqp.messaging.Accepted;
@@ -61,7 +62,7 @@ public class ProtonTransactionHandler implements ProtonDeliveryHandler {
return;
}
- DeliveryUtil.readDelivery(receiver, buffer);
+ receiver.recv(new NettyWritable(buffer));
receiver.advance();
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/handler/ProtonHandler.java
----------------------------------------------------------------------
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 25ef51e..673a688 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
@@ -254,7 +254,7 @@ public class ProtonHandler extends ProtonInitializable {
flush(false);
}
- private void flush(boolean wait) {
+ public void flush(boolean wait) {
synchronized (lock) {
transport.process();
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/util/NettyReadable.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/util/NettyReadable.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/util/NettyReadable.java
new file mode 100644
index 0000000..e0705b4
--- /dev/null
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/util/NettyReadable.java
@@ -0,0 +1,139 @@
+/**
+ * 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.util;
+
+import java.nio.ByteBuffer;
+import java.nio.charset.Charset;
+
+import io.netty.buffer.ByteBuf;
+import org.apache.qpid.proton.codec.ReadableBuffer;
+
+public class NettyReadable implements ReadableBuffer {
+
+ private static final Charset Charset_UTF8 = Charset.forName("UTF-8");
+
+ private final ByteBuf buffer;
+
+ public NettyReadable(ByteBuf buffer) {
+ this.buffer = buffer;
+ }
+
+ @Override
+ public void put(ReadableBuffer other) {
+ buffer.writeBytes(other.byteBuffer());
+ }
+
+ @Override
+ public byte get() {
+ return buffer.readByte();
+ }
+
+ @Override
+ public int getInt() {
+ return buffer.readInt();
+ }
+
+ @Override
+ public long getLong() {
+ return buffer.readLong();
+ }
+
+ @Override
+ public short getShort() {
+ return buffer.readShort();
+ }
+
+ @Override
+ public float getFloat() {
+ return buffer.readFloat();
+ }
+
+ @Override
+ public double getDouble() {
+ return buffer.readDouble();
+ }
+
+ @Override
+ public ReadableBuffer get(byte[] data, int offset, int length) {
+ buffer.readBytes(data, offset, length);
+ return this;
+ }
+
+ @Override
+ public ReadableBuffer get(byte[] data) {
+ buffer.readBytes(data);
+ return this;
+ }
+
+ @Override
+ public ReadableBuffer position(int position) {
+ buffer.readerIndex(position);
+ return this;
+ }
+
+ @Override
+ public ReadableBuffer slice() {
+ return new NettyReadable(buffer.slice());
+ }
+
+ @Override
+ public ReadableBuffer flip() {
+ return new NettyReadable(buffer.duplicate().setIndex(0, buffer.readerIndex()));
+ }
+
+ @Override
+ public ReadableBuffer limit(int limit) {
+ buffer.writerIndex(limit);
+ return this;
+ }
+
+ @Override
+ public int limit() {
+ return buffer.writerIndex();
+ }
+
+ @Override
+ public int remaining() {
+ return buffer.readableBytes();
+ }
+
+ @Override
+ public int position() {
+ return buffer.readerIndex();
+ }
+
+ @Override
+ public boolean hasRemaining() {
+ return buffer.readableBytes() > 0;
+ }
+
+ @Override
+ public ReadableBuffer duplicate() {
+ return new NettyReadable(buffer.duplicate());
+ }
+
+ @Override
+ public ByteBuffer byteBuffer() {
+ return buffer.nioBuffer(0, buffer.writerIndex());
+ }
+
+ @Override
+ public String readUTF8() {
+ return buffer.toString(Charset_UTF8);
+ }
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/util/TLSEncode.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/util/TLSEncode.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/util/TLSEncode.java
new file mode 100644
index 0000000..b2f0fdc
--- /dev/null
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/util/TLSEncode.java
@@ -0,0 +1,52 @@
+/**
+ * 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.util;
+
+import org.apache.qpid.proton.codec.AMQPDefinedTypes;
+import org.apache.qpid.proton.codec.DecoderImpl;
+import org.apache.qpid.proton.codec.EncoderImpl;
+
+/** This can go away if Proton provides this feature. */
+public class TLSEncode {
+
+ // For now Proton requires that we create a decoder to create an encoder
+ private static class EncoderDecoderPair {
+ DecoderImpl decoder = new DecoderImpl();
+ EncoderImpl encoder = new EncoderImpl(decoder);
+ {
+ AMQPDefinedTypes.registerAllTypes(decoder, encoder);
+ }
+ }
+
+ private static final ThreadLocal<EncoderDecoderPair> tlsCodec = new ThreadLocal<EncoderDecoderPair>() {
+ @Override
+ protected EncoderDecoderPair initialValue() {
+ return new EncoderDecoderPair();
+ }
+ };
+
+ public static EncoderImpl getEncoder() {
+ return tlsCodec.get().encoder;
+ }
+
+ public static DecoderImpl getDecoder() {
+ return tlsCodec.get().decoder;
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/TestConversions.java
----------------------------------------------------------------------
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 08c46be..8ced348 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
@@ -16,44 +16,28 @@
*/
package org.apache.activemq.artemis.protocol.amqp.converter;
-import static org.apache.activemq.artemis.api.core.Message.BYTES_TYPE;
-import static org.apache.activemq.artemis.api.core.Message.MAP_TYPE;
-import static org.apache.activemq.artemis.api.core.Message.STREAM_TYPE;
-import static org.apache.activemq.artemis.api.core.Message.TEXT_TYPE;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.wrapMessage;
-
-import java.io.IOException;
-import java.nio.ByteBuffer;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
-import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
-import org.apache.activemq.artemis.api.core.SimpleString;
-import org.apache.activemq.artemis.core.journal.EncodingSupport;
-import org.apache.activemq.artemis.core.server.ServerMessage;
+import org.apache.activemq.artemis.api.core.ICoreMessage;
+import org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessage;
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;
import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSStreamMessage;
import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSTextMessage;
-import org.apache.activemq.artemis.protocol.amqp.converter.message.EncodedMessage;
-import org.apache.activemq.artemis.protocol.amqp.util.NettyWritable;
-import org.apache.activemq.artemis.utils.SimpleIDGenerator;
import org.apache.qpid.proton.amqp.Binary;
import org.apache.qpid.proton.amqp.messaging.AmqpSequence;
import org.apache.qpid.proton.amqp.messaging.AmqpValue;
import org.apache.qpid.proton.amqp.messaging.ApplicationProperties;
import org.apache.qpid.proton.amqp.messaging.Data;
import org.apache.qpid.proton.message.Message;
-import org.apache.qpid.proton.message.ProtonJMessage;
import org.apache.qpid.proton.message.impl.MessageImpl;
import org.junit.Assert;
import org.junit.Test;
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.PooledByteBufAllocator;
public class TestConversions extends Assert {
@@ -72,18 +56,12 @@ public class TestConversions extends Assert {
message.setBody(new AmqpValue(new Boolean(true)));
- EncodedMessage encodedMessage = encodeMessage(message);
+ AMQPMessage encodedMessage = new AMQPMessage(message);
- ProtonMessageConverter converter = new ProtonMessageConverter(new SimpleIDGenerator(0));
- ServerMessage serverMessage = converter.inbound(encodedMessage);
+ ICoreMessage serverMessage = encodedMessage.toCore();
- verifyProperties(new ServerJMSMessage(serverMessage, 0));
+ verifyProperties(ServerJMSMessage.wrapCoreMessage(serverMessage));
- EncodedMessage encoded = (EncodedMessage) converter.outbound(serverMessage, 0);
- Message amqpMessage = encoded.decode();
-
- AmqpValue value = (AmqpValue) amqpMessage.getBody();
- assertEquals(value.getValue(), true);
}
@Test
@@ -101,12 +79,11 @@ public class TestConversions extends Assert {
message.setBody(new Data(new Binary(bodyBytes)));
- EncodedMessage encodedMessage = encodeMessage(message);
+ AMQPMessage encodedMessage = new AMQPMessage(message);
- ProtonMessageConverter converter = new ProtonMessageConverter(new SimpleIDGenerator(0));
- ServerMessage serverMessage = converter.inbound(encodedMessage);
+ ICoreMessage serverMessage = encodedMessage.toCore();
- ServerJMSBytesMessage bytesMessage = (ServerJMSBytesMessage) wrapMessage(BYTES_TYPE, serverMessage, 0);
+ ServerJMSBytesMessage bytesMessage = (ServerJMSBytesMessage) ServerJMSMessage.wrapCoreMessage(serverMessage);
verifyProperties(bytesMessage);
@@ -118,9 +95,6 @@ public class TestConversions extends Assert {
Assert.assertArrayEquals(bodyBytes, newBodyBytes);
- Object obj = converter.outbound(serverMessage, 0);
-
- System.out.println("output = " + obj);
}
private void verifyProperties(javax.jms.Message message) throws Exception {
@@ -151,12 +125,12 @@ public class TestConversions extends Assert {
message.setBody(new AmqpValue(mapValues));
- EncodedMessage encodedMessage = encodeMessage(message);
+ AMQPMessage encodedMessage = new AMQPMessage(message);
- ProtonMessageConverter converter = new ProtonMessageConverter(new SimpleIDGenerator(0));
- ServerMessage serverMessage = converter.inbound(encodedMessage);
+ ICoreMessage serverMessage = encodedMessage.toCore();
+ serverMessage.getReadOnlyBodyBuffer();
- ServerJMSMapMessage mapMessage = (ServerJMSMapMessage) wrapMessage(MAP_TYPE, serverMessage, 0);
+ ServerJMSMapMessage mapMessage = (ServerJMSMapMessage) ServerJMSMessage.wrapCoreMessage(serverMessage);
mapMessage.decode();
verifyProperties(mapMessage);
@@ -164,15 +138,8 @@ public class TestConversions extends Assert {
Assert.assertEquals(1, mapMessage.getInt("someint"));
Assert.assertEquals("value", mapMessage.getString("somestr"));
- EncodedMessage encoded = (EncodedMessage) converter.outbound(serverMessage, 0);
- Message amqpMessage = encoded.decode();
-
- AmqpValue value = (AmqpValue) amqpMessage.getBody();
- Map<?, ?> mapoutput = (Map<?, ?>) value.getValue();
-
- assertEquals(Integer.valueOf(1), mapoutput.get("someint"));
-
- System.out.println("output = " + amqpMessage);
+ AMQPMessage newAMQP = CoreAmqpConverter.fromCore(mapMessage.getInnerMessage());
+ System.out.println(newAMQP.getProtonMessage().getBody());
}
@Test
@@ -188,14 +155,11 @@ public class TestConversions extends Assert {
message.setBody(new AmqpSequence(objects));
- EncodedMessage encodedMessage = encodeMessage(message);
+ AMQPMessage encodedMessage = new AMQPMessage(message);
- ProtonMessageConverter converter = new ProtonMessageConverter(new SimpleIDGenerator(0));
- ServerMessage serverMessage = converter.inbound(encodedMessage);
+ ICoreMessage serverMessage = encodedMessage.toCore();
- simulatePersistence(serverMessage);
-
- ServerJMSStreamMessage streamMessage = (ServerJMSStreamMessage) wrapMessage(STREAM_TYPE, serverMessage, 0);
+ ServerJMSStreamMessage streamMessage = (ServerJMSStreamMessage) ServerJMSMessage.wrapCoreMessage(serverMessage);
verifyProperties(streamMessage);
@@ -203,13 +167,6 @@ public class TestConversions extends Assert {
assertEquals(10, streamMessage.readInt());
assertEquals("10", streamMessage.readString());
-
- EncodedMessage encoded = (EncodedMessage) converter.outbound(serverMessage, 0);
- Message amqpMessage = encoded.decode();
-
- List<?> list = ((AmqpSequence) amqpMessage.getBody()).getValue();
- Assert.assertEquals(Integer.valueOf(10), list.get(0));
- Assert.assertEquals("10", list.get(1));
}
@Test
@@ -222,553 +179,17 @@ public class TestConversions extends Assert {
String text = "someText";
message.setBody(new AmqpValue(text));
- EncodedMessage encodedMessage = encodeMessage(message);
-
- ProtonMessageConverter converter = new ProtonMessageConverter(new SimpleIDGenerator(0));
- ServerMessage serverMessage = converter.inbound(encodedMessage);
+ AMQPMessage encodedMessage = new AMQPMessage(message);
- simulatePersistence(serverMessage);
+ ICoreMessage serverMessage = encodedMessage.toCore();
- ServerJMSTextMessage textMessage = (ServerJMSTextMessage) wrapMessage(TEXT_TYPE, serverMessage, 0);
+ ServerJMSTextMessage textMessage = (ServerJMSTextMessage) ServerJMSMessage.wrapCoreMessage(serverMessage);
textMessage.decode();
verifyProperties(textMessage);
Assert.assertEquals(text, textMessage.getText());
- EncodedMessage encoded = (EncodedMessage) converter.outbound(serverMessage, 0);
- Message amqpMessage = encoded.decode();
-
- AmqpValue value = (AmqpValue) amqpMessage.getBody();
- String textValue = (String) value.getValue();
-
- Assert.assertEquals(text, textValue);
-
- System.out.println("output = " + amqpMessage);
- }
-
- private void simulatePersistence(ServerMessage serverMessage) {
- serverMessage.setAddress(new SimpleString("SomeAddress"));
- // This is just to simulate what would happen during the persistence of the message
- // We need to still be able to recover the message when we read it back
- ((EncodingSupport) serverMessage).encode(new EmptyBuffer());
- }
-
- private ProtonJMessage reEncodeMsg(Object obj) {
- ProtonJMessage objOut = (ProtonJMessage) obj;
-
- ByteBuf nettyBuffer = PooledByteBufAllocator.DEFAULT.heapBuffer(1024);
-
- objOut.encode(new NettyWritable(nettyBuffer));
- return objOut;
}
- private EncodedMessage encodeMessage(MessageImpl message) {
- ByteBuf buf = PooledByteBufAllocator.DEFAULT.heapBuffer(1024 * 1024);
- message.encode(new NettyWritable(buf));
- byte[] bytesConvert = new byte[buf.writerIndex()];
- buf.readBytes(bytesConvert);
- return new EncodedMessage(0, bytesConvert, 0, bytesConvert.length);
- }
-
- class EmptyBuffer implements ActiveMQBuffer {
-
- @Override
- public ByteBuf byteBuf() {
- return null;
- }
-
- @Override
- public int capacity() {
- return 0;
- }
-
- @Override
- public int readerIndex() {
- return 0;
- }
-
- @Override
- public void readerIndex(int readerIndex) {
-
- }
-
- @Override
- public int writerIndex() {
- return 0;
- }
-
- @Override
- public void writerIndex(int writerIndex) {
-
- }
-
- @Override
- public void setIndex(int readerIndex, int writerIndex) {
-
- }
-
- @Override
- public int readableBytes() {
- return 0;
- }
-
- @Override
- public int writableBytes() {
- return 0;
- }
-
- @Override
- public boolean readable() {
- return false;
- }
-
- @Override
- public boolean writable() {
- return false;
- }
-
- @Override
- public void clear() {
-
- }
-
- @Override
- public void markReaderIndex() {
-
- }
-
- @Override
- public void resetReaderIndex() {
-
- }
-
- @Override
- public void markWriterIndex() {
-
- }
-
- @Override
- public void resetWriterIndex() {
-
- }
-
- @Override
- public void discardReadBytes() {
-
- }
-
- @Override
- public byte getByte(int index) {
- return 0;
- }
-
- @Override
- public short getUnsignedByte(int index) {
- return 0;
- }
-
- @Override
- public short getShort(int index) {
- return 0;
- }
-
- @Override
- public int getUnsignedShort(int index) {
- return 0;
- }
-
- @Override
- public int getInt(int index) {
- return 0;
- }
-
- @Override
- public long getUnsignedInt(int index) {
- return 0;
- }
-
- @Override
- public long getLong(int index) {
- return 0;
- }
-
- @Override
- public void getBytes(int index, ActiveMQBuffer dst) {
-
- }
-
- @Override
- public void getBytes(int index, ActiveMQBuffer dst, int length) {
-
- }
-
- @Override
- public void getBytes(int index, ActiveMQBuffer dst, int dstIndex, int length) {
-
- }
-
- @Override
- public void getBytes(int index, byte[] dst) {
-
- }
-
- @Override
- public void getBytes(int index, byte[] dst, int dstIndex, int length) {
-
- }
-
- @Override
- public void getBytes(int index, ByteBuffer dst) {
-
- }
-
- @Override
- public char getChar(int index) {
- return 0;
- }
-
- @Override
- public float getFloat(int index) {
- return 0;
- }
-
- @Override
- public double getDouble(int index) {
- return 0;
- }
-
- @Override
- public void setByte(int index, byte value) {
-
- }
-
- @Override
- public void setShort(int index, short value) {
-
- }
-
- @Override
- public void setInt(int index, int value) {
-
- }
-
- @Override
- public void setLong(int index, long value) {
-
- }
-
- @Override
- public void setBytes(int index, ActiveMQBuffer src) {
-
- }
-
- @Override
- public void setBytes(int index, ActiveMQBuffer src, int length) {
-
- }
-
- @Override
- public void setBytes(int index, ActiveMQBuffer src, int srcIndex, int length) {
-
- }
-
- @Override
- public void setBytes(int index, byte[] src) {
-
- }
-
- @Override
- public void setBytes(int index, byte[] src, int srcIndex, int length) {
-
- }
-
- @Override
- public void setBytes(int index, ByteBuffer src) {
-
- }
-
- @Override
- public void setChar(int index, char value) {
-
- }
-
- @Override
- public void setFloat(int index, float value) {
-
- }
-
- @Override
- public void setDouble(int index, double value) {
-
- }
-
- @Override
- public byte readByte() {
- return 0;
- }
-
- @Override
- public int readUnsignedByte() {
- return 0;
- }
-
- @Override
- public short readShort() {
- return 0;
- }
-
- @Override
- public int readUnsignedShort() {
- return 0;
- }
-
- @Override
- public int readInt() {
- return 0;
- }
-
- @Override
- public long readUnsignedInt() {
- return 0;
- }
-
- @Override
- public long readLong() {
- return 0;
- }
-
- @Override
- public char readChar() {
- return 0;
- }
-
- @Override
- public float readFloat() {
- return 0;
- }
-
- @Override
- public double readDouble() {
- return 0;
- }
-
- @Override
- public boolean readBoolean() {
- return false;
- }
-
- @Override
- public SimpleString readNullableSimpleString() {
- return null;
- }
-
- @Override
- public String readNullableString() {
- return null;
- }
-
- @Override
- public SimpleString readSimpleString() {
- return null;
- }
-
- @Override
- public String readString() {
- return null;
- }
-
- @Override
- public String readUTF() {
- return null;
- }
-
- @Override
- public ActiveMQBuffer readBytes(int length) {
- return null;
- }
-
- @Override
- public ActiveMQBuffer readSlice(int length) {
- return null;
- }
-
- @Override
- public void readBytes(ActiveMQBuffer dst) {
-
- }
-
- @Override
- public void readBytes(ActiveMQBuffer dst, int length) {
-
- }
-
- @Override
- public void readBytes(ActiveMQBuffer dst, int dstIndex, int length) {
-
- }
-
- @Override
- public void readBytes(byte[] dst) {
-
- }
-
- @Override
- public void readBytes(byte[] dst, int dstIndex, int length) {
-
- }
-
- @Override
- public void readBytes(ByteBuffer dst) {
-
- }
-
- @Override
- public int skipBytes(int length) {
- return length;
- }
-
- @Override
- public void writeByte(byte value) {
-
- }
-
- @Override
- public void writeShort(short value) {
-
- }
-
- @Override
- public void writeInt(int value) {
-
- }
-
- @Override
- public void writeLong(long value) {
-
- }
-
- @Override
- public void writeChar(char chr) {
-
- }
-
- @Override
- public void writeFloat(float value) {
-
- }
-
- @Override
- public void writeDouble(double value) {
-
- }
-
- @Override
- public void writeBoolean(boolean val) {
-
- }
-
- @Override
- public void writeNullableSimpleString(SimpleString val) {
-
- }
-
- @Override
- public void writeNullableString(String val) {
-
- }
-
- @Override
- public void writeSimpleString(SimpleString val) {
-
- }
-
- @Override
- public void writeString(String val) {
-
- }
-
- @Override
- public void writeUTF(String utf) {
-
- }
-
- @Override
- public void writeBytes(ActiveMQBuffer src, int length) {
-
- }
-
- @Override
- public void writeBytes(ActiveMQBuffer src, int srcIndex, int length) {
-
- }
-
- @Override
- public void writeBytes(byte[] src) {
-
- }
-
- @Override
- public void writeBytes(byte[] src, int srcIndex, int length) {
-
- }
-
- @Override
- public void writeBytes(ByteBuffer src) {
-
- }
-
- @Override
- public void readFully(byte[] b) throws IOException {
- }
-
- @Override
- public void readFully(byte[] b, int off, int len) throws IOException {
- }
-
- @Override
- public String readLine() throws IOException {
- return null;
- }
-
- @Override
- public ActiveMQBuffer copy() {
- return null;
- }
-
- @Override
- public ActiveMQBuffer copy(int index, int length) {
- return null;
- }
-
- @Override
- public ActiveMQBuffer slice() {
- return null;
- }
-
- @Override
- public ActiveMQBuffer slice(int index, int length) {
- return null;
- }
-
- @Override
- public ActiveMQBuffer duplicate() {
- return null;
- }
-
- @Override
- public ByteBuffer toByteBuffer() {
- return null;
- }
-
- @Override
- public ByteBuffer toByteBuffer(int index, int length) {
- return null;
- }
-
- @Override
- public void release() {
- //no-op
- }
- }
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPContentTypeSupportTest.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPContentTypeSupportTest.java b/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPContentTypeSupportTest.java
index 4caead7..54a98e6 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPContentTypeSupportTest.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPContentTypeSupportTest.java
@@ -16,15 +16,17 @@
*/
package org.apache.activemq.artemis.protocol.amqp.converter.message;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
+import org.apache.activemq.artemis.protocol.amqp.converter.AMQPContentTypeSupport;
+import org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport;
import org.apache.activemq.artemis.protocol.amqp.exceptions.ActiveMQAMQPInvalidContentTypeException;
import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
public class AMQPContentTypeSupportTest {
@Test(expected = ActiveMQAMQPInvalidContentTypeException.class)
@@ -216,7 +218,7 @@ public class AMQPContentTypeSupportTest {
@Test
public void testParseContentTypeWithApplicationJavaSerialized() throws Exception {
// Expect null as this is not a textual type
- doParseContentTypeTestImpl(AMQPMessageSupport.SERIALIZED_JAVA_OBJECT_CONTENT_TYPE, null);
+ doParseContentTypeTestImpl(AMQPMessageSupport.SERIALIZED_JAVA_OBJECT_CONTENT_TYPE.toString(), null);
}
private void doParseContentTypeTestImpl(String contentType, Charset expected) throws ActiveMQAMQPInvalidContentTypeException {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPMessageIdHelperTest.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPMessageIdHelperTest.java b/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPMessageIdHelperTest.java
index c53cda5..60c1989 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPMessageIdHelperTest.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPMessageIdHelperTest.java
@@ -20,19 +20,20 @@
*/
package org.apache.activemq.artemis.protocol.amqp.converter.message;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.fail;
-
import java.util.UUID;
+import org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageIdHelper;
import org.apache.activemq.artemis.protocol.amqp.exceptions.ActiveMQAMQPException;
import org.apache.qpid.proton.amqp.Binary;
import org.apache.qpid.proton.amqp.UnsignedLong;
import org.junit.Before;
import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
+
public class AMQPMessageIdHelperTest {
private AMQPMessageIdHelper messageIdHelper;
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPMessageSupportTest.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPMessageSupportTest.java b/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPMessageSupportTest.java
index d4e078f..6aeb4dc 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPMessageSupportTest.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPMessageSupportTest.java
@@ -16,20 +16,21 @@
*/
package org.apache.activemq.artemis.protocol.amqp.converter.message;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
import java.util.HashMap;
import java.util.Map;
+import org.apache.activemq.artemis.protocol.amqp.converter.AMQPMessageSupport;
import org.apache.qpid.proton.Proton;
import org.apache.qpid.proton.amqp.Symbol;
import org.apache.qpid.proton.amqp.messaging.MessageAnnotations;
import org.apache.qpid.proton.message.Message;
import org.junit.Test;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+
public class AMQPMessageSupportTest {
// ---------- getSymbol ---------------------------------------------------//
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/test/java/org/apache/activemq/artemis/protocol/amqp/converter/message/JMSMappingInboundTransformerTest.java
----------------------------------------------------------------------
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 d7a948a..b7092c3 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
@@ -16,36 +16,29 @@
*/
package org.apache.activemq.artemis.protocol.amqp.converter.message;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.assertTrue;
-
+import javax.jms.Destination;
+import javax.jms.Queue;
+import javax.jms.TemporaryQueue;
+import javax.jms.TemporaryTopic;
+import javax.jms.TextMessage;
+import javax.jms.Topic;
import java.nio.charset.Charset;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
-import javax.jms.Destination;
-import javax.jms.MapMessage;
-import javax.jms.Queue;
-import javax.jms.TemporaryQueue;
-import javax.jms.TemporaryTopic;
-import javax.jms.TextMessage;
-import javax.jms.Topic;
-
-import org.apache.activemq.artemis.jms.client.ActiveMQMessage;
+import org.apache.activemq.artemis.api.core.ICoreMessage;
+import org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessage;
+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;
+import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSMessage;
import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSObjectMessage;
import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSStreamMessage;
import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSTextMessage;
-import org.apache.activemq.artemis.utils.IDGenerator;
-import org.apache.activemq.artemis.utils.SimpleIDGenerator;
import org.apache.qpid.proton.Proton;
import org.apache.qpid.proton.amqp.Binary;
import org.apache.qpid.proton.amqp.Symbol;
@@ -57,13 +50,15 @@ import org.apache.qpid.proton.message.Message;
import org.junit.Before;
import org.junit.Test;
-public class JMSMappingInboundTransformerTest {
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
- private IDGenerator idGenerator;
+public class JMSMappingInboundTransformerTest {
@Before
public void setUp() {
- this.idGenerator = new SimpleIDGenerator(0);
}
// ----- Null Body Section ------------------------------------------------//
@@ -77,13 +72,14 @@ public class JMSMappingInboundTransformerTest {
*/
@Test
public void testCreateBytesMessageFromNoBodySectionAndContentType() throws Exception {
- JMSMappingInboundTransformer transformer = new JMSMappingInboundTransformer(idGenerator);
-
Message message = Message.Factory.create();
message.setContentType(AMQPMessageSupport.OCTET_STREAM_CONTENT_TYPE);
- EncodedMessage em = encodeMessage(message);
- javax.jms.Message jmsMessage = transformer.transform(em);
+ AMQPMessage messageEncode = new AMQPMessage(message);
+
+ ICoreMessage coreMessage = messageEncode.toCore();
+
+ javax.jms.Message jmsMessage = ServerJMSMessage.wrapCoreMessage(coreMessage);
assertNotNull("Message should not be null", jmsMessage);
assertEquals("Unexpected message class type", ServerJMSBytesMessage.class, jmsMessage.getClass());
@@ -98,74 +94,25 @@ public class JMSMappingInboundTransformerTest {
*/
@Test
public void testCreateBytesMessageFromNoBodySectionAndNoContentType() throws Exception {
- JMSMappingInboundTransformer transformer = new JMSMappingInboundTransformer(idGenerator);
-
Message message = Message.Factory.create();
- EncodedMessage em = encodeMessage(message);
- javax.jms.Message jmsMessage = transformer.transform(em);
+ javax.jms.Message jmsMessage = ServerJMSMessage.wrapCoreMessage(new AMQPMessage(message).toCore());
assertNotNull("Message should not be null", jmsMessage);
assertEquals("Unexpected message class type", ServerJMSBytesMessage.class, jmsMessage.getClass());
}
- /**
- * Test that a message with no body section, but with the content type set to
- * {@value AMQPMessageSupport#SERIALIZED_JAVA_OBJECT_CONTENT_TYPE} results in an
- * ObjectMessage when not otherwise annotated to indicate the type of JMS message it is.
- *
- * @throws Exception
- * if an error occurs during the test.
- */
- @Test
- public void testCreateObjectMessageFromNoBodySectionAndContentType() throws Exception {
- JMSMappingInboundTransformer transformer = new JMSMappingInboundTransformer(idGenerator);
-
- Message message = Message.Factory.create();
- message.setContentType(AMQPMessageSupport.SERIALIZED_JAVA_OBJECT_CONTENT_TYPE);
-
- EncodedMessage em = encodeMessage(message);
- javax.jms.Message jmsMessage = transformer.transform(em);
-
- assertNotNull("Message should not be null", jmsMessage);
- assertEquals("Unexpected message class type", ServerJMSObjectMessage.class, jmsMessage.getClass());
- }
-
@Test
public void testCreateTextMessageFromNoBodySectionAndContentType() throws Exception {
- JMSMappingInboundTransformer transformer = new JMSMappingInboundTransformer(idGenerator);
-
Message message = Message.Factory.create();
message.setContentType("text/plain");
- EncodedMessage em = encodeMessage(message);
- javax.jms.Message jmsMessage = transformer.transform(em);
+ javax.jms.Message jmsMessage = ServerJMSMessage.wrapCoreMessage(new AMQPMessage(message).toCore());
assertNotNull("Message should not be null", jmsMessage);
assertEquals("Unexpected message class type", ServerJMSTextMessage.class, jmsMessage.getClass());
}
- /**
- * Test that a message with no body section, and with the content type set to an unknown
- * value results in a plain Message when not otherwise annotated to indicate the type of JMS
- * message it is.
- *
- * @throws Exception
- * if an error occurs during the test.
- */
- public void testCreateGenericMessageFromNoBodySectionAndUnknownContentType() throws Exception {
- JMSMappingInboundTransformer transformer = new JMSMappingInboundTransformer(idGenerator);
-
- Message message = Message.Factory.create();
- message.setContentType("unknown-content-type");
-
- EncodedMessage em = encodeMessage(message);
- javax.jms.Message jmsMessage = transformer.transform(em);
-
- assertNotNull("Message should not be null", jmsMessage);
- assertEquals("Unexpected message class type", ActiveMQMessage.class, jmsMessage.getClass());
- }
-
// ----- Data Body Section ------------------------------------------------//
/**
@@ -183,10 +130,7 @@ public class JMSMappingInboundTransformerTest {
message.setBody(new Data(binary));
message.setContentType(AMQPMessageSupport.OCTET_STREAM_CONTENT_TYPE);
- EncodedMessage em = encodeMessage(message);
-
- JMSMappingInboundTransformer transformer = new JMSMappingInboundTransformer(idGenerator);
- javax.jms.Message jmsMessage = transformer.transform(em);
+ javax.jms.Message jmsMessage = ServerJMSMessage.wrapCoreMessage(new AMQPMessage(message).toCore());
assertNotNull("Message should not be null", jmsMessage);
assertEquals("Unexpected message class type", ServerJMSBytesMessage.class, jmsMessage.getClass());
@@ -206,10 +150,7 @@ public class JMSMappingInboundTransformerTest {
message.setBody(new Data(binary));
message.setContentType("unknown-content-type");
- EncodedMessage em = encodeMessage(message);
-
- JMSMappingInboundTransformer transformer = new JMSMappingInboundTransformer(idGenerator);
- javax.jms.Message jmsMessage = transformer.transform(em);
+ javax.jms.Message jmsMessage = ServerJMSMessage.wrapCoreMessage(new AMQPMessage(message).toCore());
assertNotNull("Message should not be null", jmsMessage);
assertEquals("Unexpected message class type", ServerJMSBytesMessage.class, jmsMessage.getClass());
@@ -230,10 +171,7 @@ public class JMSMappingInboundTransformerTest {
assertNull(message.getContentType());
- EncodedMessage em = encodeMessage(message);
-
- JMSMappingInboundTransformer transformer = new JMSMappingInboundTransformer(idGenerator);
- javax.jms.Message jmsMessage = transformer.transform(em);
+ javax.jms.Message jmsMessage = ServerJMSMessage.wrapCoreMessage(new AMQPMessage(message).toCore());
assertNotNull("Message should not be null", jmsMessage);
assertEquals("Unexpected message class type", ServerJMSBytesMessage.class, jmsMessage.getClass());
@@ -252,12 +190,9 @@ public class JMSMappingInboundTransformerTest {
Message message = Proton.message();
Binary binary = new Binary(new byte[0]);
message.setBody(new Data(binary));
- message.setContentType(AMQPMessageSupport.SERIALIZED_JAVA_OBJECT_CONTENT_TYPE);
-
- EncodedMessage em = encodeMessage(message);
+ message.setContentType(AMQPMessageSupport.SERIALIZED_JAVA_OBJECT_CONTENT_TYPE.toString());
- JMSMappingInboundTransformer transformer = new JMSMappingInboundTransformer(idGenerator);
- javax.jms.Message jmsMessage = transformer.transform(em);
+ javax.jms.Message jmsMessage = ServerJMSMessage.wrapCoreMessage(new AMQPMessage(message).toCore());
assertNotNull("Message should not be null", jmsMessage);
assertEquals("Unexpected message class type", ServerJMSObjectMessage.class, jmsMessage.getClass());
@@ -357,10 +292,7 @@ public class JMSMappingInboundTransformerTest {
message.setBody(new Data(binary));
message.setContentType(contentType);
- EncodedMessage em = encodeMessage(message);
-
- JMSMappingInboundTransformer transformer = new JMSMappingInboundTransformer(idGenerator);
- javax.jms.Message jmsMessage = transformer.transform(em);
+ javax.jms.Message jmsMessage = ServerJMSMessage.wrapCoreMessage(new AMQPMessage(message).toCore());
assertNotNull("Message should not be null", jmsMessage);
if (StandardCharsets.UTF_8.equals(expectedCharset)) {
@@ -384,10 +316,7 @@ public class JMSMappingInboundTransformerTest {
Message message = Proton.message();
message.setBody(new AmqpValue("content"));
- EncodedMessage em = encodeMessage(message);
-
- JMSMappingInboundTransformer transformer = new JMSMappingInboundTransformer(idGenerator);
- javax.jms.Message jmsMessage = transformer.transform(em);
+ javax.jms.Message jmsMessage = ServerJMSMessage.wrapCoreMessage(new AMQPMessage(message).toCore());
assertNotNull("Message should not be null", jmsMessage);
assertEquals("Unexpected message class type", ServerJMSTextMessage.class, jmsMessage.getClass());
@@ -405,10 +334,7 @@ public class JMSMappingInboundTransformerTest {
Message message = Proton.message();
message.setBody(new AmqpValue(null));
- EncodedMessage em = encodeMessage(message);
-
- JMSMappingInboundTransformer transformer = new JMSMappingInboundTransformer(idGenerator);
- javax.jms.Message jmsMessage = transformer.transform(em);
+ javax.jms.Message jmsMessage = ServerJMSMessage.wrapCoreMessage(new AMQPMessage(message).toCore());
assertNotNull("Message should not be null", jmsMessage);
assertEquals("Unexpected message class type", ServerJMSTextMessage.class, jmsMessage.getClass());
@@ -424,14 +350,11 @@ public class JMSMappingInboundTransformerTest {
*/
@Test
public void testCreateObjectMessageFromAmqpValueWithBinaryAndContentType() throws Exception {
- JMSMappingInboundTransformer transformer = new JMSMappingInboundTransformer(idGenerator);
-
Message message = Message.Factory.create();
message.setBody(new AmqpValue(new Binary(new byte[0])));
- message.setContentType(AMQPMessageSupport.SERIALIZED_JAVA_OBJECT_CONTENT_TYPE);
+ message.setContentType(AMQPMessageSupport.SERIALIZED_JAVA_OBJECT_CONTENT_TYPE.toString());
- EncodedMessage em = encodeMessage(message);
- javax.jms.Message jmsMessage = transformer.transform(em);
+ javax.jms.Message jmsMessage = ServerJMSMessage.wrapCoreMessage(new AMQPMessage(message).toCore());
assertNotNull("Message should not be null", jmsMessage);
assertEquals("Unexpected message class type", ServerJMSObjectMessage.class, jmsMessage.getClass());
@@ -450,50 +373,13 @@ public class JMSMappingInboundTransformerTest {
Map<String, String> map = new HashMap<>();
message.setBody(new AmqpValue(map));
- EncodedMessage em = encodeMessage(message);
-
- JMSMappingInboundTransformer transformer = new JMSMappingInboundTransformer(idGenerator);
- javax.jms.Message jmsMessage = transformer.transform(em);
+ javax.jms.Message jmsMessage = ServerJMSMessage.wrapCoreMessage(new AMQPMessage(message).toCore());
assertNotNull("Message should not be null", jmsMessage);
assertEquals("Unexpected message class type", ServerJMSMapMessage.class, jmsMessage.getClass());
}
/**
- * Test that an amqp-value body containing a map that has an AMQP Binary as one of the
- * entries encoded into the Map results in an MapMessage where a byte array can be read from
- * the entry.
- *
- * @throws Exception
- * if an error occurs during the test.
- */
- @Test
- public void testCreateAmqpMapMessageFromAmqpValueWithMapContainingBinaryEntry() throws Exception {
- final String ENTRY_NAME = "bytesEntry";
-
- Message message = Proton.message();
- Map<String, Object> map = new HashMap<>();
-
- byte[] inputBytes = new byte[] {1, 2, 3, 4, 5};
- map.put(ENTRY_NAME, new Binary(inputBytes));
-
- message.setBody(new AmqpValue(map));
-
- EncodedMessage em = encodeMessage(message);
-
- JMSMappingInboundTransformer transformer = new JMSMappingInboundTransformer(idGenerator);
- javax.jms.Message jmsMessage = transformer.transform(em);
-
- assertNotNull("Message should not be null", jmsMessage);
- assertEquals("Unexpected message class type", ServerJMSMapMessage.class, jmsMessage.getClass());
-
- MapMessage mapMessage = (MapMessage) jmsMessage;
- byte[] outputBytes = mapMessage.getBytes(ENTRY_NAME);
- assertNotNull(outputBytes);
- assertTrue(Arrays.equals(inputBytes, outputBytes));
- }
-
- /**
* Test that an amqp-value body containing a list results in an StreamMessage when not
* otherwise annotated to indicate the type of JMS message it is.
*
@@ -506,10 +392,7 @@ public class JMSMappingInboundTransformerTest {
List<String> list = new ArrayList<>();
message.setBody(new AmqpValue(list));
- EncodedMessage em = encodeMessage(message);
-
- JMSMappingInboundTransformer transformer = new JMSMappingInboundTransformer(idGenerator);
- javax.jms.Message jmsMessage = transformer.transform(em);
+ javax.jms.Message jmsMessage = ServerJMSMessage.wrapCoreMessage(new AMQPMessage(message).toCore());
assertNotNull("Message should not be null", jmsMessage);
assertEquals("Unexpected message class type", ServerJMSStreamMessage.class, jmsMessage.getClass());
@@ -528,10 +411,7 @@ public class JMSMappingInboundTransformerTest {
List<String> list = new ArrayList<>();
message.setBody(new AmqpSequence(list));
- EncodedMessage em = encodeMessage(message);
-
- JMSMappingInboundTransformer transformer = new JMSMappingInboundTransformer(idGenerator);
- javax.jms.Message jmsMessage = transformer.transform(em);
+ javax.jms.Message jmsMessage = ServerJMSMessage.wrapCoreMessage(new AMQPMessage(message).toCore());
assertNotNull("Message should not be null", jmsMessage);
assertEquals("Unexpected message class type", ServerJMSStreamMessage.class, jmsMessage.getClass());
@@ -550,10 +430,7 @@ public class JMSMappingInboundTransformerTest {
Binary binary = new Binary(new byte[0]);
message.setBody(new AmqpValue(binary));
- EncodedMessage em = encodeMessage(message);
-
- JMSMappingInboundTransformer transformer = new JMSMappingInboundTransformer(idGenerator);
- javax.jms.Message jmsMessage = transformer.transform(em);
+ javax.jms.Message jmsMessage = ServerJMSMessage.wrapCoreMessage(new AMQPMessage(message).toCore());
assertNotNull("Message should not be null", jmsMessage);
assertEquals("Unexpected message class type", ServerJMSBytesMessage.class, jmsMessage.getClass());
@@ -572,11 +449,7 @@ public class JMSMappingInboundTransformerTest {
Message message = Proton.message();
message.setBody(new AmqpValue(UUID.randomUUID()));
- EncodedMessage em = encodeMessage(message);
-
- JMSMappingInboundTransformer transformer = new JMSMappingInboundTransformer(idGenerator);
-
- javax.jms.Message jmsMessage = transformer.transform(em);
+ javax.jms.Message jmsMessage = ServerJMSMessage.wrapCoreMessage(new AMQPMessage(message).toCore());
assertNotNull("Message should not be null", jmsMessage);
assertEquals("Unexpected message class type", ServerJMSBytesMessage.class, jmsMessage.getClass());
@@ -588,10 +461,8 @@ public class JMSMappingInboundTransformerTest {
Message message = Message.Factory.create();
message.setBody(new AmqpValue(contentString));
- EncodedMessage em = encodeMessage(message);
-
- JMSMappingInboundTransformer transformer = new JMSMappingInboundTransformer(idGenerator);
- javax.jms.Message jmsMessage = transformer.transform(em);
+ ServerJMSTextMessage jmsMessage = (ServerJMSTextMessage)ServerJMSMessage.wrapCoreMessage(new AMQPMessage(message).toCore());
+ jmsMessage.decode();
assertTrue("Expected TextMessage", jmsMessage instanceof TextMessage);
assertEquals("Unexpected message class type", ServerJMSTextMessage.class, jmsMessage.getClass());
@@ -631,7 +502,6 @@ public class JMSMappingInboundTransformerTest {
private void doTransformWithToTypeDestinationTypeAnnotationTestImpl(Object toTypeAnnotationValue, Class<? extends Destination> expectedClass)
throws Exception {
- JMSMappingInboundTransformer transformer = new JMSMappingInboundTransformer(idGenerator);
String toAddress = "toAddress";
Message amqp = Message.Factory.create();
@@ -644,9 +514,7 @@ public class JMSMappingInboundTransformerTest {
amqp.setMessageAnnotations(ma);
}
- EncodedMessage em = encodeMessage(amqp);
-
- javax.jms.Message jmsMessage = transformer.transform(em);
+ javax.jms.Message jmsMessage = ServerJMSMessage.wrapCoreMessage(new AMQPMessage(amqp).toCore());
assertTrue("Expected TextMessage", jmsMessage instanceof TextMessage);
}
@@ -679,7 +547,6 @@ public class JMSMappingInboundTransformerTest {
private void doTransformWithReplyToTypeDestinationTypeAnnotationTestImpl(Object replyToTypeAnnotationValue, Class<? extends Destination> expectedClass)
throws Exception {
- JMSMappingInboundTransformer transformer = new JMSMappingInboundTransformer(idGenerator);
String replyToAddress = "replyToAddress";
Message amqp = Message.Factory.create();
@@ -692,27 +559,8 @@ public class JMSMappingInboundTransformerTest {
amqp.setMessageAnnotations(ma);
}
- EncodedMessage em = encodeMessage(amqp);
-
- javax.jms.Message jmsMessage = transformer.transform(em);
+ javax.jms.Message jmsMessage = ServerJMSMessage.wrapCoreMessage(new AMQPMessage(amqp).toCore());
assertTrue("Expected TextMessage", jmsMessage instanceof TextMessage);
}
- // ----- Utility Methods --------------------------------------------------//
-
- private EncodedMessage encodeMessage(Message message) {
- byte[] encodeBuffer = new byte[1024 * 8];
- int encodedSize;
- while (true) {
- try {
- encodedSize = message.encode(encodeBuffer, 0, encodeBuffer.length);
- break;
- } catch (java.nio.BufferOverflowException e) {
- encodeBuffer = new byte[encodeBuffer.length * 2];
- }
- }
-
- long messageFormat = 0;
- return new EncodedMessage(messageFormat, encodeBuffer, 0, encodedSize);
- }
}
[06/17] activemq-artemis git commit: ARTEMIS-1009 Pure Message
Encoding.
Posted by cl...@apache.org.
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/StorageManager.java
----------------------------------------------------------------------
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 b45775c..e27ed30 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
@@ -23,13 +23,13 @@ import java.util.Map;
import java.util.Set;
import java.util.concurrent.Executor;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.Pair;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.io.IOCallback;
import org.apache.activemq.artemis.core.io.SequentialFile;
import org.apache.activemq.artemis.core.journal.Journal;
import org.apache.activemq.artemis.core.journal.JournalLoadInformation;
-import org.apache.activemq.artemis.core.message.impl.MessageInternal;
import org.apache.activemq.artemis.core.paging.PageTransactionInfo;
import org.apache.activemq.artemis.core.paging.PagedMessage;
import org.apache.activemq.artemis.core.paging.PagingManager;
@@ -45,7 +45,6 @@ import org.apache.activemq.artemis.core.server.ActiveMQComponent;
import org.apache.activemq.artemis.core.server.LargeServerMessage;
import org.apache.activemq.artemis.core.server.MessageReference;
import org.apache.activemq.artemis.core.server.RouteContextList;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.files.FileStoreMonitor;
import org.apache.activemq.artemis.core.server.group.impl.GroupBinding;
import org.apache.activemq.artemis.core.server.impl.AddressInfo;
@@ -172,7 +171,7 @@ public interface StorageManager extends IDGenerator, ActiveMQComponent {
*/
void confirmPendingLargeMessage(long recordID) throws Exception;
- void storeMessage(ServerMessage message) throws Exception;
+ void storeMessage(Message message) throws Exception;
void storeReference(long queueID, long messageID, boolean last) throws Exception;
@@ -190,7 +189,7 @@ public interface StorageManager extends IDGenerator, ActiveMQComponent {
void deleteDuplicateID(long recordID) throws Exception;
- void storeMessageTransactional(long txID, ServerMessage message) throws Exception;
+ void storeMessageTransactional(long txID, Message message) throws Exception;
void storeReferenceTransactional(long txID, long queueID, long messageID) throws Exception;
@@ -225,7 +224,7 @@ public interface StorageManager extends IDGenerator, ActiveMQComponent {
* @return a large message object
* @throws Exception
*/
- LargeServerMessage createLargeMessage(long id, MessageInternal message) throws Exception;
+ LargeServerMessage createLargeMessage(long id, Message message) throws Exception;
enum LargeMessageExtension {
DURABLE(".msg"), TEMPORARY(".tmp"), SYNC(".sync");
@@ -265,11 +264,6 @@ public interface StorageManager extends IDGenerator, ActiveMQComponent {
void updatePageTransaction(long txID, PageTransactionInfo pageTransaction, int depage) throws Exception;
- /**
- * FIXME Unused
- */
- void updatePageTransaction(PageTransactionInfo pageTransaction, int depage) throws Exception;
-
void deletePageTransactional(long recordID) throws Exception;
JournalLoadInformation loadMessageJournal(final PostOffice postOffice,
@@ -383,7 +377,7 @@ public interface StorageManager extends IDGenerator, ActiveMQComponent {
* needs to be sent to the journal
* @throws Exception
*/
- boolean addToPage(PagingStore store, ServerMessage msg, Transaction tx, RouteContextList listCtx) throws Exception;
+ boolean addToPage(PagingStore store, Message msg, Transaction tx, RouteContextList listCtx) throws Exception;
/**
* Stops the replication of data from the live to the backup.
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/AbstractJournalStorageManager.java
----------------------------------------------------------------------
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 2708c72..8311057 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
@@ -39,6 +39,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
import org.apache.activemq.artemis.api.core.ActiveMQBuffers;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.Pair;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.config.Configuration;
@@ -72,7 +73,7 @@ import org.apache.activemq.artemis.core.persistence.impl.journal.codec.Duplicate
import org.apache.activemq.artemis.core.persistence.impl.journal.codec.FinishPageMessageOperation;
import org.apache.activemq.artemis.core.persistence.impl.journal.codec.GroupingEncoding;
import org.apache.activemq.artemis.core.persistence.impl.journal.codec.HeuristicCompletionEncoding;
-import org.apache.activemq.artemis.core.persistence.impl.journal.codec.LargeMessageEncoding;
+import org.apache.activemq.artemis.core.persistence.impl.journal.codec.LargeMessagePersister;
import org.apache.activemq.artemis.core.persistence.impl.journal.codec.PageCountPendingImpl;
import org.apache.activemq.artemis.core.persistence.impl.journal.codec.PageCountRecord;
import org.apache.activemq.artemis.core.persistence.impl.journal.codec.PageCountRecordInc;
@@ -93,15 +94,14 @@ import org.apache.activemq.artemis.core.server.LargeServerMessage;
import org.apache.activemq.artemis.core.server.MessageReference;
import org.apache.activemq.artemis.core.server.Queue;
import org.apache.activemq.artemis.core.server.RouteContextList;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.group.impl.GroupBinding;
import org.apache.activemq.artemis.core.server.impl.AddressInfo;
import org.apache.activemq.artemis.core.server.impl.JournalLoader;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
import org.apache.activemq.artemis.core.transaction.ResourceManager;
import org.apache.activemq.artemis.core.transaction.Transaction;
import org.apache.activemq.artemis.core.transaction.TransactionPropertyIndexes;
import org.apache.activemq.artemis.core.transaction.impl.TransactionImpl;
+import org.apache.activemq.artemis.spi.core.protocol.MessagePersister;
import org.apache.activemq.artemis.utils.Base64;
import org.apache.activemq.artemis.utils.ExecutorFactory;
import org.apache.activemq.artemis.utils.IDGenerator;
@@ -174,8 +174,6 @@ public abstract class AbstractJournalStorageManager implements StorageManager {
private final boolean syncNonTransactional;
- protected int perfBlastPages = -1;
-
protected boolean journalLoaded = false;
private final IOCriticalErrorListener ioCriticalErrorListener;
@@ -347,7 +345,7 @@ public abstract class AbstractJournalStorageManager implements StorageManager {
}
@Override
- public void storeMessage(final ServerMessage message) throws Exception {
+ public void storeMessage(final Message message) throws Exception {
if (message.getMessageID() <= 0) {
// Sanity check only... this shouldn't happen unless there is a bug
throw ActiveMQMessageBundle.BUNDLE.messageIdNotAssigned();
@@ -359,9 +357,9 @@ public abstract class AbstractJournalStorageManager implements StorageManager {
// appropriate
if (message.isLargeMessage()) {
- messageJournal.appendAddRecord(message.getMessageID(), JournalRecordIds.ADD_LARGE_MESSAGE, new LargeMessageEncoding((LargeServerMessage) message), false, getContext(false));
+ messageJournal.appendAddRecord(message.getMessageID(), JournalRecordIds.ADD_LARGE_MESSAGE, LargeMessagePersister.getInstance(), message, false, getContext(false));
} else {
- messageJournal.appendAddRecord(message.getMessageID(), JournalRecordIds.ADD_MESSAGE, message, false, getContext(false));
+ messageJournal.appendAddRecord(message.getMessageID(), JournalRecordIds.ADD_MESSAGE_PROTOCOL, message.getPersister(), message, false, getContext(false));
}
} finally {
readUnLock();
@@ -460,7 +458,7 @@ public abstract class AbstractJournalStorageManager implements StorageManager {
// Transactional operations
@Override
- public void storeMessageTransactional(final long txID, final ServerMessage message) throws Exception {
+ public void storeMessageTransactional(final long txID, final Message message) throws Exception {
if (message.getMessageID() <= 0) {
throw ActiveMQMessageBundle.BUNDLE.messageIdNotAssigned();
}
@@ -468,9 +466,9 @@ public abstract class AbstractJournalStorageManager implements StorageManager {
readLock();
try {
if (message.isLargeMessage()) {
- messageJournal.appendAddRecordTransactional(txID, message.getMessageID(), JournalRecordIds.ADD_LARGE_MESSAGE, new LargeMessageEncoding(((LargeServerMessage) message)));
+ messageJournal.appendAddRecordTransactional(txID, message.getMessageID(), JournalRecordIds.ADD_LARGE_MESSAGE, LargeMessagePersister.getInstance(), message);
} else {
- messageJournal.appendAddRecordTransactional(txID, message.getMessageID(), JournalRecordIds.ADD_MESSAGE, message);
+ messageJournal.appendAddRecordTransactional(txID, message.getMessageID(), JournalRecordIds.ADD_MESSAGE_PROTOCOL, message.getPersister(), message);
}
} finally {
@@ -502,16 +500,6 @@ public abstract class AbstractJournalStorageManager implements StorageManager {
}
@Override
- public void updatePageTransaction(final PageTransactionInfo pageTransaction, final int depages) throws Exception {
- readLock();
- try {
- messageJournal.appendUpdateRecord(pageTransaction.getRecordID(), JournalRecordIds.PAGE_TRANSACTION, new PageUpdateTXEncoding(pageTransaction.getTransactionID(), depages), syncNonTransactional, getContext(syncNonTransactional));
- } finally {
- readUnLock();
- }
- }
-
- @Override
public void storeReferenceTransactional(final long txID, final long queueID, final long messageID) throws Exception {
readLock();
try {
@@ -833,7 +821,7 @@ public abstract class AbstractJournalStorageManager implements StorageManager {
List<PreparedTransactionInfo> preparedTransactions = new ArrayList<>();
- Map<Long, ServerMessage> messages = new HashMap<>();
+ Map<Long, Message> messages = new HashMap<>();
readLock();
try {
@@ -884,9 +872,12 @@ public abstract class AbstractJournalStorageManager implements StorageManager {
break;
}
case JournalRecordIds.ADD_MESSAGE: {
- ServerMessage message = new ServerMessageImpl(record.id, 50);
+ throw new IllegalStateException("This is using old journal data, export your data and import at the correct version");
+ }
- message.decode(buff);
+ case JournalRecordIds.ADD_MESSAGE_PROTOCOL: {
+
+ Message message = MessagePersister.getInstance().decode(buff, null);
messages.put(record.id, message);
@@ -907,7 +898,7 @@ public abstract class AbstractJournalStorageManager implements StorageManager {
queueMap.put(encoding.queueID, queueMessages);
}
- ServerMessage message = messages.get(messageID);
+ Message message = messages.get(messageID);
if (message == null) {
ActiveMQServerLogger.LOGGER.cannotFindMessage(record.id);
@@ -1151,10 +1142,6 @@ public abstract class AbstractJournalStorageManager implements StorageManager {
pagingManager.processReload();
}
- if (perfBlastPages != -1) {
- messageJournal.perfBlast(perfBlastPages);
- }
-
journalLoader.postLoad(messageJournal, resourceManager, duplicateIDMap);
journalLoaded = true;
return info;
@@ -1581,7 +1568,7 @@ public abstract class AbstractJournalStorageManager implements StorageManager {
}
}
- protected abstract LargeServerMessage parseLargeMessage(Map<Long, ServerMessage> messages,
+ protected abstract LargeServerMessage parseLargeMessage(Map<Long, Message> messages,
ActiveMQBuffer buff) throws Exception;
private void loadPreparedTransactions(final PostOffice postOffice,
@@ -1603,7 +1590,7 @@ public abstract class AbstractJournalStorageManager implements StorageManager {
List<MessageReference> referencesToAck = new ArrayList<>();
- Map<Long, ServerMessage> messages = new HashMap<>();
+ Map<Long, Message> messages = new HashMap<>();
// Use same method as load message journal to prune out acks, so they don't get added.
// Then have reacknowledge(tx) methods on queue, which needs to add the page size
@@ -1623,9 +1610,11 @@ public abstract class AbstractJournalStorageManager implements StorageManager {
break;
}
case JournalRecordIds.ADD_MESSAGE: {
- ServerMessage message = new ServerMessageImpl(record.id, 50);
- message.decode(buff);
+ break;
+ }
+ case JournalRecordIds.ADD_MESSAGE_PROTOCOL: {
+ Message message = MessagePersister.getInstance().decode(buff, null);
messages.put(record.id, message);
@@ -1638,7 +1627,7 @@ public abstract class AbstractJournalStorageManager implements StorageManager {
encoding.decode(buff);
- ServerMessage message = messages.get(messageID);
+ Message message = messages.get(messageID);
if (message == null) {
throw new IllegalStateException("Cannot find message with id " + messageID);
@@ -1915,7 +1904,7 @@ public abstract class AbstractJournalStorageManager implements StorageManager {
@Override
public boolean addToPage(PagingStore store,
- ServerMessage msg,
+ Message msg,
Transaction tx,
RouteContextList listCtx) throws Exception {
/**
@@ -1939,4 +1928,5 @@ public abstract class AbstractJournalStorageManager implements StorageManager {
}
txoper.confirmedMessages.add(recordID);
}
+
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/AddMessageRecord.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/AddMessageRecord.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/AddMessageRecord.java
index 3ca38e3..acf9c8e 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/AddMessageRecord.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/AddMessageRecord.java
@@ -16,21 +16,21 @@
*/
package org.apache.activemq.artemis.core.persistence.impl.journal;
-import org.apache.activemq.artemis.core.server.ServerMessage;
+import org.apache.activemq.artemis.api.core.Message;
public final class AddMessageRecord {
- public AddMessageRecord(final ServerMessage message) {
+ public AddMessageRecord(final Message message) {
this.message = message;
}
- final ServerMessage message;
+ final Message message;
private long scheduledDeliveryTime;
private int deliveryCount;
- public ServerMessage getMessage() {
+ public Message getMessage() {
return message;
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/DescribeJournal.java
----------------------------------------------------------------------
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 b9449bc..698978b 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
@@ -44,7 +44,7 @@ import org.apache.activemq.artemis.core.persistence.impl.journal.codec.CursorAck
import org.apache.activemq.artemis.core.persistence.impl.journal.codec.DeliveryCountUpdateEncoding;
import org.apache.activemq.artemis.core.persistence.impl.journal.codec.DuplicateIDEncoding;
import org.apache.activemq.artemis.core.persistence.impl.journal.codec.HeuristicCompletionEncoding;
-import org.apache.activemq.artemis.core.persistence.impl.journal.codec.LargeMessageEncoding;
+import org.apache.activemq.artemis.core.persistence.impl.journal.codec.LargeMessagePersister;
import org.apache.activemq.artemis.core.persistence.impl.journal.codec.PageCountPendingImpl;
import org.apache.activemq.artemis.core.persistence.impl.journal.codec.PageCountRecord;
import org.apache.activemq.artemis.core.persistence.impl.journal.codec.PageCountRecordInc;
@@ -53,8 +53,7 @@ import org.apache.activemq.artemis.core.persistence.impl.journal.codec.PendingLa
import org.apache.activemq.artemis.core.persistence.impl.journal.codec.RefEncoding;
import org.apache.activemq.artemis.core.persistence.impl.journal.codec.ScheduledDeliveryEncoding;
import org.apache.activemq.artemis.core.server.LargeServerMessage;
-import org.apache.activemq.artemis.core.server.ServerMessage;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
+import org.apache.activemq.artemis.spi.core.protocol.MessagePersister;
import org.apache.activemq.artemis.utils.Base64;
import org.apache.activemq.artemis.utils.XidCodecSupport;
@@ -64,6 +63,7 @@ import static org.apache.activemq.artemis.core.persistence.impl.journal.JournalR
import static org.apache.activemq.artemis.core.persistence.impl.journal.JournalRecordIds.ADD_LARGE_MESSAGE;
import static org.apache.activemq.artemis.core.persistence.impl.journal.JournalRecordIds.ADD_LARGE_MESSAGE_PENDING;
import static org.apache.activemq.artemis.core.persistence.impl.journal.JournalRecordIds.ADD_MESSAGE;
+import static org.apache.activemq.artemis.core.persistence.impl.journal.JournalRecordIds.ADD_MESSAGE_PROTOCOL;
import static org.apache.activemq.artemis.core.persistence.impl.journal.JournalRecordIds.ADD_REF;
import static org.apache.activemq.artemis.core.persistence.impl.journal.JournalRecordIds.DUPLICATE_ID;
import static org.apache.activemq.artemis.core.persistence.impl.journal.JournalRecordIds.HEURISTIC_COMPLETION;
@@ -445,16 +445,15 @@ public final class DescribeJournal {
LargeServerMessage largeMessage = new LargeServerMessageImpl(storageManager);
- LargeMessageEncoding messageEncoding = new LargeMessageEncoding(largeMessage);
-
- messageEncoding.decode(buffer);
+ LargeMessagePersister.getInstance().decode(buffer, largeMessage);
return new MessageDescribe(largeMessage);
}
case ADD_MESSAGE: {
- ServerMessage message = new ServerMessageImpl(rec, 50);
-
- message.decode(buffer);
+ return "ADD-MESSAGE is not supported any longer, use export/import";
+ }
+ case ADD_MESSAGE_PROTOCOL: {
+ Message message = MessagePersister.getInstance().decode(buffer, null);
return new MessageDescribe(message);
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/JournalRecordIds.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/JournalRecordIds.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/JournalRecordIds.java
index cd1d526..348ac9b 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/JournalRecordIds.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/JournalRecordIds.java
@@ -85,4 +85,7 @@ public final class JournalRecordIds {
public static final byte PAGE_CURSOR_PENDING_COUNTER = 43;
public static final byte ADDRESS_BINDING_RECORD = 44;
+
+ public static final byte ADD_MESSAGE_PROTOCOL = 45;
+
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/JournalStorageManager.java
----------------------------------------------------------------------
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 51fd6cc..c31de52 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
@@ -49,12 +49,11 @@ import org.apache.activemq.artemis.core.io.nio.NIOSequentialFileFactory;
import org.apache.activemq.artemis.core.journal.Journal;
import org.apache.activemq.artemis.core.journal.impl.JournalFile;
import org.apache.activemq.artemis.core.journal.impl.JournalImpl;
-import org.apache.activemq.artemis.core.message.impl.MessageInternal;
import org.apache.activemq.artemis.core.paging.PagedMessage;
import org.apache.activemq.artemis.core.paging.PagingManager;
import org.apache.activemq.artemis.core.paging.PagingStore;
import org.apache.activemq.artemis.core.persistence.OperationContext;
-import org.apache.activemq.artemis.core.persistence.impl.journal.codec.LargeMessageEncoding;
+import org.apache.activemq.artemis.core.persistence.impl.journal.codec.LargeMessagePersister;
import org.apache.activemq.artemis.core.persistence.impl.journal.codec.PendingLargeMessageEncoding;
import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.ReplicationLiveIsStoppingMessage;
import org.apache.activemq.artemis.core.replication.ReplicatedJournal;
@@ -63,7 +62,6 @@ import org.apache.activemq.artemis.core.server.ActiveMQMessageBundle;
import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
import org.apache.activemq.artemis.core.server.JournalType;
import org.apache.activemq.artemis.core.server.LargeServerMessage;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.files.FileStoreMonitor;
import org.apache.activemq.artemis.utils.ExecutorFactory;
import org.jboss.logging.Logger;
@@ -157,8 +155,6 @@ public class JournalStorageManager extends AbstractJournalStorageManager {
largeMessagesFactory = new NIOSequentialFileFactory(config.getLargeMessagesLocation(), false, criticalErrorListener, 1);
- perfBlastPages = config.getJournalPerfBlastPages();
-
if (config.getPageMaxConcurrentIO() != 1) {
pageMaxConcurrentIO = new Semaphore(config.getPageMaxConcurrentIO());
} else {
@@ -287,13 +283,11 @@ public class JournalStorageManager extends AbstractJournalStorageManager {
* @param buff
* @return
* @throws Exception
- */ protected LargeServerMessage parseLargeMessage(final Map<Long, ServerMessage> messages,
+ */ protected LargeServerMessage parseLargeMessage(final Map<Long, Message> messages,
final ActiveMQBuffer buff) throws Exception {
LargeServerMessage largeMessage = createLargeMessage();
- LargeMessageEncoding messageEncoding = new LargeMessageEncoding(largeMessage);
-
- messageEncoding.decode(buff);
+ LargeMessagePersister.getInstance().decode(buff, largeMessage);
if (largeMessage.containsProperty(Message.HDR_ORIG_MESSAGE_ID)) {
// for compatibility: couple with old behaviour, copying the old file to avoid message loss
@@ -451,7 +445,7 @@ public class JournalStorageManager extends AbstractJournalStorageManager {
}
@Override
- public LargeServerMessage createLargeMessage(final long id, final MessageInternal message) throws Exception {
+ public LargeServerMessage createLargeMessage(final long id, final Message message) throws Exception {
readLock();
try {
if (isReplicated()) {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/LargeMessageTXFailureCallback.java
----------------------------------------------------------------------
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 8953291..33be342 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
@@ -21,21 +21,21 @@ import java.util.Map;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
import org.apache.activemq.artemis.api.core.ActiveMQBuffers;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.core.journal.RecordInfo;
import org.apache.activemq.artemis.core.journal.TransactionFailureCallback;
import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
import org.apache.activemq.artemis.core.server.LargeServerMessage;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import static org.apache.activemq.artemis.core.persistence.impl.journal.JournalRecordIds.ADD_LARGE_MESSAGE;
public class LargeMessageTXFailureCallback implements TransactionFailureCallback {
private AbstractJournalStorageManager journalStorageManager;
- private final Map<Long, ServerMessage> messages;
+ private final Map<Long, Message> messages;
public LargeMessageTXFailureCallback(AbstractJournalStorageManager journalStorageManager,
- final Map<Long, ServerMessage> messages) {
+ final Map<Long, Message> messages) {
super();
this.journalStorageManager = journalStorageManager;
this.messages = messages;
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/LargeServerMessageImpl.java
----------------------------------------------------------------------
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 90b1fdd..1b5c24e 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
@@ -25,17 +25,15 @@ import org.apache.activemq.artemis.api.core.ActiveMQExceptionType;
import org.apache.activemq.artemis.api.core.ActiveMQInternalErrorException;
import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.core.io.SequentialFile;
-import org.apache.activemq.artemis.core.message.BodyEncoder;
+import org.apache.activemq.artemis.core.message.LargeBodyEncoder;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
import org.apache.activemq.artemis.core.server.LargeServerMessage;
-import org.apache.activemq.artemis.core.server.MessageReference;
-import org.apache.activemq.artemis.core.server.ServerMessage;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
import org.apache.activemq.artemis.utils.DataConstants;
import org.apache.activemq.artemis.utils.TypedProperties;
import org.jboss.logging.Logger;
-public final class LargeServerMessageImpl extends ServerMessageImpl implements LargeServerMessage {
+public final class LargeServerMessageImpl extends CoreMessage implements LargeServerMessage {
// Constants -----------------------------------------------------
private static final Logger logger = Logger.getLogger(LargeServerMessageImpl.class);
@@ -43,30 +41,28 @@ public final class LargeServerMessageImpl extends ServerMessageImpl implements L
// Attributes ----------------------------------------------------
private final JournalStorageManager storageManager;
-
+ private final AtomicInteger delayDeletionCount = new AtomicInteger(0);
private long pendingRecordID = -1;
-
private boolean paged;
-
// We should only use the NIO implementation on the Journal
private SequentialFile file;
-
// set when a copyFrom is called
// The actual copy is done when finishCopy is called
private SequentialFile pendingCopy;
-
private long bodySize = -1;
- private final AtomicInteger delayDeletionCount = new AtomicInteger(0);
-
// Static --------------------------------------------------------
// Constructors --------------------------------------------------
+ // We cache this
+ private volatile int memoryEstimate = -1;
public LargeServerMessageImpl(final JournalStorageManager storageManager) {
this.storageManager = storageManager;
}
+ // Public --------------------------------------------------------
+
/**
* Copy constructor
*
@@ -85,14 +81,18 @@ public final class LargeServerMessageImpl extends ServerMessageImpl implements L
setMessageID(newID);
}
- // Public --------------------------------------------------------
+ private static String toDate(long timestamp) {
+ if (timestamp == 0) {
+ return "0";
+ } else {
+ return new java.util.Date(timestamp).toString();
+ }
+
+ }
- /**
- * @param pendingRecordID
- */
@Override
- public void setPendingRecordID(long pendingRecordID) {
- this.pendingRecordID = pendingRecordID;
+ public boolean isServerMessage() {
+ return true;
}
@Override
@@ -100,6 +100,14 @@ public final class LargeServerMessageImpl extends ServerMessageImpl implements L
return this.pendingRecordID;
}
+ /**
+ * @param pendingRecordID
+ */
+ @Override
+ public void setPendingRecordID(long pendingRecordID) {
+ this.pendingRecordID = pendingRecordID;
+ }
+
@Override
public void setPaged() {
paged = true;
@@ -118,39 +126,19 @@ public final class LargeServerMessageImpl extends ServerMessageImpl implements L
bodySize += bytes.length;
}
- public void encodeBody(final ActiveMQBuffer bufferOut, final BodyEncoder context, final int size) {
- try {
- // This could maybe be optimized (maybe reading directly into bufferOut)
- ByteBuffer bufferRead = ByteBuffer.allocate(size);
-
- int bytesRead = context.encode(bufferRead);
-
- bufferRead.flip();
-
- if (bytesRead > 0) {
- bufferOut.writeBytes(bufferRead.array(), 0, bytesRead);
- }
-
- } catch (Exception e) {
- throw new RuntimeException(e.getMessage(), e);
- }
- }
-
@Override
public synchronized int getEncodeSize() {
return getHeadersAndPropertiesEncodeSize();
}
- @Override
public void encode(final ActiveMQBuffer buffer1) {
- super.encodeHeadersAndProperties(buffer1);
+ super.encodeHeadersAndProperties(buffer1.byteBuf());
}
- @Override
public void decode(final ActiveMQBuffer buffer1) {
file = null;
- super.decodeHeadersAndProperties(buffer1);
+ super.decodeHeadersAndProperties(buffer1.byteBuf());
}
@Override
@@ -175,7 +163,7 @@ public final class LargeServerMessageImpl extends ServerMessageImpl implements L
}
@Override
- public BodyEncoder getBodyEncoder() throws ActiveMQException {
+ public LargeBodyEncoder getBodyEncoder() throws ActiveMQException {
validateFile();
return new DecodingContext();
}
@@ -220,9 +208,6 @@ public final class LargeServerMessageImpl extends ServerMessageImpl implements L
storageManager.deleteLargeMessageFile(this);
}
- // We cache this
- private volatile int memoryEstimate = -1;
-
@Override
public synchronized int getMemoryEstimate() {
if (memoryEstimate == -1) {
@@ -248,28 +233,29 @@ public final class LargeServerMessageImpl extends ServerMessageImpl implements L
}
@Override
- public void setOriginalHeaders(final ServerMessage other,
- final MessageReference originalReference,
- final boolean expiry) {
- super.setOriginalHeaders(other, originalReference, expiry);
-
- LargeServerMessageImpl otherLM = (LargeServerMessageImpl) other;
- this.paged = otherLM.paged;
- if (this.paged) {
- this.removeProperty(Message.HDR_ORIG_MESSAGE_ID);
+ public void referenceOriginalMessage(final Message original, String originalQueue) {
+
+ super.referenceOriginalMessage(original, originalQueue);
+
+ if (original instanceof LargeServerMessageImpl) {
+ LargeServerMessageImpl otherLM = (LargeServerMessageImpl) original;
+ this.paged = otherLM.paged;
+ if (this.paged) {
+ this.removeProperty(Message.HDR_ORIG_MESSAGE_ID);
+ }
}
}
@Override
- public ServerMessage copy() {
+ public Message copy() {
SequentialFile newfile = storageManager.createFileForLargeMessage(messageID, durable);
- ServerMessage newMessage = new LargeServerMessageImpl(this, properties, newfile, messageID);
+ Message newMessage = new LargeServerMessageImpl(this, properties, newfile, messageID);
return newMessage;
}
@Override
- public ServerMessage copy(final long newID) {
+ public Message copy(final long newID) {
try {
LargeServerMessage newMessage = storageManager.createLargeMessage(newID, this);
@@ -337,19 +323,6 @@ public final class LargeServerMessageImpl extends ServerMessageImpl implements L
", durable=" + durable + ", address=" + getAddress() + ",properties=" + properties.toString() + "]@" + System.identityHashCode(this);
}
- private static String toDate(long timestamp) {
- if (timestamp == 0) {
- return "0";
- } else {
- return new java.util.Date(timestamp).toString();
- }
-
- }
-
- // Package protected ---------------------------------------------
-
- // Protected -----------------------------------------------------
-
@Override
protected void finalize() throws Throwable {
releaseResources();
@@ -400,7 +373,7 @@ public final class LargeServerMessageImpl extends ServerMessageImpl implements L
// Inner classes -------------------------------------------------
- class DecodingContext implements BodyEncoder {
+ class DecodingContext implements LargeBodyEncoder {
private SequentialFile cFile;
@@ -454,7 +427,7 @@ public final class LargeServerMessageImpl extends ServerMessageImpl implements L
}
/* (non-Javadoc)
- * @see org.apache.activemq.artemis.core.message.BodyEncoder#getLargeBodySize()
+ * @see org.apache.activemq.artemis.core.message.LargeBodyEncoder#getLargeBodySize()
*/
@Override
public long getLargeBodySize() {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/LargeServerMessagePersister.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/LargeServerMessagePersister.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/LargeServerMessagePersister.java
new file mode 100644
index 0000000..cb578e1
--- /dev/null
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/LargeServerMessagePersister.java
@@ -0,0 +1,73 @@
+/**
+ * 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 org.apache.activemq.artemis.api.core.ActiveMQBuffer;
+import org.apache.activemq.artemis.api.core.SimpleString;
+import org.apache.activemq.artemis.core.persistence.Persister;
+import org.apache.activemq.artemis.core.server.LargeServerMessage;
+import org.apache.activemq.artemis.utils.DataConstants;
+
+public class LargeServerMessagePersister implements Persister<LargeServerMessage> {
+
+ /**
+ * for future usage...
+ * when we have refactored large message properly
+ * this could be used to differentiate other protocols large message persisters
+ */
+ byte PERSISTER_ID = 11;
+
+ public static LargeServerMessagePersister theInstance = new LargeServerMessagePersister();
+
+ public static LargeServerMessagePersister getInstance() {
+ return theInstance;
+ }
+
+ protected LargeServerMessagePersister() {
+ }
+
+ @Override
+ public int getEncodeSize(LargeServerMessage record) {
+ return DataConstants.SIZE_BYTE + DataConstants.SIZE_LONG + SimpleString.sizeofNullableString(record.getAddressSimpleString())
+ + record.getPersistSize();
+ }
+
+ /** Sub classes must add the first short as the protocol-id */
+ @Override
+ public void encode(ActiveMQBuffer buffer, LargeServerMessage record) {
+ buffer.writeByte(PERSISTER_ID);
+ buffer.writeLong(record.getMessageID());
+ buffer.writeNullableSimpleString(record.getAddressSimpleString());
+ record.persist(buffer);
+ }
+
+
+ @Override
+ public LargeServerMessage decode(ActiveMQBuffer buffer, LargeServerMessage record) {
+ // the caller must consume the first byte already, as that will be used to decide what persister (protocol) to use
+ buffer.readByte(); // for future usage, not used now
+ long id = buffer.readLong();
+ SimpleString address = buffer.readNullableSimpleString();
+ record.reloadPersistence(buffer);
+ record.setMessageID(id);
+ record.setAddress(address);
+ return record;
+ }
+
+
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/codec/LargeMessageEncoding.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/codec/LargeMessageEncoding.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/codec/LargeMessageEncoding.java
deleted file mode 100644
index cdb5702..0000000
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/codec/LargeMessageEncoding.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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.codec;
-
-import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
-import org.apache.activemq.artemis.core.journal.EncodingSupport;
-import org.apache.activemq.artemis.core.server.LargeServerMessage;
-
-public class LargeMessageEncoding implements EncodingSupport {
-
- public final LargeServerMessage message;
-
- public LargeMessageEncoding(final LargeServerMessage message) {
- this.message = message;
- }
-
- /* (non-Javadoc)
- * @see org.apache.activemq.artemis.core.journal.EncodingSupport#decode(org.apache.activemq.artemis.spi.core.remoting.ActiveMQBuffer)
- */
- @Override
- public void decode(final ActiveMQBuffer buffer) {
- message.decodeHeadersAndProperties(buffer);
- }
-
- /* (non-Javadoc)
- * @see org.apache.activemq.artemis.core.journal.EncodingSupport#encode(org.apache.activemq.artemis.spi.core.remoting.ActiveMQBuffer)
- */
- @Override
- public void encode(final ActiveMQBuffer buffer) {
- message.encode(buffer);
- }
-
- /* (non-Javadoc)
- * @see org.apache.activemq.artemis.core.journal.EncodingSupport#getEncodeSize()
- */
- @Override
- public int getEncodeSize() {
- return message.getEncodeSize();
- }
-
-}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/codec/LargeMessagePersister.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..b715f97
--- /dev/null
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/journal/codec/LargeMessagePersister.java
@@ -0,0 +1,62 @@
+/**
+ * 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.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.Persister;
+import org.apache.activemq.artemis.core.server.LargeServerMessage;
+
+public class LargeMessagePersister implements Persister<LargeServerMessage> {
+
+ private static final LargeMessagePersister theInstance = new LargeMessagePersister();
+
+
+ public static LargeMessagePersister getInstance() {
+ return theInstance;
+ }
+
+ protected LargeMessagePersister() {
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.activemq.artemis.core.journal.EncodingSupport#decode(org.apache.activemq.artemis.spi.core.remoting.ActiveMQBuffer)
+ */
+ @Override
+ public LargeServerMessage decode(final ActiveMQBuffer buffer, LargeServerMessage message) {
+ ((CoreMessage)message).decodeHeadersAndProperties(buffer.byteBuf());
+ return message;
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.activemq.artemis.core.journal.EncodingSupport#encode(org.apache.activemq.artemis.spi.core.remoting.ActiveMQBuffer)
+ */
+ @Override
+ public void encode(final ActiveMQBuffer buffer, LargeServerMessage message) {
+ ((CoreMessage)message).encodeHeadersAndProperties(buffer.byteBuf());
+ }
+
+ /* (non-Javadoc)
+ * @see org.apache.activemq.artemis.core.journal.EncodingSupport#getEncodeSize()
+ */
+ @Override
+ public int getEncodeSize(LargeServerMessage message) {
+ return message.getEncodeSize();
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/nullpm/NullStorageLargeServerMessage.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/nullpm/NullStorageLargeServerMessage.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/nullpm/NullStorageLargeServerMessage.java
index 5b325b6..edd37b7 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/nullpm/NullStorageLargeServerMessage.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/nullpm/NullStorageLargeServerMessage.java
@@ -17,12 +17,12 @@
package org.apache.activemq.artemis.core.persistence.impl.nullpm;
import org.apache.activemq.artemis.api.core.ActiveMQBuffers;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.core.io.SequentialFile;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import org.apache.activemq.artemis.core.server.LargeServerMessage;
-import org.apache.activemq.artemis.core.server.ServerMessage;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
-class NullStorageLargeServerMessage extends ServerMessageImpl implements LargeServerMessage {
+class NullStorageLargeServerMessage extends CoreMessage implements LargeServerMessage {
NullStorageLargeServerMessage() {
super();
@@ -39,7 +39,7 @@ class NullStorageLargeServerMessage extends ServerMessageImpl implements LargeSe
@Override
public synchronized void addBytes(final byte[] bytes) {
if (buffer == null) {
- buffer = ActiveMQBuffers.dynamicBuffer(bytes.length);
+ buffer = ActiveMQBuffers.dynamicBuffer(bytes.length).byteBuf();
}
// expand the buffer
@@ -67,6 +67,12 @@ class NullStorageLargeServerMessage extends ServerMessageImpl implements LargeSe
}
@Override
+ public boolean isServerMessage() {
+ return true;
+ }
+
+
+ @Override
public synchronized int getEncodeSize() {
return getHeadersAndPropertiesEncodeSize();
}
@@ -77,7 +83,7 @@ class NullStorageLargeServerMessage extends ServerMessageImpl implements LargeSe
}
@Override
- public ServerMessage copy() {
+ public Message copy() {
// This is a simple copy, used only to avoid changing original properties
return new NullStorageLargeServerMessage(this);
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/nullpm/NullStorageManager.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/nullpm/NullStorageManager.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/nullpm/NullStorageManager.java
index 2154879..2c297d9 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/nullpm/NullStorageManager.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/persistence/impl/nullpm/NullStorageManager.java
@@ -25,6 +25,7 @@ import java.util.Set;
import java.util.concurrent.Executor;
import java.util.concurrent.atomic.AtomicLong;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.Pair;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.io.IOCallback;
@@ -32,7 +33,6 @@ import org.apache.activemq.artemis.core.io.IOCriticalErrorListener;
import org.apache.activemq.artemis.core.io.SequentialFile;
import org.apache.activemq.artemis.core.journal.Journal;
import org.apache.activemq.artemis.core.journal.JournalLoadInformation;
-import org.apache.activemq.artemis.core.message.impl.MessageInternal;
import org.apache.activemq.artemis.core.paging.PageTransactionInfo;
import org.apache.activemq.artemis.core.paging.PagedMessage;
import org.apache.activemq.artemis.core.paging.PagingManager;
@@ -53,7 +53,6 @@ import org.apache.activemq.artemis.core.replication.ReplicationManager;
import org.apache.activemq.artemis.core.server.LargeServerMessage;
import org.apache.activemq.artemis.core.server.MessageReference;
import org.apache.activemq.artemis.core.server.RouteContextList;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.files.FileStoreMonitor;
import org.apache.activemq.artemis.core.server.group.impl.GroupBinding;
import org.apache.activemq.artemis.core.server.impl.AddressInfo;
@@ -214,11 +213,11 @@ public class NullStorageManager implements StorageManager {
}
@Override
- public void storeMessage(final ServerMessage message) throws Exception {
+ public void storeMessage(final Message message) throws Exception {
}
@Override
- public void storeMessageTransactional(final long txID, final ServerMessage message) throws Exception {
+ public void storeMessageTransactional(final long txID, final Message message) throws Exception {
}
@Override
@@ -274,7 +273,7 @@ public class NullStorageManager implements StorageManager {
}
@Override
- public LargeServerMessage createLargeMessage(final long id, final MessageInternal message) {
+ public LargeServerMessage createLargeMessage(final long id, final Message message) {
NullStorageLargeServerMessage largeMessage = new NullStorageLargeServerMessage();
largeMessage.copyHeadersAndProperties(message);
@@ -464,10 +463,6 @@ public class NullStorageManager implements StorageManager {
}
@Override
- public void updatePageTransaction(final PageTransactionInfo pageTransaction, final int depage) throws Exception {
- }
-
- @Override
public long storePageCounter(final long txID, final long queueID, final long value) throws Exception {
return 0;
}
@@ -543,7 +538,7 @@ public class NullStorageManager implements StorageManager {
@Override
public boolean addToPage(PagingStore store,
- ServerMessage msg,
+ Message msg,
Transaction tx,
RouteContextList listCtx) throws Exception {
/**
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/Binding.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/Binding.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/Binding.java
index 4c6763d..f1e83d2 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/Binding.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/Binding.java
@@ -16,11 +16,12 @@
*/
package org.apache.activemq.artemis.core.postoffice;
+
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.filter.Filter;
import org.apache.activemq.artemis.core.server.Bindable;
import org.apache.activemq.artemis.core.server.RoutingContext;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.group.UnproposalListener;
public interface Binding extends UnproposalListener {
@@ -39,7 +40,7 @@ public interface Binding extends UnproposalListener {
Filter getFilter();
- boolean isHighAcceptPriority(ServerMessage message);
+ boolean isHighAcceptPriority(Message message);
boolean isExclusive();
@@ -47,9 +48,9 @@ public interface Binding extends UnproposalListener {
int getDistance();
- void route(ServerMessage message, RoutingContext context) throws Exception;
+ void route(Message message, RoutingContext context) throws Exception;
- void routeWithAck(ServerMessage message, RoutingContext context) throws Exception;
+ void routeWithAck(Message message, RoutingContext context) throws Exception;
void close() throws Exception;
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/Bindings.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/Bindings.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/Bindings.java
index b79f1da..1d335ad 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/Bindings.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/Bindings.java
@@ -18,9 +18,9 @@ package org.apache.activemq.artemis.core.postoffice;
import java.util.Collection;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.core.server.Queue;
import org.apache.activemq.artemis.core.server.RoutingContext;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.cluster.impl.MessageLoadBalancingType;
import org.apache.activemq.artemis.core.server.group.UnproposalListener;
@@ -34,7 +34,7 @@ public interface Bindings extends UnproposalListener {
void setMessageLoadBalancingType(MessageLoadBalancingType messageLoadBalancingType);
- boolean redistribute(ServerMessage message, Queue originatingQueue, RoutingContext context) throws Exception;
+ boolean redistribute(Message message, Queue originatingQueue, RoutingContext context) throws Exception;
- void route(ServerMessage message, RoutingContext context) throws Exception;
+ void route(Message message, RoutingContext context) throws Exception;
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/PostOffice.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/PostOffice.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/PostOffice.java
index 7b8ce18..f682777 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/PostOffice.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/PostOffice.java
@@ -21,6 +21,7 @@ import java.util.List;
import java.util.Map;
import java.util.Set;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.Pair;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.server.ActiveMQComponent;
@@ -28,7 +29,6 @@ import org.apache.activemq.artemis.core.server.MessageReference;
import org.apache.activemq.artemis.core.server.Queue;
import org.apache.activemq.artemis.core.server.RoutingContext;
import org.apache.activemq.artemis.api.core.RoutingType;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.impl.AddressInfo;
import org.apache.activemq.artemis.core.transaction.Transaction;
@@ -96,33 +96,33 @@ public interface PostOffice extends ActiveMQComponent {
SimpleString getMatchingQueue(SimpleString address, SimpleString queueName, RoutingType routingType) throws Exception;
- RoutingStatus route(ServerMessage message, boolean direct) throws Exception;
+ RoutingStatus route(Message message, boolean direct) throws Exception;
- RoutingStatus route(ServerMessage message,
+ RoutingStatus route(Message message,
Transaction tx,
boolean direct) throws Exception;
- RoutingStatus route(ServerMessage message,
+ RoutingStatus route(Message message,
Transaction tx,
boolean direct,
boolean rejectDuplicates) throws Exception;
- RoutingStatus route(ServerMessage message,
+ RoutingStatus route(Message message,
RoutingContext context,
boolean direct) throws Exception;
- RoutingStatus route(ServerMessage message,
+ RoutingStatus route(Message message,
RoutingContext context,
boolean direct,
boolean rejectDuplicates) throws Exception;
- MessageReference reroute(ServerMessage message, Queue queue, Transaction tx) throws Exception;
+ MessageReference reroute(Message message, Queue queue, Transaction tx) throws Exception;
- Pair<RoutingContext, ServerMessage> redistribute(ServerMessage message,
+ Pair<RoutingContext, Message> redistribute(Message message,
final Queue originatingQueue,
Transaction tx) throws Exception;
- void processRoute(final ServerMessage message, final RoutingContext context, final boolean direct) throws Exception;
+ void processRoute(final Message message, final RoutingContext context, final boolean direct) throws Exception;
DuplicateIDCache getDuplicateIDCache(SimpleString address);
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/BindingsImpl.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/BindingsImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/BindingsImpl.java
index 6be0311..2de97e2 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/BindingsImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/BindingsImpl.java
@@ -30,14 +30,12 @@ import java.util.concurrent.CopyOnWriteArrayList;
import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.filter.Filter;
-import org.apache.activemq.artemis.core.message.impl.MessageImpl;
import org.apache.activemq.artemis.core.paging.PagingStore;
import org.apache.activemq.artemis.core.postoffice.Binding;
import org.apache.activemq.artemis.core.postoffice.Bindings;
import org.apache.activemq.artemis.core.server.ActiveMQServerLogger;
import org.apache.activemq.artemis.core.server.Queue;
import org.apache.activemq.artemis.core.server.RoutingContext;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.cluster.RemoteQueueBinding;
import org.apache.activemq.artemis.core.server.cluster.impl.MessageLoadBalancingType;
import org.apache.activemq.artemis.core.server.group.GroupingHandler;
@@ -152,7 +150,7 @@ public final class BindingsImpl implements Bindings {
}
@Override
- public boolean redistribute(final ServerMessage message,
+ public boolean redistribute(final Message message,
final Queue originatingQueue,
final RoutingContext context) throws Exception {
if (messageLoadBalancingType.equals(MessageLoadBalancingType.STRICT) || messageLoadBalancingType.equals(MessageLoadBalancingType.OFF)) {
@@ -230,18 +228,18 @@ public final class BindingsImpl implements Bindings {
}
@Override
- public void route(final ServerMessage message, final RoutingContext context) throws Exception {
+ public void route(final Message message, final RoutingContext context) throws Exception {
route(message, context, true);
}
- private void route(final ServerMessage message,
+ private void route(final Message message,
final RoutingContext context,
final boolean groupRouting) throws Exception {
/* This is a special treatment for scaled-down messages involving SnF queues.
* See org.apache.activemq.artemis.core.server.impl.ScaleDownHandler.scaleDownMessages() for the logic that sends messages with this property
*/
- if (message.containsProperty(MessageImpl.HDR_SCALEDOWN_TO_IDS)) {
- byte[] ids = (byte[]) message.removeProperty(MessageImpl.HDR_SCALEDOWN_TO_IDS);
+ if (message.containsProperty(Message.HDR_SCALEDOWN_TO_IDS)) {
+ byte[] ids = (byte[]) message.removeProperty(Message.HDR_SCALEDOWN_TO_IDS);
if (ids != null) {
ByteBuffer buffer = ByteBuffer.wrap(ids);
@@ -251,7 +249,7 @@ public final class BindingsImpl implements Bindings {
if (entry.getValue() instanceof RemoteQueueBinding) {
RemoteQueueBinding remoteQueueBinding = (RemoteQueueBinding) entry.getValue();
if (remoteQueueBinding.getRemoteQueueID() == id) {
- message.putBytesProperty(MessageImpl.HDR_ROUTE_TO_IDS, ByteBuffer.allocate(8).putLong(remoteQueueBinding.getID()).array());
+ message.putBytesProperty(Message.HDR_ROUTE_TO_IDS, ByteBuffer.allocate(8).putLong(remoteQueueBinding.getID()).array());
}
}
}
@@ -272,7 +270,7 @@ public final class BindingsImpl implements Bindings {
if (!routed) {
// Remove the ids now, in order to avoid double check
- byte[] ids = (byte[]) message.removeProperty(MessageImpl.HDR_ROUTE_TO_IDS);
+ byte[] ids = (byte[]) message.removeProperty(Message.HDR_ROUTE_TO_IDS);
// Fetch the groupId now, in order to avoid double checking
SimpleString groupId = message.getSimpleStringProperty(Message.HDR_GROUP_ID);
@@ -319,7 +317,7 @@ public final class BindingsImpl implements Bindings {
* these two servers. This will eventually send more messages to one server than the other
* (depending if you are using multi-thread), and not lose messages.
*/
- private Binding getNextBinding(final ServerMessage message,
+ private Binding getNextBinding(final Message message,
final SimpleString routingName,
final List<Binding> bindings) {
Integer ipos = routingNamePositions.get(routingName);
@@ -407,7 +405,7 @@ public final class BindingsImpl implements Bindings {
return theBinding;
}
- private void routeUsingStrictOrdering(final ServerMessage message,
+ private void routeUsingStrictOrdering(final Message message,
final RoutingContext context,
final GroupingHandler groupingGroupingHandler,
final SimpleString groupId,
@@ -473,7 +471,7 @@ public final class BindingsImpl implements Bindings {
return null;
}
- private void routeAndCheckNull(ServerMessage message,
+ private void routeAndCheckNull(Message message,
RoutingContext context,
Response resp,
Binding theBinding,
@@ -552,10 +550,10 @@ public final class BindingsImpl implements Bindings {
return writer.toString();
}
- private void routeFromCluster(final ServerMessage message,
+ private void routeFromCluster(final Message message,
final RoutingContext context,
final byte[] ids) throws Exception {
- byte[] idsToAck = (byte[]) message.removeProperty(MessageImpl.HDR_ROUTE_TO_ACK_IDS);
+ byte[] idsToAck = (byte[]) message.removeProperty(Message.HDR_ROUTE_TO_ACK_IDS);
List<Long> idsToAckList = new ArrayList<>();
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/DivertBinding.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/DivertBinding.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/DivertBinding.java
index 04f432d..8f4ab48 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/DivertBinding.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/DivertBinding.java
@@ -16,6 +16,7 @@
*/
package org.apache.activemq.artemis.core.postoffice.impl;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.filter.Filter;
import org.apache.activemq.artemis.core.postoffice.Binding;
@@ -23,7 +24,6 @@ import org.apache.activemq.artemis.core.postoffice.BindingType;
import org.apache.activemq.artemis.core.server.Bindable;
import org.apache.activemq.artemis.core.server.Divert;
import org.apache.activemq.artemis.core.server.RoutingContext;
-import org.apache.activemq.artemis.core.server.ServerMessage;
public class DivertBinding implements Binding {
@@ -98,12 +98,12 @@ public class DivertBinding implements Binding {
}
@Override
- public boolean isHighAcceptPriority(final ServerMessage message) {
+ public boolean isHighAcceptPriority(final Message message) {
return true;
}
@Override
- public void route(final ServerMessage message, final RoutingContext context) throws Exception {
+ public void route(final Message message, final RoutingContext context) throws Exception {
divert.route(message, context);
}
@@ -150,7 +150,7 @@ public class DivertBinding implements Binding {
}
@Override
- public void routeWithAck(ServerMessage message, RoutingContext context) {
+ public void routeWithAck(Message message, RoutingContext context) {
//noop
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/LocalQueueBinding.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/LocalQueueBinding.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/LocalQueueBinding.java
index af49c4d..176d614 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/LocalQueueBinding.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/postoffice/impl/LocalQueueBinding.java
@@ -16,6 +16,7 @@
*/
package org.apache.activemq.artemis.core.postoffice.impl;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.filter.Filter;
import org.apache.activemq.artemis.core.postoffice.BindingType;
@@ -24,7 +25,6 @@ import org.apache.activemq.artemis.core.server.Bindable;
import org.apache.activemq.artemis.core.server.Queue;
import org.apache.activemq.artemis.core.server.RoutingContext;
import org.apache.activemq.artemis.api.core.RoutingType;
-import org.apache.activemq.artemis.core.server.ServerMessage;
public class LocalQueueBinding implements QueueBinding {
@@ -104,7 +104,7 @@ public class LocalQueueBinding implements QueueBinding {
}
@Override
- public boolean isHighAcceptPriority(final ServerMessage message) {
+ public boolean isHighAcceptPriority(final Message message) {
// It's a high accept priority if the queue has at least one matching consumer
return queue.hasMatchingConsumer(message);
@@ -116,14 +116,14 @@ public class LocalQueueBinding implements QueueBinding {
}
@Override
- public void route(final ServerMessage message, final RoutingContext context) throws Exception {
+ public void route(final Message message, final RoutingContext context) throws Exception {
if (isMatchRoutingType(context)) {
queue.route(message, context);
}
}
@Override
- public void routeWithAck(ServerMessage message, RoutingContext context) throws Exception {
+ public void routeWithAck(Message message, RoutingContext context) throws Exception {
if (isMatchRoutingType(context)) {
queue.routeWithAck(message, context);
}
[17/17] activemq-artemis git commit: Fixing that will be needed from
Martyn and Justin
Posted by cl...@apache.org.
Fixing that will be needed from Martyn and Justin
Project: http://git-wip-us.apache.org/repos/asf/activemq-artemis/repo
Commit: http://git-wip-us.apache.org/repos/asf/activemq-artemis/commit/0a7eee6f
Tree: http://git-wip-us.apache.org/repos/asf/activemq-artemis/tree/0a7eee6f
Diff: http://git-wip-us.apache.org/repos/asf/activemq-artemis/diff/0a7eee6f
Branch: refs/heads/artemis-1009
Commit: 0a7eee6f56a2e402647808c91a04eab6277571df
Parents: 4894015
Author: Clebert Suconic <cl...@apache.org>
Authored: Sun Mar 5 11:34:19 2017 -0500
Committer: Clebert Suconic <cl...@apache.org>
Committed: Sun Mar 5 11:49:43 2017 -0500
----------------------------------------------------------------------
.../activemq/artemis/protocol/amqp/broker/AMQPMessage.java | 6 +++++-
.../artemis/protocol/amqp/broker/AMQPSessionCallback.java | 1 +
.../activemq/artemis/core/server/impl/ServerSessionImpl.java | 3 ++-
3 files changed, 8 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/0a7eee6f/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPMessage.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPMessage.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPMessage.java
index 40c041d..12218f8 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPMessage.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPMessage.java
@@ -189,6 +189,7 @@ public class AMQPMessage extends RefCountMessage {
@Override
public RoutingType getRouteType() {
+ /* TODO-now @Martyn or @Justin:
switch (((Byte)type).byteValue()) {
case AMQPMessageSupport.QUEUE_TYPE:
case AMQPMessageSupport.TEMP_QUEUE_TYPE:
@@ -199,7 +200,10 @@ public class AMQPMessage extends RefCountMessage {
return RoutingType.MULTICAST;
default:
return null;
- }
+ } */
+
+
+ return null;
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/0a7eee6f/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPSessionCallback.java
----------------------------------------------------------------------
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 5fc2209..5931afe 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
@@ -40,6 +40,7 @@ import org.apache.activemq.artemis.core.server.impl.AddressInfo;
import org.apache.activemq.artemis.core.server.impl.ServerConsumerImpl;
import org.apache.activemq.artemis.core.transaction.Transaction;
import org.apache.activemq.artemis.jms.client.ActiveMQConnection;
+import org.apache.activemq.artemis.protocol.amqp.converter.CoreAmqpConverter;
import org.apache.activemq.artemis.protocol.amqp.exceptions.ActiveMQAMQPException;
import org.apache.activemq.artemis.protocol.amqp.exceptions.ActiveMQAMQPInternalErrorException;
import org.apache.activemq.artemis.protocol.amqp.exceptions.ActiveMQAMQPResourceLimitExceededException;
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/0a7eee6f/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerSessionImpl.java
----------------------------------------------------------------------
diff --git a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerSessionImpl.java b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerSessionImpl.java
index 1cd19bb..a85afe6 100644
--- a/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerSessionImpl.java
+++ b/artemis-server/src/main/java/org/apache/activemq/artemis/core/server/impl/ServerSessionImpl.java
@@ -1629,13 +1629,14 @@ public class ServerSessionImpl implements ServerSession, FailureListener {
RoutingType routingType = msg.getRouteType();
+ /* TODO-now: @Martyn or @Justin
if (originalAddress != null) {
if (originalAddress.toString().startsWith("anycast:")) {
routingType = RoutingType.ANYCAST;
} else if (originalAddress.toString().startsWith("multicast:")) {
routingType = RoutingType.MULTICAST;
}
- }
+ } */
Pair<SimpleString, RoutingType> art = getAddressAndRoutingType(msg.getAddressSimpleString(), routingType);
[13/17] activemq-artemis git commit: ARTEMIS-1009 Pure Message
Encoding.
Posted by cl...@apache.org.
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/SessionReceiveMessage.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/SessionReceiveMessage.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/SessionReceiveMessage.java
index c21ebda..b0ab52b 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/SessionReceiveMessage.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/SessionReceiveMessage.java
@@ -17,7 +17,8 @@
package org.apache.activemq.artemis.core.protocol.core.impl.wireformat;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
-import org.apache.activemq.artemis.core.message.impl.MessageInternal;
+import org.apache.activemq.artemis.api.core.ICoreMessage;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
import org.apache.activemq.artemis.utils.DataConstants;
@@ -30,7 +31,7 @@ public class SessionReceiveMessage extends MessagePacket {
private int deliveryCount;
- public SessionReceiveMessage(final long consumerID, final MessageInternal message, final int deliveryCount) {
+ public SessionReceiveMessage(final long consumerID, final ICoreMessage message, final int deliveryCount) {
super(SESS_RECEIVE_MSG, message);
this.consumerID = consumerID;
@@ -38,7 +39,7 @@ public class SessionReceiveMessage extends MessagePacket {
this.deliveryCount = deliveryCount;
}
- public SessionReceiveMessage(final MessageInternal message) {
+ public SessionReceiveMessage(final CoreMessage message) {
super(SESS_RECEIVE_MSG, message);
}
@@ -53,53 +54,28 @@ public class SessionReceiveMessage extends MessagePacket {
}
@Override
- public ActiveMQBuffer encode(final RemotingConnection connection) {
- ActiveMQBuffer buffer = message.getEncodedBuffer();
-
- ActiveMQBuffer bufferWrite = connection.createTransportBuffer(buffer.writerIndex() + DataConstants.SIZE_LONG + DataConstants.SIZE_INT, true);
- bufferWrite.writeBytes(buffer, 0, buffer.capacity());
- bufferWrite.setIndex(buffer.readerIndex(), buffer.writerIndex());
-
- // Sanity check
- if (bufferWrite.writerIndex() != message.getEndOfMessagePosition()) {
- throw new IllegalStateException("Wrong encode position");
- }
-
- bufferWrite.writeLong(consumerID);
- bufferWrite.writeInt(deliveryCount);
-
- size = bufferWrite.writerIndex();
-
- // Write standard headers
-
- int len = size - DataConstants.SIZE_INT;
- bufferWrite.setInt(0, len);
- bufferWrite.setByte(DataConstants.SIZE_INT, getType());
- bufferWrite.setLong(DataConstants.SIZE_INT + DataConstants.SIZE_BYTE, channelID);
-
- // Position reader for reading by Netty
- bufferWrite.setIndex(0, size);
-
- return bufferWrite;
+ protected ActiveMQBuffer createPacket(RemotingConnection connection, boolean usePooled) {
+ return internalCreatePacket(message.getEncodeSize() + PACKET_HEADERS_SIZE + DataConstants.SIZE_LONG + DataConstants.SIZE_INT, connection, usePooled);
}
@Override
- public void decode(final ActiveMQBuffer buffer) {
- channelID = buffer.readLong();
-
- message.decodeFromBuffer(buffer);
-
- consumerID = buffer.readLong();
+ public void encodeRest(ActiveMQBuffer buffer) {
+ message.sendBuffer(buffer.byteBuf(), deliveryCount);
+ buffer.writeLong(consumerID);
+ buffer.writeInt(deliveryCount);
+ }
- deliveryCount = buffer.readInt();
+ @Override
+ public void decodeRest(final ActiveMQBuffer buffer) {
+ // Buffer comes in after having read standard headers and positioned at Beginning of body part
- size = buffer.readerIndex();
+ message.receiveBuffer(copyMessageBuffer(buffer.byteBuf(), DataConstants.SIZE_LONG + DataConstants.SIZE_INT));
- // Need to position buffer for reading
+ buffer.readerIndex(buffer.capacity() - DataConstants.SIZE_LONG - DataConstants.SIZE_INT);
+ this.consumerID = buffer.readLong();
+ this.deliveryCount = buffer.readInt();
- buffer.setIndex(PACKET_HEADERS_SIZE + DataConstants.SIZE_INT, message.getEndOfBodyPosition());
}
-
@Override
public int hashCode() {
final int prime = 31;
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/SessionSendContinuationMessage.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/SessionSendContinuationMessage.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/SessionSendContinuationMessage.java
index b4ec027..0ecfe33 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/SessionSendContinuationMessage.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/SessionSendContinuationMessage.java
@@ -17,8 +17,8 @@
package org.apache.activemq.artemis.core.protocol.core.impl.wireformat;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.client.SendAcknowledgementHandler;
-import org.apache.activemq.artemis.core.message.impl.MessageInternal;
/**
* A SessionSendContinuationMessage<br>
@@ -28,7 +28,7 @@ public class SessionSendContinuationMessage extends SessionContinuationMessage {
private boolean requiresResponse;
// Used on confirmation handling
- private MessageInternal message;
+ private Message message;
/**
* In case, we are using a different handler than the one set on the {@link org.apache.activemq.artemis.api.core.client.ClientSession}
* <br>
@@ -58,7 +58,7 @@ public class SessionSendContinuationMessage extends SessionContinuationMessage {
* @param continues
* @param requiresResponse
*/
- public SessionSendContinuationMessage(final MessageInternal message,
+ public SessionSendContinuationMessage(final Message message,
final byte[] body,
final boolean continues,
final boolean requiresResponse,
@@ -87,7 +87,7 @@ public class SessionSendContinuationMessage extends SessionContinuationMessage {
/**
* @return the message
*/
- public MessageInternal getMessage() {
+ public Message getMessage() {
return message;
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/SessionSendLargeMessage.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/SessionSendLargeMessage.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/SessionSendLargeMessage.java
index bf4290b..869940c 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/SessionSendLargeMessage.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/SessionSendLargeMessage.java
@@ -18,7 +18,7 @@ package org.apache.activemq.artemis.core.protocol.core.impl.wireformat;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
import org.apache.activemq.artemis.api.core.Message;
-import org.apache.activemq.artemis.core.message.impl.MessageInternal;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import org.apache.activemq.artemis.core.protocol.core.impl.PacketImpl;
public class SessionSendLargeMessage extends PacketImpl implements MessagePacketI {
@@ -26,13 +26,13 @@ public class SessionSendLargeMessage extends PacketImpl implements MessagePacket
/**
* Used only if largeMessage
*/
- private final MessageInternal largeMessage;
+ private final Message largeMessage;
// Static --------------------------------------------------------
// Constructors --------------------------------------------------
- public SessionSendLargeMessage(final MessageInternal largeMessage) {
+ public SessionSendLargeMessage(final Message largeMessage) {
super(SESS_SEND_LARGE);
this.largeMessage = largeMessage;
@@ -40,7 +40,7 @@ public class SessionSendLargeMessage extends PacketImpl implements MessagePacket
// Public --------------------------------------------------------
- public MessageInternal getLargeMessage() {
+ public Message getLargeMessage() {
return largeMessage;
}
@@ -51,12 +51,12 @@ public class SessionSendLargeMessage extends PacketImpl implements MessagePacket
@Override
public void encodeRest(final ActiveMQBuffer buffer) {
- largeMessage.encodeHeadersAndProperties(buffer);
+ ((CoreMessage)largeMessage).encodeHeadersAndProperties(buffer.byteBuf());
}
@Override
public void decodeRest(final ActiveMQBuffer buffer) {
- largeMessage.decodeHeadersAndProperties(buffer);
+ ((CoreMessage)largeMessage).decodeHeadersAndProperties(buffer.byteBuf());
}
@Override
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/SessionSendMessage.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/SessionSendMessage.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/SessionSendMessage.java
index c7bb30e..43bb0be 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/SessionSendMessage.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/protocol/core/impl/wireformat/SessionSendMessage.java
@@ -16,11 +16,12 @@
*/
package org.apache.activemq.artemis.core.protocol.core.impl.wireformat;
+import io.netty.buffer.ByteBuf;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
+import org.apache.activemq.artemis.api.core.ICoreMessage;
import org.apache.activemq.artemis.api.core.client.SendAcknowledgementHandler;
-import org.apache.activemq.artemis.core.message.impl.MessageInternal;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
-import org.apache.activemq.artemis.utils.DataConstants;
public class SessionSendMessage extends MessagePacket {
@@ -36,7 +37,8 @@ public class SessionSendMessage extends MessagePacket {
*/
private final transient SendAcknowledgementHandler handler;
- public SessionSendMessage(final MessageInternal message,
+ /** This will be using the CoreMessage because it is meant for the core-protocol */
+ public SessionSendMessage(final ICoreMessage message,
final boolean requiresResponse,
final SendAcknowledgementHandler handler) {
super(SESS_SEND, message);
@@ -44,7 +46,7 @@ public class SessionSendMessage extends MessagePacket {
this.requiresResponse = requiresResponse;
}
- public SessionSendMessage(final MessageInternal message) {
+ public SessionSendMessage(final CoreMessage message) {
super(SESS_SEND, message);
this.handler = null;
}
@@ -60,53 +62,29 @@ public class SessionSendMessage extends MessagePacket {
}
@Override
- public ActiveMQBuffer encode(final RemotingConnection connection) {
- ActiveMQBuffer buffer = message.getEncodedBuffer();
-
- ActiveMQBuffer bufferWrite;
- if (connection == null) {
- // this is for unit tests only
- bufferWrite = buffer.copy(0, buffer.capacity());
- } else {
- bufferWrite = connection.createTransportBuffer(buffer.writerIndex() + 1, true); // 1 for the requireResponse
- }
- bufferWrite.writeBytes(buffer, 0, buffer.writerIndex());
- bufferWrite.setIndex(buffer.readerIndex(), buffer.writerIndex());
-
- // Sanity check
- if (bufferWrite.writerIndex() != message.getEndOfMessagePosition()) {
- throw new IllegalStateException("Wrong encode position");
- }
-
- bufferWrite.writeBoolean(requiresResponse);
-
- size = bufferWrite.writerIndex();
-
- // Write standard headers
+ protected ActiveMQBuffer createPacket(RemotingConnection connection, boolean usePooled) {
+ return internalCreatePacket(message.getEncodeSize() + PACKET_HEADERS_SIZE + 1, connection, usePooled);
+ }
- int len = size - DataConstants.SIZE_INT;
- bufferWrite.setInt(0, len);
- bufferWrite.setByte(DataConstants.SIZE_INT, getType());
- bufferWrite.setLong(DataConstants.SIZE_INT + DataConstants.SIZE_BYTE, channelID);
+ @Override
+ public void encodeRest(ActiveMQBuffer buffer) {
+ message.sendBuffer(buffer.byteBuf(), 0);
+ buffer.writeBoolean(requiresResponse);
- // Position reader for reading by Netty
- bufferWrite.readerIndex(0);
- return bufferWrite;
}
@Override
public void decodeRest(final ActiveMQBuffer buffer) {
// Buffer comes in after having read standard headers and positioned at Beginning of body part
- message.decodeFromBuffer(buffer);
+ ByteBuf messageBuffer = copyMessageBuffer(buffer.byteBuf(), 1);
+ message.receiveBuffer(messageBuffer);
- int ri = buffer.readerIndex();
+ buffer.readerIndex(buffer.capacity() - 1);
requiresResponse = buffer.readBoolean();
- buffer.readerIndex(ri);
-
}
@Override
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/reader/MapMessageUtil.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/reader/MapMessageUtil.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/reader/MapMessageUtil.java
index 65aeccb..8560f5d 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/reader/MapMessageUtil.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/reader/MapMessageUtil.java
@@ -26,7 +26,7 @@ public class MapMessageUtil extends MessageUtil {
*/
public static void writeBodyMap(ActiveMQBuffer message, TypedProperties properties) {
message.resetWriterIndex();
- properties.encode(message);
+ properties.encode(message.byteBuf());
}
/**
@@ -43,7 +43,7 @@ public class MapMessageUtil extends MessageUtil {
*/
public static void readBodyMap(ActiveMQBuffer message, TypedProperties map) {
message.resetReaderIndex();
- map.decode(message);
+ map.decode(message.byteBuf());
}
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/spi/core/remoting/SessionContext.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/spi/core/remoting/SessionContext.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/spi/core/remoting/SessionContext.java
index 72795b7..3fddb8e 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/spi/core/remoting/SessionContext.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/spi/core/remoting/SessionContext.java
@@ -23,7 +23,9 @@ import java.util.Set;
import java.util.concurrent.Executor;
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.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.ClientSession;
@@ -33,8 +35,6 @@ import org.apache.activemq.artemis.core.client.impl.ClientLargeMessageInternal;
import org.apache.activemq.artemis.core.client.impl.ClientMessageInternal;
import org.apache.activemq.artemis.core.client.impl.ClientProducerCreditsImpl;
import org.apache.activemq.artemis.core.client.impl.ClientSessionInternal;
-import org.apache.activemq.artemis.core.message.impl.MessageInternal;
-import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
import org.apache.activemq.artemis.utils.IDGenerator;
import org.apache.activemq.artemis.utils.SimpleIDGenerator;
@@ -128,9 +128,9 @@ public abstract class SessionContext {
}
- public abstract int getCreditsOnSendingFull(MessageInternal msgI);
+ public abstract int getCreditsOnSendingFull(Message msgI);
- public abstract void sendFullMessage(MessageInternal msgI,
+ public abstract void sendFullMessage(ICoreMessage msgI,
boolean sendBlocking,
SendAcknowledgementHandler handler,
SimpleString defaultAddress) throws ActiveMQException;
@@ -142,9 +142,9 @@ public abstract class SessionContext {
* @return
* @throws ActiveMQException
*/
- public abstract int sendInitialChunkOnLargeMessage(MessageInternal msgI) throws ActiveMQException;
+ public abstract int sendInitialChunkOnLargeMessage(Message msgI) throws ActiveMQException;
- public abstract int sendLargeMessageChunk(MessageInternal msgI,
+ public abstract int sendLargeMessageChunk(Message msgI,
long messageBodySize,
boolean sendBlocking,
boolean lastChunk,
@@ -152,7 +152,7 @@ public abstract class SessionContext {
int reconnectID,
SendAcknowledgementHandler messageHandler) throws ActiveMQException;
- public abstract int sendServerLargeMessageChunk(MessageInternal msgI,
+ public abstract int sendServerLargeMessageChunk(Message msgI,
long messageBodySize,
boolean sendBlocking,
boolean lastChunk,
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/test/java/org/apache/activemq/artemis/message/CoreMessageTest.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/test/java/org/apache/activemq/artemis/message/CoreMessageTest.java b/artemis-core-client/src/test/java/org/apache/activemq/artemis/message/CoreMessageTest.java
new file mode 100644
index 0000000..5e92eaf
--- /dev/null
+++ b/artemis-core-client/src/test/java/org/apache/activemq/artemis/message/CoreMessageTest.java
@@ -0,0 +1,365 @@
+/**
+ * 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.message;
+
+import java.util.LinkedList;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.Unpooled;
+import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
+import org.apache.activemq.artemis.api.core.ActiveMQBuffers;
+import org.apache.activemq.artemis.api.core.Message;
+import org.apache.activemq.artemis.api.core.SimpleString;
+import org.apache.activemq.artemis.core.client.impl.ClientMessageImpl;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
+import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionReceiveMessage;
+import org.apache.activemq.artemis.core.protocol.core.impl.wireformat.SessionSendMessage;
+import org.apache.activemq.artemis.reader.TextMessageUtil;
+import org.apache.activemq.artemis.utils.Base64;
+import org.apache.activemq.artemis.utils.ByteUtil;
+import org.apache.activemq.artemis.utils.UUID;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class CoreMessageTest {
+
+ public static final SimpleString ADDRESS = new SimpleString("this.local.address");
+ public static final byte MESSAGE_TYPE = Message.TEXT_TYPE;
+ public static final boolean DURABLE = true;
+ public static final long EXPIRATION = 123L;
+ public static final long TIMESTAMP = 321L;
+ public static final byte PRIORITY = (byte) 3;
+ public static final String TEXT = "hi";
+ public static final String BIGGER_TEXT = "AAAAAAAAAAAAAAAAAAAAAAAAA ASDF ASDF ASF ASD ASF ASDF ASDF ASDF ASF ADSF ASDF";
+ public static final String SMALLER_TEXT = "H";
+ public static final UUID uuid = new UUID(UUID.TYPE_TIME_BASED, new byte[]{0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 0,
+ 0, 0, 0, 1});
+ public static final SimpleString PROP1_NAME = new SimpleString("t1");
+ public static final SimpleString PROP1_VALUE = new SimpleString("value-t1");
+
+ /**
+ * This encode was generated by {@link #generate()}.
+ * Run it manually with a right-click on the IDE to eventually update it
+ * */
+ // body = "hi";
+ private final String STRING_ENCODE = "AAAAFgEAAAAEaABpAAAAAAAAAAAAAQAAACR0AGgAaQBzAC4AbABvAGMAYQBsAC4AYQBkAGQAcgBlAHMAcwAAAwEAAAAAAAAAewAAAAAAAAFBAwEAAAABAAAABHQAMQAKAAAAEHYAYQBsAHUAZQAtAHQAMQA=";
+
+ private ByteBuf BYTE_ENCODE;
+
+
+ @Before
+ public void before() {
+ BYTE_ENCODE = Unpooled.wrappedBuffer(Base64.decode(STRING_ENCODE, Base64.DONT_BREAK_LINES | Base64.URL_SAFE));
+ // some extra caution here, nothing else, to make sure we would get the same encoding back
+ Assert.assertEquals(STRING_ENCODE, encodeString(BYTE_ENCODE.array()));
+ BYTE_ENCODE.readerIndex(0).writerIndex(BYTE_ENCODE.capacity());
+ }
+
+ /** The message is received, then sent to the other side untouched */
+ @Test
+ public void testPassThrough() {
+ CoreMessage decodedMessage = decodeMessage();
+
+ Assert.assertEquals(TEXT, TextMessageUtil.readBodyText(decodedMessage.getReadOnlyBodyBuffer()).toString());
+ }
+
+ /** The message is received, then sent to the other side untouched */
+ @Test
+ public void sendThroughPackets() {
+ CoreMessage decodedMessage = decodeMessage();
+
+ int encodeSize = decodedMessage.getEncodeSize();
+ Assert.assertEquals(BYTE_ENCODE.capacity(), encodeSize);
+
+ SessionSendMessage sendMessage = new SessionSendMessage(decodedMessage, true, null);
+ sendMessage.setChannelID(777);
+
+ ActiveMQBuffer buffer = sendMessage.encode(null);
+
+ byte[] byteArray = buffer.byteBuf().array();
+ System.out.println("Sending " + ByteUtil.bytesToHex(buffer.toByteBuffer().array(), 1) + ", bytes = " + byteArray.length);
+
+ buffer.readerIndex(5);
+
+ SessionSendMessage sendMessageReceivedSent = new SessionSendMessage(new CoreMessage());
+
+ sendMessageReceivedSent.decode(buffer);
+
+ Assert.assertEquals(encodeSize, sendMessageReceivedSent.getMessage().getEncodeSize());
+
+ Assert.assertTrue(sendMessageReceivedSent.isRequiresResponse());
+
+ Assert.assertEquals(TEXT, TextMessageUtil.readBodyText(sendMessageReceivedSent.getMessage().getReadOnlyBodyBuffer()).toString());
+ }
+
+ /** The message is received, then sent to the other side untouched */
+ @Test
+ public void sendThroughPacketsClient() {
+ CoreMessage decodedMessage = decodeMessage();
+
+ int encodeSize = decodedMessage.getEncodeSize();
+ Assert.assertEquals(BYTE_ENCODE.capacity(), encodeSize);
+
+ SessionReceiveMessage sendMessage = new SessionReceiveMessage(33, decodedMessage, 7);
+ sendMessage.setChannelID(777);
+
+ ActiveMQBuffer buffer = sendMessage.encode(null);
+
+ buffer.readerIndex(5);
+
+ SessionReceiveMessage sendMessageReceivedSent = new SessionReceiveMessage(new CoreMessage());
+
+ sendMessageReceivedSent.decode(buffer);
+
+ Assert.assertEquals(33, sendMessageReceivedSent.getConsumerID());
+
+ Assert.assertEquals(7, sendMessageReceivedSent.getDeliveryCount());
+
+ Assert.assertEquals(encodeSize, sendMessageReceivedSent.getMessage().getEncodeSize());
+
+ Assert.assertEquals(TEXT, TextMessageUtil.readBodyText(sendMessageReceivedSent.getMessage().getReadOnlyBodyBuffer()).toString());
+ }
+
+ private CoreMessage decodeMessage() {
+
+ ByteBuf newBuffer = Unpooled.buffer(BYTE_ENCODE.capacity());
+ newBuffer.writeBytes(BYTE_ENCODE, 0, BYTE_ENCODE.writerIndex());
+
+ CoreMessage coreMessage = internalDecode(newBuffer);
+
+ int encodeSize = coreMessage.getEncodeSize();
+
+ Assert.assertEquals(newBuffer.capacity(), encodeSize);
+
+ Assert.assertEquals(ADDRESS, coreMessage.getAddressSimpleString());
+
+ Assert.assertEquals(PROP1_VALUE.toString(), coreMessage.getStringProperty(PROP1_NAME));
+
+ ByteBuf destinedBuffer = Unpooled.buffer(BYTE_ENCODE.array().length);
+ coreMessage.sendBuffer(destinedBuffer, 0);
+
+ byte[] destinedArray = destinedBuffer.array();
+ byte[] sourceArray = BYTE_ENCODE.array();
+
+ CoreMessage newDecoded = internalDecode(Unpooled.wrappedBuffer(destinedArray));
+
+ Assert.assertEquals(encodeSize, newDecoded.getEncodeSize());
+
+ Assert.assertArrayEquals(sourceArray, destinedArray);
+
+ return coreMessage;
+ }
+
+ private CoreMessage internalDecode(ByteBuf bufferOrigin) {
+ CoreMessage coreMessage = new CoreMessage();
+// System.out.println("Bytes from test " + ByteUtil.bytesToHex(bufferOrigin.array(), 1));
+ coreMessage.receiveBuffer(bufferOrigin);
+ return coreMessage;
+ }
+
+ /** The message is received, then sent to the other side untouched */
+ @Test
+ public void testChangeBodyStringSameSize() {
+ testChangeBodyString(TEXT.toUpperCase());
+ }
+
+ @Test
+ public void testChangeBodyBiggerString() {
+ testChangeBodyString(BIGGER_TEXT);
+ }
+
+ @Test
+ public void testGenerateEmpty() {
+ CoreMessage empty = new CoreMessage().initBuffer(100);
+ ByteBuf buffer = Unpooled.buffer(200);
+ empty.sendBuffer(buffer, 0);
+
+ CoreMessage empty2 = new CoreMessage();
+ empty2.receiveBuffer(buffer);
+
+ try {
+ empty2.getBodyBuffer().readByte();
+ Assert.fail("should throw exception");
+ } catch (Exception expected) {
+
+ }
+ }
+
+ @Test
+ public void testSaveReceiveLimitedBytes() {
+ CoreMessage empty = new CoreMessage().initBuffer(100);
+ System.out.println("R " + empty.getBodyBuffer().readerIndex() + " W " + empty.getBodyBuffer().writerIndex());
+ empty.getBodyBuffer().writeByte((byte)7);
+ System.out.println("R " + empty.getBodyBuffer().readerIndex() + " W " + empty.getBodyBuffer().writerIndex());
+
+ ByteBuf buffer = Unpooled.buffer(200);
+ empty.sendBuffer(buffer, 0);
+
+ CoreMessage empty2 = new CoreMessage();
+ empty2.receiveBuffer(buffer);
+
+ Assert.assertEquals((byte)7, empty2.getBodyBuffer().readByte());
+
+ System.out.println("Readable :: " + empty2.getBodyBuffer().readerIndex() + " writer :" + empty2.getBodyBuffer().writerIndex());
+
+ try {
+ empty2.getBodyBuffer().readByte();
+ Assert.fail("should throw exception");
+ } catch (Exception expected) {
+
+ }
+ }
+
+ @Test
+ public void testChangeBodySmallerString() {
+ testChangeBodyString(SMALLER_TEXT);
+ }
+
+ public void testChangeBodyString(String newString) {
+ CoreMessage coreMessage = decodeMessage();
+
+ coreMessage.putStringProperty("newProperty", "newValue");
+ ActiveMQBuffer legacyBuffer = coreMessage.getBodyBuffer();
+ legacyBuffer.resetWriterIndex();
+ legacyBuffer.clear();
+
+ TextMessageUtil.writeBodyText(legacyBuffer, SimpleString.toSimpleString(newString));
+
+ ByteBuf newbuffer = Unpooled.buffer(150000);
+
+ coreMessage.sendBuffer(newbuffer, 0);
+ newbuffer.readerIndex(0);
+
+ CoreMessage newCoreMessage = new CoreMessage();
+ newCoreMessage.receiveBuffer(newbuffer);
+
+
+ SimpleString newText = TextMessageUtil.readBodyText(newCoreMessage.getReadOnlyBodyBuffer());
+
+ Assert.assertEquals(newString, newText.toString());
+
+// coreMessage.putStringProperty()
+ }
+
+ @Test
+ public void testPassThroughMultipleThreads() throws Throwable {
+ CoreMessage coreMessage = new CoreMessage();
+ coreMessage.receiveBuffer(BYTE_ENCODE);
+
+ LinkedList<Throwable> errors = new LinkedList<>();
+
+ Thread[] threads = new Thread[50];
+ for (int i = 0; i < threads.length; i++) {
+ threads[i] = new Thread(() -> {
+ try {
+ for (int j = 0; j < 50; j++) {
+ Assert.assertEquals(ADDRESS, coreMessage.getAddressSimpleString());
+ Assert.assertEquals(PROP1_VALUE.toString(), coreMessage.getStringProperty(PROP1_NAME));
+
+ ByteBuf destinedBuffer = Unpooled.buffer(BYTE_ENCODE.array().length);
+ coreMessage.sendBuffer(destinedBuffer, 0);
+
+ byte[] destinedArray = destinedBuffer.array();
+ byte[] sourceArray = BYTE_ENCODE.array();
+
+ Assert.assertArrayEquals(sourceArray, destinedArray);
+
+ Assert.assertEquals(TEXT, TextMessageUtil.readBodyText(coreMessage.getReadOnlyBodyBuffer()).toString());
+ }
+ } catch (Throwable e) {
+ e.printStackTrace();
+ errors.add(e);
+ }
+ });
+ }
+
+ for (Thread t : threads) {
+ t.start();
+ }
+
+ for (Thread t : threads) {
+ t.join();
+ }
+
+ for (Throwable e: errors) {
+ throw e;
+ }
+
+ }
+
+ // This is to compare the original encoding with the current version
+ @Test
+ public void compareOriginal() throws Exception {
+ String generated = generate(TEXT);
+
+ Assert.assertEquals(STRING_ENCODE, generated);
+
+ for (int i = 0; i < generated.length(); i++) {
+ Assert.assertEquals("Chart at " + i + " was " + generated.charAt(i) + " instead of " + STRING_ENCODE.charAt(i), generated.charAt(i), STRING_ENCODE.charAt(i));
+ }
+ }
+
+ /** Use this method to update the encode for the known message */
+ @Ignore
+ @Test
+ public void generate() throws Exception {
+
+ printVariable(TEXT, generate(TEXT));
+ printVariable(SMALLER_TEXT, generate(SMALLER_TEXT));
+ printVariable(BIGGER_TEXT, generate(BIGGER_TEXT));
+
+ }
+
+ private void printVariable(String body, String encode) {
+ System.out.println("// body = \"" + body + "\";");
+ System.out.println("private final String STRING_ENCODE = \"" + encode + "\";");
+
+ }
+
+ public String generate(String body) throws Exception {
+
+ ClientMessageImpl message = new ClientMessageImpl(MESSAGE_TYPE, DURABLE, EXPIRATION, TIMESTAMP, PRIORITY, 10 * 1024);
+ TextMessageUtil.writeBodyText(message.getBodyBuffer(), SimpleString.toSimpleString(body));
+
+ message.setAddress(ADDRESS);
+ message.setUserID(uuid);
+ message.getProperties().putSimpleStringProperty(PROP1_NAME, PROP1_VALUE);
+
+
+ ActiveMQBuffer buffer = ActiveMQBuffers.dynamicBuffer(10 * 1024);
+ message.sendBuffer(buffer.byteBuf(), 0);
+
+ byte[] bytes = new byte[buffer.byteBuf().writerIndex()];
+ buffer.byteBuf().readBytes(bytes);
+
+ return encodeString(bytes);
+
+ // replace the code
+
+
+ }
+
+ private String encodeString(byte[] bytes) {
+ return Base64.encodeBytes(bytes, 0, bytes.length, Base64.DONT_BREAK_LINES | Base64.URL_SAFE);
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/journal/JDBCJournalImpl.java
----------------------------------------------------------------------
diff --git a/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/journal/JDBCJournalImpl.java b/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/journal/JDBCJournalImpl.java
index eb7cda1..2108be7 100644
--- a/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/journal/JDBCJournalImpl.java
+++ b/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/journal/JDBCJournalImpl.java
@@ -31,11 +31,13 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicLong;
import org.apache.activemq.artemis.core.io.SequentialFileFactory;
+import org.apache.activemq.artemis.core.journal.EncoderPersister;
import org.apache.activemq.artemis.core.journal.EncodingSupport;
import org.apache.activemq.artemis.core.journal.IOCompletion;
import org.apache.activemq.artemis.core.journal.Journal;
import org.apache.activemq.artemis.core.journal.JournalLoadInformation;
import org.apache.activemq.artemis.core.journal.LoaderCallback;
+import org.apache.activemq.artemis.core.persistence.Persister;
import org.apache.activemq.artemis.core.journal.PreparedTransactionInfo;
import org.apache.activemq.artemis.core.journal.RecordInfo;
import org.apache.activemq.artemis.core.journal.TransactionFailureCallback;
@@ -366,10 +368,10 @@ public class JDBCJournalImpl extends AbstractJDBCDriver implements Journal {
}
@Override
- public void appendAddRecord(long id, byte recordType, EncodingSupport record, boolean sync) throws Exception {
+ public void appendAddRecord(long id, byte recordType, Persister persister, Object record, boolean sync) throws Exception {
JDBCJournalRecord r = new JDBCJournalRecord(id, JDBCJournalRecord.ADD_RECORD, seq.incrementAndGet());
r.setUserRecordType(recordType);
- r.setRecord(record);
+ r.setRecord(persister, record);
r.setSync(sync);
appendRecord(r);
}
@@ -377,12 +379,13 @@ public class JDBCJournalImpl extends AbstractJDBCDriver implements Journal {
@Override
public void appendAddRecord(long id,
byte recordType,
- EncodingSupport record,
+ Persister persister,
+ Object record,
boolean sync,
IOCompletion completionCallback) throws Exception {
JDBCJournalRecord r = new JDBCJournalRecord(id, JDBCJournalRecord.ADD_RECORD, seq.incrementAndGet());
r.setUserRecordType(recordType);
- r.setRecord(record);
+ r.setRecord(persister, record);
r.setSync(sync);
r.setIoCompletion(completionCallback);
appendRecord(r);
@@ -398,10 +401,10 @@ public class JDBCJournalImpl extends AbstractJDBCDriver implements Journal {
}
@Override
- public void appendUpdateRecord(long id, byte recordType, EncodingSupport record, boolean sync) throws Exception {
+ public void appendUpdateRecord(long id, byte recordType, Persister persister, Object record, boolean sync) throws Exception {
JDBCJournalRecord r = new JDBCJournalRecord(id, JDBCJournalRecord.UPDATE_RECORD, seq.incrementAndGet());
r.setUserRecordType(recordType);
- r.setRecord(record);
+ r.setRecord(persister, record);
r.setSync(sync);
appendRecord(r);
}
@@ -409,12 +412,13 @@ public class JDBCJournalImpl extends AbstractJDBCDriver implements Journal {
@Override
public void appendUpdateRecord(long id,
byte recordType,
- EncodingSupport record,
+ Persister persister,
+ Object record,
boolean sync,
IOCompletion completionCallback) throws Exception {
JDBCJournalRecord r = new JDBCJournalRecord(id, JDBCJournalRecord.ADD_RECORD, seq.incrementAndGet());
r.setUserRecordType(recordType);
- r.setRecord(record);
+ r.setRecord(persister, record);
r.setSync(sync);
r.setIoCompletion(completionCallback);
appendRecord(r);
@@ -448,10 +452,11 @@ public class JDBCJournalImpl extends AbstractJDBCDriver implements Journal {
public void appendAddRecordTransactional(long txID,
long id,
byte recordType,
- EncodingSupport record) throws Exception {
+ Persister persister,
+ Object record) throws Exception {
JDBCJournalRecord r = new JDBCJournalRecord(id, JDBCJournalRecord.ADD_RECORD_TX, seq.incrementAndGet());
r.setUserRecordType(recordType);
- r.setRecord(record);
+ r.setRecord(persister, record);
r.setTxId(txID);
appendRecord(r);
}
@@ -469,10 +474,11 @@ public class JDBCJournalImpl extends AbstractJDBCDriver implements Journal {
public void appendUpdateRecordTransactional(long txID,
long id,
byte recordType,
- EncodingSupport record) throws Exception {
+ Persister persister,
+ Object record) throws Exception {
JDBCJournalRecord r = new JDBCJournalRecord(id, JDBCJournalRecord.UPDATE_RECORD_TX, seq.incrementAndGet());
r.setUserRecordType(recordType);
- r.setRecord(record);
+ r.setRecord(persister, record);
r.setTxId(txID);
appendRecord(r);
}
@@ -488,7 +494,7 @@ public class JDBCJournalImpl extends AbstractJDBCDriver implements Journal {
@Override
public void appendDeleteRecordTransactional(long txID, long id, EncodingSupport record) throws Exception {
JDBCJournalRecord r = new JDBCJournalRecord(id, JDBCJournalRecord.DELETE_RECORD_TX, seq.incrementAndGet());
- r.setRecord(record);
+ r.setRecord(EncoderPersister.getInstance(), record);
r.setTxId(txID);
appendRecord(r);
}
@@ -685,10 +691,6 @@ public class JDBCJournalImpl extends AbstractJDBCDriver implements Journal {
}
@Override
- public void perfBlast(int pages) {
- }
-
- @Override
public void runDirectJournalBlast() throws Exception {
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/journal/JDBCJournalRecord.java
----------------------------------------------------------------------
diff --git a/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/journal/JDBCJournalRecord.java b/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/journal/JDBCJournalRecord.java
index 9691d3e..b094164 100644
--- a/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/journal/JDBCJournalRecord.java
+++ b/artemis-jdbc-store/src/main/java/org/apache/activemq/artemis/jdbc/store/journal/JDBCJournalRecord.java
@@ -28,6 +28,7 @@ import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
import org.apache.activemq.artemis.api.core.ActiveMQBuffers;
import org.apache.activemq.artemis.core.journal.EncodingSupport;
import org.apache.activemq.artemis.core.journal.IOCompletion;
+import org.apache.activemq.artemis.core.persistence.Persister;
import org.apache.activemq.artemis.core.journal.RecordInfo;
import org.apache.activemq.artemis.journal.ActiveMQJournalLogger;
import org.apache.activemq.artemis.utils.ActiveMQBufferInputStream;
@@ -237,11 +238,11 @@ class JDBCJournalRecord {
this.record = record;
}
- public void setRecord(EncodingSupport record) {
- this.variableSize = record.getEncodeSize();
+ public void setRecord(Persister persister, Object record) {
+ this.variableSize = persister.getEncodeSize(record);
ActiveMQBuffer encodedBuffer = ActiveMQBuffers.fixedBuffer(variableSize);
- record.encode(encodedBuffer);
+ persister.encode(encodedBuffer, record);
this.record = new ActiveMQBufferInputStream(encodedBuffer);
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-jms-client/src/main/java/org/apache/activemq/artemis/api/jms/management/JMSManagementHelper.java
----------------------------------------------------------------------
diff --git a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/api/jms/management/JMSManagementHelper.java b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/api/jms/management/JMSManagementHelper.java
index 0e99106..4d0306b 100644
--- a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/api/jms/management/JMSManagementHelper.java
+++ b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/api/jms/management/JMSManagementHelper.java
@@ -19,6 +19,7 @@ package org.apache.activemq.artemis.api.jms.management;
import javax.jms.JMSException;
import javax.jms.Message;
+import org.apache.activemq.artemis.api.core.client.ClientMessage;
import org.apache.activemq.artemis.api.core.management.ManagementHelper;
import org.apache.activemq.artemis.jms.client.ActiveMQMessage;
@@ -27,7 +28,7 @@ import org.apache.activemq.artemis.jms.client.ActiveMQMessage;
*/
public class JMSManagementHelper {
- private static org.apache.activemq.artemis.api.core.Message getCoreMessage(final Message jmsMessage) {
+ private static ClientMessage getCoreMessage(final Message jmsMessage) {
if (jmsMessage instanceof ActiveMQMessage == false) {
throw new IllegalArgumentException("Cannot send a foreign message as a management message " + jmsMessage.getClass().getName());
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQBytesMessage.java
----------------------------------------------------------------------
diff --git a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQBytesMessage.java b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQBytesMessage.java
index 59f04e8..6da3912 100644
--- a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQBytesMessage.java
+++ b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQBytesMessage.java
@@ -26,7 +26,7 @@ import org.apache.activemq.artemis.api.core.ActiveMQException;
import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.client.ClientMessage;
import org.apache.activemq.artemis.api.core.client.ClientSession;
-import org.apache.activemq.artemis.core.message.impl.MessageImpl;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import static org.apache.activemq.artemis.reader.BytesMessageUtil.bytesMessageReset;
import static org.apache.activemq.artemis.reader.BytesMessageUtil.bytesReadBoolean;
@@ -374,7 +374,7 @@ public class ActiveMQBytesMessage extends ActiveMQMessage implements BytesMessag
if (bodyLength == 0)
return null;
byte[] dst = new byte[bodyLength];
- message.getBodyBuffer().getBytes(MessageImpl.BODY_OFFSET, dst);
+ message.getBodyBuffer().getBytes(CoreMessage.BODY_OFFSET, dst);
return (T) dst;
}
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQMessage.java
----------------------------------------------------------------------
diff --git a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQMessage.java b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQMessage.java
index 47dcfb2..80a07ac 100644
--- a/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQMessage.java
+++ b/artemis-jms-client/src/main/java/org/apache/activemq/artemis/jms/client/ActiveMQMessage.java
@@ -43,7 +43,7 @@ import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.api.core.client.ClientMessage;
import org.apache.activemq.artemis.api.core.client.ClientSession;
import org.apache.activemq.artemis.api.jms.ActiveMQJMSConstants;
-import org.apache.activemq.artemis.core.message.impl.MessageInternal;
+import org.apache.activemq.artemis.core.client.impl.ClientMessageInternal;
import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.reader.MessageUtil;
import org.apache.activemq.artemis.utils.UUID;
@@ -293,7 +293,7 @@ public class ActiveMQMessage implements javax.jms.Message {
@Override
public String getJMSMessageID() {
if (msgID == null) {
- UUID uid = message.getUserID();
+ UUID uid = (UUID)message.getUserID();
msgID = uid == null ? null : "ID:" + uid.toString();
}
@@ -397,7 +397,7 @@ public class ActiveMQMessage implements javax.jms.Message {
@Override
public Destination getJMSDestination() throws JMSException {
if (dest == null) {
- SimpleString address = message.getAddress();
+ SimpleString address = message.getAddressSimpleString();
String prefix = "";
if (message.containsProperty(org.apache.activemq.artemis.api.core.Message.HDR_ROUTING_TYPE)) {
RoutingType routingType = RoutingType.getType(message.getByteProperty(org.apache.activemq.artemis.api.core.Message.HDR_ROUTING_TYPE));
@@ -756,7 +756,7 @@ public class ActiveMQMessage implements javax.jms.Message {
@SuppressWarnings("unchecked")
protected <T> T getBodyInternal(Class<T> c) throws MessageFormatException {
- InputStream is = ((MessageInternal) message).getBodyInputStream();
+ InputStream is = ((ClientMessageInternal) message).getBodyInputStream();
try {
ObjectInputStream ois = new ObjectInputStream(is);
return (T) ois.readObject();
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-jms-server/src/main/java/org/apache/activemq/artemis/jms/transaction/JMSTransactionDetail.java
----------------------------------------------------------------------
diff --git a/artemis-jms-server/src/main/java/org/apache/activemq/artemis/jms/transaction/JMSTransactionDetail.java b/artemis-jms-server/src/main/java/org/apache/activemq/artemis/jms/transaction/JMSTransactionDetail.java
index 6cf20ff..ecb4ccb 100644
--- a/artemis-jms-server/src/main/java/org/apache/activemq/artemis/jms/transaction/JMSTransactionDetail.java
+++ b/artemis-jms-server/src/main/java/org/apache/activemq/artemis/jms/transaction/JMSTransactionDetail.java
@@ -19,7 +19,8 @@ package org.apache.activemq.artemis.jms.transaction;
import javax.transaction.xa.Xid;
import java.util.Map;
-import org.apache.activemq.artemis.core.server.ServerMessage;
+import org.apache.activemq.artemis.api.core.ICoreMessage;
+import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.core.transaction.Transaction;
import org.apache.activemq.artemis.core.transaction.TransactionDetail;
import org.apache.activemq.artemis.jms.client.ActiveMQBytesMessage;
@@ -36,8 +37,11 @@ public class JMSTransactionDetail extends TransactionDetail {
}
@Override
- public String decodeMessageType(ServerMessage msg) {
- int type = msg.getType();
+ public String decodeMessageType(Message msg) {
+ if (!(msg instanceof ICoreMessage)) {
+ return "N/A";
+ }
+ int type = ((ICoreMessage) msg).getType();
switch (type) {
case ActiveMQMessage.TYPE: // 0
return "Default";
@@ -57,7 +61,7 @@ public class JMSTransactionDetail extends TransactionDetail {
}
@Override
- public Map<String, Object> decodeMessageProperties(ServerMessage msg) {
+ public Map<String, Object> decodeMessageProperties(Message msg) {
try {
return ActiveMQMessage.coreMaptoJMSMap(msg.toMap());
} catch (Throwable t) {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/EncoderPersister.java
----------------------------------------------------------------------
diff --git a/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/EncoderPersister.java b/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/EncoderPersister.java
new file mode 100644
index 0000000..8fc2a5aa
--- /dev/null
+++ b/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/EncoderPersister.java
@@ -0,0 +1,51 @@
+/**
+ * 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.journal;
+
+import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
+import org.apache.activemq.artemis.core.persistence.Persister;
+
+/** This is a facade between the new Persister and the former EncodingSupport.
+ * Methods using the old interface will use this as a facade to provide the previous semantic. */
+public class EncoderPersister implements Persister<EncodingSupport> {
+
+ private static final EncoderPersister theInstance = new EncoderPersister();
+
+ private EncoderPersister() {
+ }
+
+ public static EncoderPersister getInstance() {
+ return theInstance;
+ }
+
+ @Override
+ public int getEncodeSize(EncodingSupport record) {
+ return record.getEncodeSize();
+ }
+
+ @Override
+ public void encode(ActiveMQBuffer buffer, EncodingSupport record) {
+ record.encode(buffer);
+ }
+
+ @Override
+ public EncodingSupport decode(ActiveMQBuffer buffer, EncodingSupport record) {
+ record.decode(buffer);
+ return record;
+ }
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/Journal.java
----------------------------------------------------------------------
diff --git a/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/Journal.java b/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/Journal.java
index fbd4182..ca194b8 100644
--- a/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/Journal.java
+++ b/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/Journal.java
@@ -21,6 +21,7 @@ import java.util.Map;
import org.apache.activemq.artemis.core.io.SequentialFileFactory;
import org.apache.activemq.artemis.core.journal.impl.JournalFile;
+import org.apache.activemq.artemis.core.persistence.Persister;
import org.apache.activemq.artemis.core.server.ActiveMQComponent;
/**
@@ -60,23 +61,49 @@ public interface Journal extends ActiveMQComponent {
void appendAddRecord(long id, byte recordType, byte[] record, boolean sync) throws Exception;
- void appendAddRecord(long id, byte recordType, EncodingSupport record, boolean sync) throws Exception;
+ default void appendAddRecord(long id, byte recordType, EncodingSupport record, boolean sync) throws Exception {
+ appendAddRecord(id, recordType, EncoderPersister.getInstance(), record, sync);
+ }
+
+ void appendAddRecord(long id, byte recordType, Persister persister, Object record, boolean sync) throws Exception;
void appendAddRecord(long id,
byte recordType,
- EncodingSupport record,
+ Persister persister,
+ Object record,
boolean sync,
IOCompletion completionCallback) throws Exception;
+ default void appendAddRecord(long id,
+ byte recordType,
+ EncodingSupport record,
+ boolean sync,
+ IOCompletion completionCallback) throws Exception {
+ appendAddRecord(id, recordType, EncoderPersister.getInstance(), record, sync, completionCallback);
+ }
+
void appendUpdateRecord(long id, byte recordType, byte[] record, boolean sync) throws Exception;
- void appendUpdateRecord(long id, byte recordType, EncodingSupport record, boolean sync) throws Exception;
+ default void appendUpdateRecord(long id, byte recordType, EncodingSupport record, boolean sync) throws Exception {
+ appendUpdateRecord(id, recordType, EncoderPersister.getInstance(), record, sync);
+ }
- void appendUpdateRecord(long id,
+ void appendUpdateRecord(long id, byte recordType, Persister persister, Object record, boolean sync) throws Exception;
+
+ default void appendUpdateRecord(long id,
byte recordType,
EncodingSupport record,
boolean sync,
- IOCompletion completionCallback) throws Exception;
+ IOCompletion completionCallback) throws Exception {
+ appendUpdateRecord(id, recordType, EncoderPersister.getInstance(), record, sync, completionCallback);
+ }
+
+ void appendUpdateRecord(final long id,
+ final byte recordType,
+ final Persister persister,
+ final Object record,
+ final boolean sync,
+ final IOCompletion callback) throws Exception;
void appendDeleteRecord(long id, boolean sync) throws Exception;
@@ -86,11 +113,23 @@ public interface Journal extends ActiveMQComponent {
void appendAddRecordTransactional(long txID, long id, byte recordType, byte[] record) throws Exception;
- void appendAddRecordTransactional(long txID, long id, byte recordType, EncodingSupport record) throws Exception;
+ default void appendAddRecordTransactional(long txID, long id, byte recordType, EncodingSupport record) throws Exception {
+ appendAddRecordTransactional(txID, id, recordType, EncoderPersister.getInstance(), record);
+ }
+
+ void appendAddRecordTransactional(final long txID,
+ final long id,
+ final byte recordType,
+ final Persister persister,
+ final Object record) throws Exception;
void appendUpdateRecordTransactional(long txID, long id, byte recordType, byte[] record) throws Exception;
- void appendUpdateRecordTransactional(long txID, long id, byte recordType, EncodingSupport record) throws Exception;
+ default void appendUpdateRecordTransactional(long txID, long id, byte recordType, EncodingSupport record) throws Exception {
+ appendUpdateRecordTransactional(txID, id, recordType, EncoderPersister.getInstance(), record);
+ }
+
+ void appendUpdateRecordTransactional(long txID, long id, byte recordType, Persister persister, Object record) throws Exception;
void appendDeleteRecordTransactional(long txID, long id, byte[] record) throws Exception;
@@ -165,8 +204,6 @@ public interface Journal extends ActiveMQComponent {
int getUserVersion();
- void perfBlast(int pages);
-
void runDirectJournalBlast() throws Exception;
/**
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/AbstractJournalUpdateTask.java
----------------------------------------------------------------------
diff --git a/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/AbstractJournalUpdateTask.java b/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/AbstractJournalUpdateTask.java
index 8bbecd2..943077c 100644
--- a/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/AbstractJournalUpdateTask.java
+++ b/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/AbstractJournalUpdateTask.java
@@ -26,6 +26,7 @@ import org.apache.activemq.artemis.api.core.ActiveMQBuffers;
import org.apache.activemq.artemis.api.core.Pair;
import org.apache.activemq.artemis.core.io.SequentialFile;
import org.apache.activemq.artemis.core.io.SequentialFileFactory;
+import org.apache.activemq.artemis.core.journal.EncoderPersister;
import org.apache.activemq.artemis.core.journal.impl.dataformat.ByteArrayEncoding;
import org.apache.activemq.artemis.core.journal.impl.dataformat.JournalAddRecord;
import org.apache.activemq.artemis.core.journal.impl.dataformat.JournalInternalRecord;
@@ -127,7 +128,7 @@ public abstract class AbstractJournalUpdateTask implements JournalReaderCallback
}
}
- JournalInternalRecord controlRecord = new JournalAddRecord(true, 1, (byte) 0, new ByteArrayEncoding(filesToRename.toByteBuffer().array()));
+ JournalInternalRecord controlRecord = new JournalAddRecord(true, 1, (byte) 0, EncoderPersister.getInstance(), new ByteArrayEncoding(filesToRename.toByteBuffer().array()));
ActiveMQBuffer renameBuffer = ActiveMQBuffers.dynamicBuffer(filesToRename.writerIndex());
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/FileWrapperJournal.java
----------------------------------------------------------------------
diff --git a/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/FileWrapperJournal.java b/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/FileWrapperJournal.java
index 0b702a5..8e5ca2c 100644
--- a/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/FileWrapperJournal.java
+++ b/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/FileWrapperJournal.java
@@ -31,6 +31,7 @@ import org.apache.activemq.artemis.core.journal.IOCompletion;
import org.apache.activemq.artemis.core.journal.Journal;
import org.apache.activemq.artemis.core.journal.JournalLoadInformation;
import org.apache.activemq.artemis.core.journal.LoaderCallback;
+import org.apache.activemq.artemis.core.persistence.Persister;
import org.apache.activemq.artemis.core.journal.PreparedTransactionInfo;
import org.apache.activemq.artemis.core.journal.RecordInfo;
import org.apache.activemq.artemis.core.journal.TransactionFailureCallback;
@@ -90,10 +91,11 @@ public final class FileWrapperJournal extends JournalBase {
@Override
public void appendAddRecord(long id,
byte recordType,
- EncodingSupport record,
+ Persister persister,
+ Object record,
boolean sync,
IOCompletion callback) throws Exception {
- JournalInternalRecord addRecord = new JournalAddRecord(true, id, recordType, record);
+ JournalInternalRecord addRecord = new JournalAddRecord(true, id, recordType, persister, record);
writeRecord(addRecord, sync, callback);
}
@@ -144,19 +146,21 @@ public final class FileWrapperJournal extends JournalBase {
public void appendAddRecordTransactional(long txID,
long id,
byte recordType,
- EncodingSupport record) throws Exception {
+ Persister persister,
+ Object record) throws Exception {
count(txID);
- JournalInternalRecord addRecord = new JournalAddRecordTX(true, txID, id, recordType, record);
+ JournalInternalRecord addRecord = new JournalAddRecordTX(true, txID, id, recordType, persister, record);
writeRecord(addRecord, false, null);
}
@Override
public void appendUpdateRecord(long id,
byte recordType,
- EncodingSupport record,
+ Persister persister,
+ Object record,
boolean sync,
IOCompletion callback) throws Exception {
- JournalInternalRecord updateRecord = new JournalAddRecord(false, id, recordType, record);
+ JournalInternalRecord updateRecord = new JournalAddRecord(false, id, recordType, persister, record);
writeRecord(updateRecord, sync, callback);
}
@@ -164,9 +168,10 @@ public final class FileWrapperJournal extends JournalBase {
public void appendUpdateRecordTransactional(long txID,
long id,
byte recordType,
- EncodingSupport record) throws Exception {
+ Persister persister,
+ Object record) throws Exception {
count(txID);
- JournalInternalRecord updateRecordTX = new JournalAddRecordTX(false, txID, id, recordType, record);
+ JournalInternalRecord updateRecordTX = new JournalAddRecordTX(false, txID, id, recordType, persister, record);
writeRecord(updateRecordTX, false, null);
}
@@ -261,11 +266,6 @@ public final class FileWrapperJournal extends JournalBase {
}
@Override
- public void perfBlast(int pages) {
- throw new UnsupportedOperationException();
- }
-
- @Override
public void runDirectJournalBlast() throws Exception {
throw new UnsupportedOperationException();
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/JournalBase.java
----------------------------------------------------------------------
diff --git a/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/JournalBase.java b/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/JournalBase.java
index e2ca84d..e6bd99e 100644
--- a/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/JournalBase.java
+++ b/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/JournalBase.java
@@ -21,6 +21,7 @@ import org.apache.activemq.artemis.core.io.DummyCallback;
import org.apache.activemq.artemis.core.journal.EncodingSupport;
import org.apache.activemq.artemis.core.journal.IOCompletion;
import org.apache.activemq.artemis.core.journal.Journal;
+import org.apache.activemq.artemis.core.persistence.Persister;
import org.apache.activemq.artemis.core.journal.impl.dataformat.ByteArrayEncoding;
abstract class JournalBase implements Journal {
@@ -37,68 +38,15 @@ abstract class JournalBase implements Journal {
}
@Override
- public abstract void appendAddRecord(final long id,
- final byte recordType,
- final EncodingSupport record,
- final boolean sync,
- final IOCompletion callback) throws Exception;
-
- @Override
- public abstract void appendAddRecordTransactional(final long txID,
- final long id,
- final byte recordType,
- final EncodingSupport record) throws Exception;
-
- @Override
- public abstract void appendCommitRecord(final long txID,
- final boolean sync,
- final IOCompletion callback,
- boolean lineUpContext) throws Exception;
-
- @Override
- public abstract void appendDeleteRecord(final long id,
- final boolean sync,
- final IOCompletion callback) throws Exception;
-
- @Override
- public abstract void appendDeleteRecordTransactional(final long txID,
- final long id,
- final EncodingSupport record) throws Exception;
-
- @Override
- public abstract void appendPrepareRecord(final long txID,
- final EncodingSupport transactionData,
- final boolean sync,
- final IOCompletion callback) throws Exception;
-
- @Override
- public abstract void appendUpdateRecord(final long id,
- final byte recordType,
- final EncodingSupport record,
- final boolean sync,
- final IOCompletion callback) throws Exception;
-
- @Override
- public abstract void appendUpdateRecordTransactional(final long txID,
- final long id,
- final byte recordType,
- final EncodingSupport record) throws Exception;
-
- @Override
- public abstract void appendRollbackRecord(final long txID,
- final boolean sync,
- final IOCompletion callback) throws Exception;
-
- @Override
public void appendAddRecord(long id, byte recordType, byte[] record, boolean sync) throws Exception {
appendAddRecord(id, recordType, new ByteArrayEncoding(record), sync);
}
@Override
- public void appendAddRecord(long id, byte recordType, EncodingSupport record, boolean sync) throws Exception {
+ public void appendAddRecord(long id, byte recordType, Persister persister, Object record, boolean sync) throws Exception {
SyncIOCompletion callback = getSyncCallback(sync);
- appendAddRecord(id, recordType, record, sync, callback);
+ appendAddRecord(id, recordType, persister, record, sync, callback);
if (callback != null) {
callback.waitCompletion();
@@ -176,11 +124,12 @@ abstract class JournalBase implements Journal {
@Override
public void appendUpdateRecord(final long id,
final byte recordType,
- final EncodingSupport record,
+ final Persister persister,
+ final Object record,
final boolean sync) throws Exception {
SyncIOCompletion callback = getSyncCallback(sync);
- appendUpdateRecord(id, recordType, record, sync, callback);
+ appendUpdateRecord(id, recordType, persister, record, sync, callback);
if (callback != null) {
callback.waitCompletion();
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/JournalCompactor.java
----------------------------------------------------------------------
diff --git a/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/JournalCompactor.java b/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/JournalCompactor.java
index b95d641..c62b27b 100644
--- a/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/JournalCompactor.java
+++ b/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/JournalCompactor.java
@@ -29,6 +29,7 @@ import org.apache.activemq.artemis.api.core.ActiveMQBuffers;
import org.apache.activemq.artemis.api.core.Pair;
import org.apache.activemq.artemis.core.io.SequentialFile;
import org.apache.activemq.artemis.core.io.SequentialFileFactory;
+import org.apache.activemq.artemis.core.journal.EncoderPersister;
import org.apache.activemq.artemis.core.journal.RecordInfo;
import org.apache.activemq.artemis.core.journal.impl.dataformat.ByteArrayEncoding;
import org.apache.activemq.artemis.core.journal.impl.dataformat.JournalAddRecord;
@@ -252,7 +253,7 @@ public class JournalCompactor extends AbstractJournalUpdateTask implements Journ
@Override
public void onReadAddRecord(final RecordInfo info) throws Exception {
if (lookupRecord(info.id)) {
- JournalInternalRecord addRecord = new JournalAddRecord(true, info.id, info.getUserRecordType(), new ByteArrayEncoding(info.data));
+ JournalInternalRecord addRecord = new JournalAddRecord(true, info.id, info.getUserRecordType(), EncoderPersister.getInstance(), new ByteArrayEncoding(info.data));
addRecord.setCompactCount((short) (info.compactCount + 1));
checkSize(addRecord.getEncodeSize(), info.compactCount);
@@ -268,7 +269,7 @@ public class JournalCompactor extends AbstractJournalUpdateTask implements Journ
if (pendingTransactions.get(transactionID) != null || lookupRecord(info.id)) {
JournalTransaction newTransaction = getNewJournalTransaction(transactionID);
- JournalInternalRecord record = new JournalAddRecordTX(true, transactionID, info.id, info.getUserRecordType(), new ByteArrayEncoding(info.data));
+ JournalInternalRecord record = new JournalAddRecordTX(true, transactionID, info.id, info.getUserRecordType(), EncoderPersister.getInstance(),new ByteArrayEncoding(info.data));
record.setCompactCount((short) (info.compactCount + 1));
@@ -374,7 +375,7 @@ public class JournalCompactor extends AbstractJournalUpdateTask implements Journ
@Override
public void onReadUpdateRecord(final RecordInfo info) throws Exception {
if (lookupRecord(info.id)) {
- JournalInternalRecord updateRecord = new JournalAddRecord(false, info.id, info.userRecordType, new ByteArrayEncoding(info.data));
+ JournalInternalRecord updateRecord = new JournalAddRecord(false, info.id, info.userRecordType, EncoderPersister.getInstance(), new ByteArrayEncoding(info.data));
updateRecord.setCompactCount((short) (info.compactCount + 1));
@@ -397,7 +398,7 @@ public class JournalCompactor extends AbstractJournalUpdateTask implements Journ
if (pendingTransactions.get(transactionID) != null || lookupRecord(info.id)) {
JournalTransaction newTransaction = getNewJournalTransaction(transactionID);
- JournalInternalRecord updateRecordTX = new JournalAddRecordTX(false, transactionID, info.id, info.userRecordType, new ByteArrayEncoding(info.data));
+ JournalInternalRecord updateRecordTX = new JournalAddRecordTX(false, transactionID, info.id, info.userRecordType, EncoderPersister.getInstance(), new ByteArrayEncoding(info.data));
updateRecordTX.setCompactCount((short) (info.compactCount + 1));
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/JournalImpl.java
----------------------------------------------------------------------
diff --git a/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/JournalImpl.java b/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/JournalImpl.java
index db615f8..24bb916 100644
--- a/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/JournalImpl.java
+++ b/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/JournalImpl.java
@@ -57,11 +57,11 @@ import org.apache.activemq.artemis.core.journal.EncodingSupport;
import org.apache.activemq.artemis.core.journal.IOCompletion;
import org.apache.activemq.artemis.core.journal.JournalLoadInformation;
import org.apache.activemq.artemis.core.journal.LoaderCallback;
+import org.apache.activemq.artemis.core.persistence.Persister;
import org.apache.activemq.artemis.core.journal.PreparedTransactionInfo;
import org.apache.activemq.artemis.core.journal.RecordInfo;
import org.apache.activemq.artemis.core.journal.TestableJournal;
import org.apache.activemq.artemis.core.journal.TransactionFailureCallback;
-import org.apache.activemq.artemis.core.journal.impl.dataformat.ByteArrayEncoding;
import org.apache.activemq.artemis.core.journal.impl.dataformat.JournalAddRecord;
import org.apache.activemq.artemis.core.journal.impl.dataformat.JournalAddRecordTX;
import org.apache.activemq.artemis.core.journal.impl.dataformat.JournalCompleteRecordTX;
@@ -713,7 +713,8 @@ public class JournalImpl extends JournalBase implements TestableJournal, Journal
@Override
public void appendAddRecord(final long id,
final byte recordType,
- final EncodingSupport record,
+ final Persister persister,
+ final Object record,
final boolean sync,
final IOCompletion callback) throws Exception {
checkJournalIsLoaded();
@@ -727,7 +728,7 @@ public class JournalImpl extends JournalBase implements TestableJournal, Journal
public void run() {
journalLock.readLock().lock();
try {
- JournalInternalRecord addRecord = new JournalAddRecord(true, id, recordType, record);
+ JournalInternalRecord addRecord = new JournalAddRecord(true, id, recordType, persister, record);
JournalFile usedFile = appendRecord(addRecord, false, sync, null, callback);
records.put(id, new JournalRecord(usedFile, addRecord.getEncodeSize()));
@@ -762,7 +763,8 @@ public class JournalImpl extends JournalBase implements TestableJournal, Journal
@Override
public void appendUpdateRecord(final long id,
final byte recordType,
- final EncodingSupport record,
+ final Persister persister,
+ final Object record,
final boolean sync,
final IOCompletion callback) throws Exception {
checkJournalIsLoaded();
@@ -777,7 +779,7 @@ public class JournalImpl extends JournalBase implements TestableJournal, Journal
journalLock.readLock().lock();
try {
JournalRecord jrnRecord = records.get(id);
- JournalInternalRecord updateRecord = new JournalAddRecord(false, id, recordType, record);
+ JournalInternalRecord updateRecord = new JournalAddRecord(false, id, recordType, persister, record);
JournalFile usedFile = appendRecord(updateRecord, false, sync, null, callback);
if (logger.isTraceEnabled()) {
@@ -873,7 +875,8 @@ public class JournalImpl extends JournalBase implements TestableJournal, Journal
public void appendAddRecordTransactional(final long txID,
final long id,
final byte recordType,
- final EncodingSupport record) throws Exception {
+ final Persister persister,
+ final Object record) throws Exception {
checkJournalIsLoaded();
final JournalTransaction tx = getTransactionInfo(txID);
@@ -885,7 +888,7 @@ public class JournalImpl extends JournalBase implements TestableJournal, Journal
public void run() {
journalLock.readLock().lock();
try {
- JournalInternalRecord addRecord = new JournalAddRecordTX(true, txID, id, recordType, record);
+ JournalInternalRecord addRecord = new JournalAddRecordTX(true, txID, id, recordType, persister, record);
JournalFile usedFile = appendRecord(addRecord, false, false, tx, null);
if (logger.isTraceEnabled()) {
@@ -952,7 +955,8 @@ public class JournalImpl extends JournalBase implements TestableJournal, Journal
public void appendUpdateRecordTransactional(final long txID,
final long id,
final byte recordType,
- final EncodingSupport record) throws Exception {
+ final Persister persister,
+ final Object record) throws Exception {
checkJournalIsLoaded();
final JournalTransaction tx = getTransactionInfo(txID);
@@ -965,7 +969,7 @@ public class JournalImpl extends JournalBase implements TestableJournal, Journal
journalLock.readLock().lock();
try {
- JournalInternalRecord updateRecordTX = new JournalAddRecordTX( false, txID, id, recordType, record );
+ JournalInternalRecord updateRecordTX = new JournalAddRecordTX( false, txID, id, recordType, persister, record );
JournalFile usedFile = appendRecord( updateRecordTX, false, false, tx, null );
if ( logger.isTraceEnabled() ) {
@@ -2165,45 +2169,6 @@ public class JournalImpl extends JournalBase implements TestableJournal, Journal
}
}
- @Override
- public void perfBlast(final int pages) {
-
- checkJournalIsLoaded();
-
- final ByteArrayEncoding byteEncoder = new ByteArrayEncoding(new byte[128 * 1024]);
-
- final JournalInternalRecord blastRecord = new JournalInternalRecord() {
-
- @Override
- public int getEncodeSize() {
- return byteEncoder.getEncodeSize();
- }
-
- @Override
- public void encode(final ActiveMQBuffer buffer) {
- byteEncoder.encode(buffer);
- }
- };
-
- appendExecutor.execute(new Runnable() {
- @Override
- public void run() {
- journalLock.readLock().lock();
- try {
-
- for (int i = 0; i < pages; i++) {
- appendRecord(blastRecord, false, false, null, null);
- }
-
- } catch (Exception e) {
- ActiveMQJournalLogger.LOGGER.failedToPerfBlast(e);
- } finally {
- journalLock.readLock().unlock();
- }
- }
- });
- }
-
// ActiveMQComponent implementation
// ---------------------------------------------------
@@ -2921,5 +2886,4 @@ public class JournalImpl extends JournalBase implements TestableJournal, Journal
public int getCompactCount() {
return compactCount;
}
-
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/dataformat/JournalAddRecord.java
----------------------------------------------------------------------
diff --git a/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/dataformat/JournalAddRecord.java b/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/dataformat/JournalAddRecord.java
index c6a5d4a..6e5b651 100644
--- a/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/dataformat/JournalAddRecord.java
+++ b/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/dataformat/JournalAddRecord.java
@@ -17,14 +17,16 @@
package org.apache.activemq.artemis.core.journal.impl.dataformat;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
-import org.apache.activemq.artemis.core.journal.EncodingSupport;
+import org.apache.activemq.artemis.core.persistence.Persister;
import org.apache.activemq.artemis.core.journal.impl.JournalImpl;
public class JournalAddRecord extends JournalInternalRecord {
protected final long id;
- protected final EncodingSupport record;
+ protected final Persister persister;
+
+ protected final Object record;
protected final byte recordType;
@@ -35,7 +37,7 @@ public class JournalAddRecord extends JournalInternalRecord {
* @param recordType
* @param record
*/
- public JournalAddRecord(final boolean add, final long id, final byte recordType, final EncodingSupport record) {
+ public JournalAddRecord(final boolean add, final long id, final byte recordType, final Persister persister, Object record) {
this.id = id;
this.record = record;
@@ -43,6 +45,8 @@ public class JournalAddRecord extends JournalInternalRecord {
this.recordType = recordType;
this.add = add;
+
+ this.persister = persister;
}
@Override
@@ -59,17 +63,19 @@ public class JournalAddRecord extends JournalInternalRecord {
buffer.writeLong(id);
- buffer.writeInt(record.getEncodeSize());
+ int recordEncodeSize = persister.getEncodeSize(record);
+
+ buffer.writeInt(persister.getEncodeSize(record));
buffer.writeByte(recordType);
- record.encode(buffer);
+ persister.encode(buffer, record);
- buffer.writeInt(getEncodeSize());
+ buffer.writeInt(recordEncodeSize + JournalImpl.SIZE_ADD_RECORD + 1);
}
@Override
public int getEncodeSize() {
- return JournalImpl.SIZE_ADD_RECORD + record.getEncodeSize() + 1;
+ return JournalImpl.SIZE_ADD_RECORD + persister.getEncodeSize(record) + 1;
}
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/dataformat/JournalAddRecordTX.java
----------------------------------------------------------------------
diff --git a/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/dataformat/JournalAddRecordTX.java b/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/dataformat/JournalAddRecordTX.java
index 6cec122..483418f 100644
--- a/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/dataformat/JournalAddRecordTX.java
+++ b/artemis-journal/src/main/java/org/apache/activemq/artemis/core/journal/impl/dataformat/JournalAddRecordTX.java
@@ -17,7 +17,7 @@
package org.apache.activemq.artemis.core.journal.impl.dataformat;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
-import org.apache.activemq.artemis.core.journal.EncodingSupport;
+import org.apache.activemq.artemis.core.persistence.Persister;
import org.apache.activemq.artemis.core.journal.impl.JournalImpl;
public class JournalAddRecordTX extends JournalInternalRecord {
@@ -26,7 +26,9 @@ public class JournalAddRecordTX extends JournalInternalRecord {
private final long id;
- private final EncodingSupport record;
+ protected final Persister persister;
+
+ protected final Object record;
private final byte recordType;
@@ -41,12 +43,15 @@ public class JournalAddRecordTX extends JournalInternalRecord {
final long txID,
final long id,
final byte recordType,
- final EncodingSupport record) {
+ final Persister persister,
+ Object record) {
this.txID = txID;
this.id = id;
+ this.persister = persister;
+
this.record = record;
this.recordType = recordType;
@@ -70,17 +75,17 @@ public class JournalAddRecordTX extends JournalInternalRecord {
buffer.writeLong(id);
- buffer.writeInt(record.getEncodeSize());
+ buffer.writeInt(persister.getEncodeSize(record));
buffer.writeByte(recordType);
- record.encode(buffer);
+ persister.encode(buffer, record);
buffer.writeInt(getEncodeSize());
}
@Override
public int getEncodeSize() {
- return JournalImpl.SIZE_ADD_RECORD_TX + record.getEncodeSize() + 1;
+ return JournalImpl.SIZE_ADD_RECORD_TX + persister.getEncodeSize(record) + 1;
}
}
[15/17] activemq-artemis git commit: ARTEMIS-1009 Pure Message
Encoding.
Posted by cl...@apache.org.
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/Message.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/Message.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/Message.java
index 80116ed..496a532 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/Message.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/Message.java
@@ -16,10 +16,13 @@
*/
package org.apache.activemq.artemis.api.core;
+import java.io.InputStream;
+import java.util.HashMap;
import java.util.Map;
import java.util.Set;
-import org.apache.activemq.artemis.utils.UUID;
+import io.netty.buffer.ByteBuf;
+import org.apache.activemq.artemis.core.persistence.Persister;
/**
* A Message is a routable instance that has a payload.
@@ -48,9 +51,41 @@ import org.apache.activemq.artemis.utils.UUID;
* <p>
* If conversion is not allowed (for example calling {@code getFloatProperty} on a property set a
* {@code boolean}), a {@link ActiveMQPropertyConversionException} will be thrown.
+ *
+ *
+ * User cases that will be covered by Message
+ *
+ * Receiving a buffer:
+ *
+ * Message encode = new CoreMessage(); // or any other implementation
+ * encode.receiveBuffer(buffer);
+ *
+ *
+ * Sending to a buffer:
+ *
+ * Message encode;
+ * size = encode.getEncodeSize();
+ * encode.encodeDirectly(bufferOutput);
+ *
*/
public interface Message {
+ // This is an estimate of how much memory a Message takes up, exclusing body and properties
+ // Note, it is only an estimate, it's not possible to be entirely sure with Java
+ // This figure is calculated using the test utilities in org.apache.activemq.tests.unit.util.sizeof
+ // The value is somewhat higher on 64 bit architectures, probably due to different alignment
+ int memoryOffset = 352;
+
+
+ SimpleString HDR_ROUTE_TO_IDS = new SimpleString("_AMQ_ROUTE_TO");
+
+ SimpleString HDR_SCALEDOWN_TO_IDS = new SimpleString("_AMQ_SCALEDOWN_TO");
+
+ SimpleString HDR_ROUTE_TO_ACK_IDS = new SimpleString("_AMQ_ACK_ROUTE_TO");
+
+ // used by the bridges to set duplicates
+ SimpleString HDR_BRIDGE_DUPLICATE_ID = new SimpleString("_AMQ_BRIDGE_DUP");
+
/**
* the actual time the message was expired.
* * *
@@ -129,6 +164,87 @@ public interface Message {
byte STREAM_TYPE = 6;
+
+ default SimpleString getDeliveryAnnotationPropertyString(SimpleString property) {
+ Object obj = getDeliveryAnnotationProperty(property);
+ if (obj instanceof SimpleString) {
+ return (SimpleString)obj;
+ } else {
+ return SimpleString.toSimpleString(obj.toString());
+ }
+ }
+
+ default void cleanupInternalProperties() {
+ // only on core
+ }
+
+ RoutingType getRouteType();
+
+ boolean containsDeliveryAnnotationProperty(SimpleString property);
+
+ /**
+ * @deprecated do not use this, use through ICoreMessage or ClientMessage
+ */
+ @Deprecated
+ default InputStream getBodyInputStream() {
+ return null;
+ }
+
+ /**
+ * @deprecated do not use this, use through ICoreMessage or ClientMessage
+ */
+ @Deprecated
+ default ActiveMQBuffer getBodyBuffer() {
+ return null;
+ }
+
+ /**
+ * @deprecated do not use this, use through ICoreMessage or ClientMessage
+ */
+ @Deprecated
+ default byte getType() {
+ return (byte)0;
+ }
+
+ /**
+ * @deprecated do not use this, use through ICoreMessage or ClientMessage
+ */
+ @Deprecated
+ default Message setType(byte type) {
+ return this;
+ }
+
+
+ void messageChanged();
+
+ /** Used to calculate what is the delivery time.
+ * Return null if not scheduled. */
+ Long getScheduledDeliveryTime();
+
+ /** Context can be used by the application server to inject extra control, like a protocol specific on the server.
+ * There is only one per Object, use it wisely!
+ *
+ * Note: the intent of this was to replace PageStore reference on Message, but it will be later increased by adidn a ServerPojo
+ * */
+ RefCountMessageListener getContext();
+
+ SimpleString getReplyTo();
+
+ Message setReplyTo(SimpleString address);
+
+ Message setContext(RefCountMessageListener context);
+
+ /** The buffer will belong to this message, until release is called. */
+ Message setBuffer(ByteBuf buffer);
+
+ ByteBuf getBuffer();
+
+ /** It will generate a new instance of the message encode, being a deep copy, new properties, new everything */
+ Message copy();
+
+ /** It will generate a new instance of the message encode, being a deep copy, new properties, new everything */
+ Message copy(long newID);
+
/**
* Returns the messageID.
* <br>
@@ -136,39 +252,47 @@ public interface Message {
*/
long getMessageID();
+ Message setMessageID(long id);
+
+ default boolean isLargeMessage() {
+ return false;
+ }
+
/**
- * Returns the userID - this is an optional user specified UUID that can be set to identify the message
- * and will be passed around with the message
- *
- * @return the user id
+ * Returns the expiration time of this message.
*/
- UUID getUserID();
+ long getExpiration();
/**
- * Sets the user ID
+ * Sets the expiration of this message.
*
- * @param userID
+ * @param expiration expiration time
*/
- Message setUserID(UUID userID);
+ Message setExpiration(long expiration);
/**
- * Returns the address this message is sent to.
+ * Returns whether this message is expired or not.
*/
- SimpleString getAddress();
+ default boolean isExpired() {
+ if (getExpiration() == 0) {
+ return false;
+ }
+
+ return System.currentTimeMillis() - getExpiration() >= 0;
+ }
+
/**
- * Sets the address to send this message to.
+ * Returns the userID - this is an optional user specified UUID that can be set to identify the message
+ * and will be passed around with the message
*
- * @param address address to send the message to
+ * @return the user id
*/
- Message setAddress(SimpleString address);
+ Object getUserID();
- /**
- * Returns this message type.
- * <p>
- * See fields {@literal *_TYPE} for possible values.
- */
- byte getType();
+ Message setUserID(Object userID);
+
+ void copyHeadersAndProperties(final Message msg);
/**
* Returns whether this message is durable or not.
@@ -182,36 +306,18 @@ public interface Message {
*/
Message setDurable(boolean durable);
- /**
- * Returns the expiration time of this message.
- */
- long getExpiration();
+ Persister<Message> getPersister();
- /**
- * Returns whether this message is expired or not.
- */
- boolean isExpired();
+ String getAddress();
- /**
- * Sets the expiration of this message.
- *
- * @param expiration expiration time
- */
- Message setExpiration(long expiration);
+ Message setAddress(String address);
+
+ SimpleString getAddressSimpleString();
+
+ Message setAddress(SimpleString address);
- /**
- * Returns the message timestamp.
- * <br>
- * The timestamp corresponds to the time this message
- * was handled by an ActiveMQ Artemis server.
- */
long getTimestamp();
- /**
- * Sets the message timestamp.
- *
- * @param timestamp timestamp
- */
Message setTimestamp(long timestamp);
/**
@@ -230,164 +336,118 @@ public interface Message {
*/
Message setPriority(byte priority);
- /**
- * Returns the size of the <em>encoded</em> message.
- */
- int getEncodeSize();
+ /** Used to receive this message from an encoded medium buffer */
+ void receiveBuffer(ByteBuf buffer);
- /**
- * Returns whether this message is a <em>large message</em> or a regular message.
- */
- boolean isLargeMessage();
+ /** Used to send this message to an encoded medium buffer.
+ * @param buffer the buffer used.
+ * @param deliveryCount Some protocols (AMQP) will have this as part of the message. */
+ void sendBuffer(ByteBuf buffer, int deliveryCount);
- /**
- * Returns the message body as an ActiveMQBuffer
- */
- ActiveMQBuffer getBodyBuffer();
+ int getPersistSize();
- /**
- * Writes the input byte array to the message body ActiveMQBuffer
- */
- Message writeBodyBufferBytes(byte[] bytes);
+ void persist(ActiveMQBuffer targetRecord);
- /**
- * Writes the input String to the message body ActiveMQBuffer
- */
- Message writeBodyBufferString(String string);
+ void reloadPersistence(ActiveMQBuffer record);
- /**
- * Returns a <em>copy</em> of the message body as an ActiveMQBuffer. Any modification
- * of this buffer should not impact the underlying buffer.
- */
- ActiveMQBuffer getBodyBufferDuplicate();
+ default void releaseBuffer() {
+ ByteBuf buffer = getBuffer();
+ if (buffer != null) {
+ buffer.release();
+ }
+ setBuffer(null);
+ }
+ default void referenceOriginalMessage(final Message original, String originalQueue) {
+ String queueOnMessage = original.getStringProperty(Message.HDR_ORIGINAL_QUEUE.toString());
- // Properties
- // -----------------------------------------------------------------
+ if (queueOnMessage != null) {
+ putStringProperty(Message.HDR_ORIGINAL_QUEUE.toString(), queueOnMessage);
+ } else if (originalQueue != null) {
+ putStringProperty(Message.HDR_ORIGINAL_QUEUE.toString(), originalQueue);
+ }
- /**
- * Puts a boolean property in this message.
- *
- * @param key property name
- * @param value property value
- */
- Message putBooleanProperty(SimpleString key, boolean value);
+ if (original.containsProperty(Message.HDR_ORIG_MESSAGE_ID.toString())) {
+ putStringProperty(Message.HDR_ORIGINAL_ADDRESS.toString(), original.getStringProperty(Message.HDR_ORIGINAL_ADDRESS.toString()));
- /**
- * @see #putBooleanProperty(SimpleString, boolean)
- */
- Message putBooleanProperty(String key, boolean value);
+ putLongProperty(Message.HDR_ORIG_MESSAGE_ID.toString(), original.getLongProperty(Message.HDR_ORIG_MESSAGE_ID.toString()));
+ } else {
+ putStringProperty(Message.HDR_ORIGINAL_ADDRESS.toString(), original.getAddress());
- /**
- * Puts a byte property in this message.
- *
- * @param key property name
- * @param value property value
- */
- Message putByteProperty(SimpleString key, byte value);
+ putLongProperty(Message.HDR_ORIG_MESSAGE_ID.toString(), original.getMessageID());
+ }
- /**
- * @see #putByteProperty(SimpleString, byte)
- */
- Message putByteProperty(String key, byte value);
+ // reset expiry
+ setExpiration(0);
+ }
/**
- * Puts a byte[] property in this message.
- *
- * @param key property name
- * @param value property value
+ * it will translate a property named HDR_DUPLICATE_DETECTION_ID.
+ * TODO-NOW: this can probably be replaced by an utility.
+ * @return
*/
- Message putBytesProperty(SimpleString key, byte[] value);
+ default byte[] getDuplicateIDBytes() {
+ Object duplicateID = getDuplicateProperty();
- /**
- * @see #putBytesProperty(SimpleString, byte[])
- */
- Message putBytesProperty(String key, byte[] value);
+ if (duplicateID == null) {
+ return null;
+ } else {
+ if (duplicateID instanceof SimpleString) {
+ return ((SimpleString) duplicateID).getData();
+ } else if (duplicateID instanceof String) {
+ return new SimpleString(duplicateID.toString()).getData();
+ } else {
+ return (byte[]) duplicateID;
+ }
+ }
+ }
/**
- * Puts a short property in this message.
- *
- * @param key property name
- * @param value property value
+ * it will translate a property named HDR_DUPLICATE_DETECTION_ID.
+ * TODO-NOW: this can probably be replaced by an utility.
+ * @return
*/
- Message putShortProperty(SimpleString key, short value);
+ default Object getDuplicateProperty() {
+ return getDeliveryAnnotationProperty(Message.HDR_DUPLICATE_DETECTION_ID);
+ }
- /**
- * @see #putShortProperty(SimpleString, short)
- */
- Message putShortProperty(String key, short value);
- /**
- * Puts a char property in this message.
- *
- * @param key property name
- * @param value property value
- */
- Message putCharProperty(SimpleString key, char value);
+ Message putBooleanProperty(String key, boolean value);
- /**
- * @see #putCharProperty(SimpleString, char)
- */
- Message putCharProperty(String key, char value);
+ Message putByteProperty(String key, byte value);
- /**
- * Puts an int property in this message.
- *
- * @param key property name
- * @param value property value
- */
- Message putIntProperty(SimpleString key, int value);
+ Message putBytesProperty(String key, byte[] value);
- /**
- * @see #putIntProperty(SimpleString, int)
- */
- Message putIntProperty(String key, int value);
+ Message putShortProperty(String key, short value);
- /**
- * Puts a long property in this message.
- *
- * @param key property name
- * @param value property value
- */
- Message putLongProperty(SimpleString key, long value);
+ Message putCharProperty(String key, char value);
- /**
- * @see #putLongProperty(SimpleString, long)
- */
- Message putLongProperty(String key, long value);
+ Message putIntProperty(String key, int value);
- /**
- * Puts a float property in this message.
- *
- * @param key property name
- * @param value property value
- */
- Message putFloatProperty(SimpleString key, float value);
+ Message putLongProperty(String key, long value);
- /**
- * @see #putFloatProperty(SimpleString, float)
- */
Message putFloatProperty(String key, float value);
- /**
- * Puts a double property in this message.
- *
- * @param key property name
- * @param value property value
- */
- Message putDoubleProperty(SimpleString key, double value);
-
- /**
- * @see #putDoubleProperty(SimpleString, double)
- */
Message putDoubleProperty(String key, double value);
- /**
- * Puts a SimpleString property in this message.
- *
- * @param key property name
- * @param value property value
- */
- Message putStringProperty(SimpleString key, SimpleString value);
+
+
+ Message putBooleanProperty(SimpleString key, boolean value);
+
+ Message putByteProperty(SimpleString key, byte value);
+
+ Message putBytesProperty(SimpleString key, byte[] value);
+
+ Message putShortProperty(SimpleString key, short value);
+
+ Message putCharProperty(SimpleString key, char value);
+
+ Message putIntProperty(SimpleString key, int value);
+
+ Message putLongProperty(SimpleString key, long value);
+
+ Message putFloatProperty(SimpleString key, float value);
+
+ Message putDoubleProperty(SimpleString key, double value);
/**
* Puts a String property in this message.
@@ -397,202 +457,127 @@ public interface Message {
*/
Message putStringProperty(String key, String value);
- /**
- * Puts an Object property in this message. <br>
- * Accepted types are:
- * <ul>
- * <li>Boolean</li>
- * <li>Byte</li>
- * <li>Short</li>
- * <li>Character</li>
- * <li>Integer</li>
- * <li>Long</li>
- * <li>Float</li>
- * <li>Double</li>
- * <li>String</li>
- * <li>SimpleString</li>
- * </ul>
- * Using any other type will throw a PropertyConversionException.
- *
- * @param key property name
- * @param value property value
- * @throws ActiveMQPropertyConversionException if the value is not one of the accepted property
- * types.
- */
- Message putObjectProperty(SimpleString key, Object value) throws ActiveMQPropertyConversionException;
-
- /**
- * @see #putObjectProperty(SimpleString, Object)
- */
Message putObjectProperty(String key, Object value) throws ActiveMQPropertyConversionException;
- /**
- * Removes the property corresponding to the specified key.
- *
- * @param key property name
- * @return the value corresponding to the specified key or @{code null}
- */
- Object removeProperty(SimpleString key);
+ Message putObjectProperty(SimpleString key, Object value) throws ActiveMQPropertyConversionException;
- /**
- * @see #removeProperty(SimpleString)
- */
Object removeProperty(String key);
- /**
- * Returns {@code true} if this message contains a property with the given key, {@code false} else.
- *
- * @param key property name
- */
- boolean containsProperty(SimpleString key);
-
- /**
- * @see #containsProperty(SimpleString)
- */
boolean containsProperty(String key);
- /**
- * Returns the property corresponding to the specified key as a Boolean.
- *
- * @throws ActiveMQPropertyConversionException if the value can not be converted to a Boolean
- */
- Boolean getBooleanProperty(SimpleString key) throws ActiveMQPropertyConversionException;
-
- /**
- * @see #getBooleanProperty(SimpleString)
- */
Boolean getBooleanProperty(String key) throws ActiveMQPropertyConversionException;
- /**
- * Returns the property corresponding to the specified key as a Byte.
- *
- * @throws ActiveMQPropertyConversionException if the value can not be converted to a Byte
- */
- Byte getByteProperty(SimpleString key) throws ActiveMQPropertyConversionException;
-
- /**
- * @see #getByteProperty(SimpleString)
- */
Byte getByteProperty(String key) throws ActiveMQPropertyConversionException;
- /**
- * Returns the property corresponding to the specified key as a Double.
- *
- * @throws ActiveMQPropertyConversionException if the value can not be converted to a Double
- */
- Double getDoubleProperty(SimpleString key) throws ActiveMQPropertyConversionException;
-
- /**
- * @see #getDoubleProperty(SimpleString)
- */
Double getDoubleProperty(String key) throws ActiveMQPropertyConversionException;
- /**
- * Returns the property corresponding to the specified key as an Integer.
- *
- * @throws ActiveMQPropertyConversionException if the value can not be converted to an Integer
- */
- Integer getIntProperty(SimpleString key) throws ActiveMQPropertyConversionException;
-
- /**
- * @see #getIntProperty(SimpleString)
- */
Integer getIntProperty(String key) throws ActiveMQPropertyConversionException;
- /**
- * Returns the property corresponding to the specified key as a Long.
- *
- * @throws ActiveMQPropertyConversionException if the value can not be converted to a Long
- */
- Long getLongProperty(SimpleString key) throws ActiveMQPropertyConversionException;
-
- /**
- * @see #getLongProperty(SimpleString)
- */
Long getLongProperty(String key) throws ActiveMQPropertyConversionException;
- /**
- * Returns the property corresponding to the specified key
- */
+ Object getObjectProperty(String key);
+
+ Short getShortProperty(String key) throws ActiveMQPropertyConversionException;
+
+ Float getFloatProperty(String key) throws ActiveMQPropertyConversionException;
+
+ String getStringProperty(String key) throws ActiveMQPropertyConversionException;
+
+ SimpleString getSimpleStringProperty(String key) throws ActiveMQPropertyConversionException;
+
+ byte[] getBytesProperty(String key) throws ActiveMQPropertyConversionException;
+
+ Object removeProperty(SimpleString key);
+
+ boolean containsProperty(SimpleString key);
+
+ Boolean getBooleanProperty(SimpleString key) throws ActiveMQPropertyConversionException;
+
+ Byte getByteProperty(SimpleString key) throws ActiveMQPropertyConversionException;
+
+ Double getDoubleProperty(SimpleString key) throws ActiveMQPropertyConversionException;
+
+ Integer getIntProperty(SimpleString key) throws ActiveMQPropertyConversionException;
+
+ Long getLongProperty(SimpleString key) throws ActiveMQPropertyConversionException;
+
Object getObjectProperty(SimpleString key);
- /**
- * @see #getBooleanProperty(SimpleString)
- */
- Object getObjectProperty(String key);
+ Object removeDeliveryAnnoationProperty(SimpleString key);
- /**
- * Returns the property corresponding to the specified key as a Short.
- *
- * @throws ActiveMQPropertyConversionException if the value can not be converted to a Short
- */
- Short getShortProperty(SimpleString key) throws ActiveMQPropertyConversionException;
+ Object getDeliveryAnnotationProperty(SimpleString key);
- /**
- * @see #getShortProperty(SimpleString)
- */
- Short getShortProperty(String key) throws ActiveMQPropertyConversionException;
+ Short getShortProperty(SimpleString key) throws ActiveMQPropertyConversionException;
- /**
- * Returns the property corresponding to the specified key as a Float.
- *
- * @throws ActiveMQPropertyConversionException if the value can not be converted to a Float
- */
Float getFloatProperty(SimpleString key) throws ActiveMQPropertyConversionException;
- /**
- * @see #getFloatProperty(SimpleString)
- */
- Float getFloatProperty(String key) throws ActiveMQPropertyConversionException;
-
- /**
- * Returns the property corresponding to the specified key as a String.
- *
- * @throws ActiveMQPropertyConversionException if the value can not be converted to a String
- */
String getStringProperty(SimpleString key) throws ActiveMQPropertyConversionException;
- /**
- * @see #getStringProperty(SimpleString)
- */
- String getStringProperty(String key) throws ActiveMQPropertyConversionException;
-
- /**
- * Returns the property corresponding to the specified key as a SimpleString.
- *
- * @throws ActiveMQPropertyConversionException if the value can not be converted to a SimpleString
- */
SimpleString getSimpleStringProperty(SimpleString key) throws ActiveMQPropertyConversionException;
- /**
- * @see #getSimpleStringProperty(SimpleString)
- */
- SimpleString getSimpleStringProperty(String key) throws ActiveMQPropertyConversionException;
-
- /**
- * Returns the property corresponding to the specified key as a byte[].
- *
- * @throws ActiveMQPropertyConversionException if the value can not be converted to a byte[]
- */
byte[] getBytesProperty(SimpleString key) throws ActiveMQPropertyConversionException;
+ Message putStringProperty(SimpleString key, SimpleString value);
+
/**
- * @see #getBytesProperty(SimpleString)
+ * Returns the size of the <em>encoded</em> message.
*/
- byte[] getBytesProperty(String key) throws ActiveMQPropertyConversionException;
+ int getEncodeSize();
/**
* Returns all the names of the properties for this message.
*/
Set<SimpleString> getPropertyNames();
+
+
+ int getRefCount();
+
+ int incrementRefCount() throws Exception;
+
+ int decrementRefCount() throws Exception;
+
+ int incrementDurableRefCount();
+
+ int decrementDurableRefCount();
+
/**
* @return Returns the message in Map form, useful when encoding to JSON
*/
- Map<String, Object> toMap();
+ default Map<String, Object> toMap() {
+ Map map = toPropertyMap();
+ map.put("messageID", getMessageID());
+ Object userID = getUserID();
+ if (getUserID() != null) {
+ map.put("userID", "ID:" + userID.toString());
+ }
+
+ map.put("address", getAddress());
+ map.put("durable", isDurable());
+ map.put("expiration", getExpiration());
+ map.put("timestamp", getTimestamp());
+ map.put("priority", (int)getPriority());
+
+ return map;
+ }
/**
* @return Returns the message properties in Map form, useful when encoding to JSON
*/
- Map<String, Object> toPropertyMap();
+ default Map<String, Object> toPropertyMap() {
+ Map map = new HashMap<>();
+ for (SimpleString name : getPropertyNames()) {
+ map.put(name.toString(), getObjectProperty(name.toString()));
+ }
+ return map;
+ }
+
+
+ /** This should make you convert your message into Core format. */
+ ICoreMessage toCore();
+
+ int getMemoryEstimate();
+
+
+
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/RefCountMessage.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/RefCountMessage.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/RefCountMessage.java
new file mode 100644
index 0000000..64dd44d
--- /dev/null
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/RefCountMessage.java
@@ -0,0 +1,81 @@
+/**
+ * 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.api.core;
+
+import java.util.concurrent.atomic.AtomicInteger;
+
+public abstract class RefCountMessage implements Message {
+
+ private final AtomicInteger durableRefCount = new AtomicInteger();
+
+ private final AtomicInteger refCount = new AtomicInteger();
+
+ private RefCountMessageListener context;
+
+ @Override
+ public Message setContext(RefCountMessageListener context) {
+ this.context = context;
+ return this;
+ }
+
+ @Override
+ public RefCountMessageListener getContext() {
+ return context;
+ }
+
+ @Override
+ public int getRefCount() {
+ return refCount.get();
+ }
+
+ @Override
+ public int incrementRefCount() throws Exception {
+ int count = refCount.incrementAndGet();
+ if (context != null) {
+ context.nonDurableUp(this, count);
+ }
+ return count;
+ }
+
+ @Override
+ public int incrementDurableRefCount() {
+ int count = durableRefCount.incrementAndGet();
+ if (context != null) {
+ context.durableUp(this, count);
+ }
+ return count;
+ }
+
+ @Override
+ public int decrementDurableRefCount() {
+ int count = durableRefCount.decrementAndGet();
+ if (context != null) {
+ context.durableDown(this, count);
+ }
+ return count;
+ }
+
+ @Override
+ public int decrementRefCount() throws Exception {
+ int count = refCount.decrementAndGet();
+ if (context != null) {
+ context.nonDurableDown(this, count);
+ }
+ return count;
+ }
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/RefCountMessageListener.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/RefCountMessageListener.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/RefCountMessageListener.java
new file mode 100644
index 0000000..e68dffd
--- /dev/null
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/RefCountMessageListener.java
@@ -0,0 +1,31 @@
+/**
+ * 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.api.core;
+
+/** If {@link Message#getContext()} != null and is implementing this interface.
+ * These methods will be called during refCount operations */
+public interface RefCountMessageListener {
+
+ void durableUp(Message message, int durableCount);
+
+ void durableDown(Message message, int durableCount);
+
+ void nonDurableUp(Message message, int nonDurableCoun);
+
+ void nonDurableDown(Message message, int nonDurableCoun);
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/client/ClientMessage.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/client/ClientMessage.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/client/ClientMessage.java
index e87d365..67f2150 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/client/ClientMessage.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/client/ClientMessage.java
@@ -19,14 +19,15 @@ package org.apache.activemq.artemis.api.core.client;
import java.io.InputStream;
import java.io.OutputStream;
+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.ICoreMessage;
import org.apache.activemq.artemis.api.core.SimpleString;
/**
* A ClientMessage represents a message sent and/or received by ActiveMQ Artemis.
*/
-public interface ClientMessage extends Message {
+public interface ClientMessage extends ICoreMessage {
/**
* Returns the number of times this message was delivered.
@@ -123,135 +124,141 @@ public interface ClientMessage extends Message {
ClientMessage setBodyInputStream(InputStream bodyInputStream);
/**
- * Overridden from {@link Message} to enable fluent API
+ * Return the bodyInputStream for large messages
+ * @return
+ */
+ @Override
+ InputStream getBodyInputStream();
+
+ /**
+ * The buffer to write the body.
+ * @return
+ */
+ @Override
+ ActiveMQBuffer getBodyBuffer();
+
+ /**
+ * Overridden from {@link org.apache.activemq.artemis.api.core.Message} to enable fluent API
*/
@Override
ClientMessage putBooleanProperty(SimpleString key, boolean value);
/**
- * Overridden from {@link Message} to enable fluent API
+ * Overridden from {@link org.apache.activemq.artemis.api.core.Message} to enable fluent API
*/
@Override
ClientMessage putBooleanProperty(String key, boolean value);
/**
- * Overridden from {@link Message} to enable fluent API
+ * Overridden from {@link org.apache.activemq.artemis.api.core.Message} to enable fluent API
*/
@Override
ClientMessage putByteProperty(SimpleString key, byte value);
/**
- * Overridden from {@link Message} to enable fluent API
+ * Overridden from {@link org.apache.activemq.artemis.api.core.Message} to enable fluent API
*/
@Override
ClientMessage putByteProperty(String key, byte value);
/**
- * Overridden from {@link Message} to enable fluent API
+ * Overridden from {@link org.apache.activemq.artemis.api.core.Message} to enable fluent API
*/
@Override
ClientMessage putBytesProperty(SimpleString key, byte[] value);
/**
- * Overridden from {@link Message} to enable fluent API
+ * Overridden from {@link org.apache.activemq.artemis.api.core.Message} to enable fluent API
*/
@Override
ClientMessage putBytesProperty(String key, byte[] value);
/**
- * Overridden from {@link Message} to enable fluent API
+ * Overridden from {@link org.apache.activemq.artemis.api.core.Message} to enable fluent API
*/
@Override
ClientMessage putShortProperty(SimpleString key, short value);
/**
- * Overridden from {@link Message} to enable fluent API
+ * Overridden from {@link org.apache.activemq.artemis.api.core.Message} to enable fluent API
*/
@Override
ClientMessage putShortProperty(String key, short value);
/**
- * Overridden from {@link Message} to enable fluent API
+ * Overridden from {@link org.apache.activemq.artemis.api.core.Message} to enable fluent API
*/
@Override
ClientMessage putCharProperty(SimpleString key, char value);
/**
- * Overridden from {@link Message} to enable fluent API
+ * Overridden from {@link org.apache.activemq.artemis.api.core.Message} to enable fluent API
*/
@Override
ClientMessage putCharProperty(String key, char value);
/**
- * Overridden from {@link Message} to enable fluent API
+ * Overridden from {@link org.apache.activemq.artemis.api.core.Message} to enable fluent API
*/
@Override
ClientMessage putIntProperty(SimpleString key, int value);
/**
- * Overridden from {@link Message} to enable fluent API
+ * Overridden from {@link org.apache.activemq.artemis.api.core.Message} to enable fluent API
*/
@Override
ClientMessage putIntProperty(String key, int value);
/**
- * Overridden from {@link Message} to enable fluent API
+ * Overridden from {@link org.apache.activemq.artemis.api.core.Message} to enable fluent API
*/
@Override
ClientMessage putLongProperty(SimpleString key, long value);
/**
- * Overridden from {@link Message} to enable fluent API
+ * Overridden from {@link org.apache.activemq.artemis.api.core.Message} to enable fluent API
*/
@Override
ClientMessage putLongProperty(String key, long value);
/**
- * Overridden from {@link Message} to enable fluent API
+ * Overridden from {@link org.apache.activemq.artemis.api.core.Message} to enable fluent API
*/
@Override
ClientMessage putFloatProperty(SimpleString key, float value);
/**
- * Overridden from {@link Message} to enable fluent API
+ * Overridden from {@link org.apache.activemq.artemis.api.core.Message} to enable fluent API
*/
@Override
ClientMessage putFloatProperty(String key, float value);
/**
- * Overridden from {@link Message} to enable fluent API
+ * Overridden from {@link org.apache.activemq.artemis.api.core.Message} to enable fluent API
*/
@Override
ClientMessage putDoubleProperty(SimpleString key, double value);
/**
- * Overridden from {@link Message} to enable fluent API
+ * Overridden from {@link org.apache.activemq.artemis.api.core.Message} to enable fluent API
*/
@Override
ClientMessage putDoubleProperty(String key, double value);
/**
- * Overridden from {@link Message} to enable fluent API
- */
- @Override
- ClientMessage putStringProperty(SimpleString key, SimpleString value);
-
- /**
- * Overridden from {@link Message} to enable fluent API
+ * Overridden from {@link org.apache.activemq.artemis.api.core.Message} to enable fluent API
*/
@Override
ClientMessage putStringProperty(String key, String value);
/**
- * Overridden from {@link Message} to enable fluent API
+ * Overridden from {@link org.apache.activemq.artemis.api.core.Message} to enable fluent API
*/
- @Override
ClientMessage writeBodyBufferBytes(byte[] bytes);
/**
- * Overridden from {@link Message} to enable fluent API
+ * Overridden from {@link org.apache.activemq.artemis.api.core.Message} to enable fluent API
*/
- @Override
ClientMessage writeBodyBufferString(String string);
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/encode/BodyType.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/encode/BodyType.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/encode/BodyType.java
new file mode 100644
index 0000000..743583b
--- /dev/null
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/encode/BodyType.java
@@ -0,0 +1,22 @@
+/**
+ * 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.api.core.encode;
+
+public enum BodyType {
+ Undefined, Bytes, Map, Object, Stream, Text
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/encode/MessageBody.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/encode/MessageBody.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/encode/MessageBody.java
new file mode 100644
index 0000000..f7821b9
--- /dev/null
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/encode/MessageBody.java
@@ -0,0 +1,28 @@
+/**
+ * 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.api.core.encode;
+
+import java.nio.ByteBuffer;
+
+public interface MessageBody {
+ Object getBody();
+
+ ByteBuffer getBodyArray();
+
+ BodyType getType();
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ManagementHelper.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ManagementHelper.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ManagementHelper.java
index 40211c1..946285d 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ManagementHelper.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/api/core/management/ManagementHelper.java
@@ -18,9 +18,11 @@ package org.apache.activemq.artemis.api.core.management;
import javax.json.JsonArray;
+import org.apache.activemq.artemis.api.core.ICoreMessage;
import org.apache.activemq.artemis.api.core.JsonUtil;
import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
/**
* Helper class to use ActiveMQ Artemis Core messages to manage server resources.
@@ -86,7 +88,7 @@ public final class ManagementHelper {
* @param attribute the name of the attribute
* @see ResourceNames
*/
- public static void putAttribute(final Message message, final String resourceName, final String attribute) {
+ public static void putAttribute(final ICoreMessage message, final String resourceName, final String attribute) {
message.putStringProperty(ManagementHelper.HDR_RESOURCE_NAME, new SimpleString(resourceName));
message.putStringProperty(ManagementHelper.HDR_ATTRIBUTE, new SimpleString(attribute));
}
@@ -99,7 +101,7 @@ public final class ManagementHelper {
* @param operationName the name of the operation to invoke on the resource
* @see ResourceNames
*/
- public static void putOperationInvocation(final Message message,
+ public static void putOperationInvocation(final ICoreMessage message,
final String resourceName,
final String operationName) throws Exception {
ManagementHelper.putOperationInvocation(message, resourceName, operationName, (Object[]) null);
@@ -114,7 +116,7 @@ public final class ManagementHelper {
* @param parameters the parameters to use to invoke the server resource
* @see ResourceNames
*/
- public static void putOperationInvocation(final Message message,
+ public static void putOperationInvocation(final ICoreMessage message,
final String resourceName,
final String operationName,
final Object... parameters) throws Exception {
@@ -141,7 +143,7 @@ public final class ManagementHelper {
* Used by ActiveMQ Artemis management service.
*/
public static Object[] retrieveOperationParameters(final Message message) throws Exception {
- SimpleString sstring = message.getBodyBuffer().readNullableSimpleString();
+ SimpleString sstring = message.toCore().getReadOnlyBodyBuffer().readNullableSimpleString();
String jsonString = (sstring == null) ? null : sstring.toString();
if (jsonString != null) {
@@ -170,7 +172,7 @@ public final class ManagementHelper {
/**
* Used by ActiveMQ Artemis management service.
*/
- public static void storeResult(final Message message, final Object result) throws Exception {
+ public static void storeResult(final CoreMessage message, final Object result) throws Exception {
String resultString;
if (result != null) {
@@ -192,7 +194,7 @@ public final class ManagementHelper {
* If an error occurred on the server, {@link #hasOperationSucceeded(Message)} will return {@code false}.
* and the result will be a String corresponding to the server exception.
*/
- public static Object[] getResults(final Message message) throws Exception {
+ public static Object[] getResults(final ICoreMessage message) throws Exception {
SimpleString sstring = message.getBodyBuffer().readNullableSimpleString();
String jsonString = (sstring == null) ? null : sstring.toString();
@@ -210,7 +212,7 @@ public final class ManagementHelper {
* If an error occurred on the server, {@link #hasOperationSucceeded(Message)} will return {@code false}.
* and the result will be a String corresponding to the server exception.
*/
- public static Object getResult(final Message message) throws Exception {
+ public static Object getResult(final ICoreMessage message) throws Exception {
return getResult(message, null);
}
@@ -220,7 +222,7 @@ public final class ManagementHelper {
* If an error occurred on the server, {@link #hasOperationSucceeded(Message)} will return {@code false}.
* and the result will be a String corresponding to the server exception.
*/
- public static Object getResult(final Message message, Class desiredType) throws Exception {
+ public static Object getResult(final ICoreMessage message, Class desiredType) throws Exception {
Object[] res = ManagementHelper.getResults(message);
if (res != null) {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/buffers/impl/ResetLimitWrappedActiveMQBuffer.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/buffers/impl/ResetLimitWrappedActiveMQBuffer.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/buffers/impl/ResetLimitWrappedActiveMQBuffer.java
index 900305f..b5d5474 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/buffers/impl/ResetLimitWrappedActiveMQBuffer.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/buffers/impl/ResetLimitWrappedActiveMQBuffer.java
@@ -20,18 +20,18 @@ import java.nio.ByteBuffer;
import io.netty.buffer.ByteBuf;
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.MessageInternal;
/**
* A ResetLimitWrappedActiveMQBuffer
- * TODO: Move this to commons
*/
public final class ResetLimitWrappedActiveMQBuffer extends ChannelBufferWrapper {
private final int limit;
- private MessageInternal message;
+ private Message message;
/**
* We need to turn of notifications of body changes on reset on the server side when dealing with AMQP conversions,
@@ -39,17 +39,17 @@ public final class ResetLimitWrappedActiveMQBuffer extends ChannelBufferWrapper
*
* @param message
*/
- public void setMessage(MessageInternal message) {
+ public void setMessage(Message message) {
this.message = message;
}
- public ResetLimitWrappedActiveMQBuffer(final int limit, final ActiveMQBuffer buffer, final MessageInternal message) {
+ public ResetLimitWrappedActiveMQBuffer(final int limit, final ActiveMQBuffer buffer, final Message message) {
// a wrapped inside a wrapper will increase the stack size.
// we fixed this here due to some profiling testing
this(limit, unwrap(buffer.byteBuf()).duplicate(), message);
}
- public ResetLimitWrappedActiveMQBuffer(final int limit, final ByteBuf buffer, final MessageInternal message) {
+ public ResetLimitWrappedActiveMQBuffer(final int limit, final ByteBuf buffer, final Message message) {
// a wrapped inside a wrapper will increase the stack size.
// we fixed this here due to some profiling testing
super(buffer);
@@ -67,7 +67,7 @@ public final class ResetLimitWrappedActiveMQBuffer extends ChannelBufferWrapper
private void changed() {
if (message != null) {
- message.bodyChanged();
+ message.messageChanged();
}
}
@@ -94,8 +94,6 @@ public final class ResetLimitWrappedActiveMQBuffer extends ChannelBufferWrapper
@Override
public void resetReaderIndex() {
- changed();
-
buffer.readerIndex(limit);
}
@@ -256,6 +254,14 @@ public final class ResetLimitWrappedActiveMQBuffer extends ChannelBufferWrapper
super.writeBytes(src);
}
+
+ @Override
+ public void writeBytes(final ByteBuf src, final int srcIndex, final int length) {
+ changed();
+
+ super.writeBytes(src, srcIndex, length);
+ }
+
@Override
public void writeBytes(final ActiveMQBuffer src, final int srcIndex, final int length) {
changed();
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientConsumerImpl.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientConsumerImpl.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientConsumerImpl.java
index 2b4ab7e..82af968 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientConsumerImpl.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientConsumerImpl.java
@@ -569,7 +569,7 @@ public final class ClientConsumerImpl implements ClientConsumerInternal {
private void handleRegularMessage(ClientMessageInternal message) {
if (message.getAddress() == null) {
- message.setAddressTransient(queueInfo.getAddress());
+ message.setAddress(queueInfo.getAddress());
}
message.onReceipt(this);
@@ -625,7 +625,7 @@ public final class ClientConsumerImpl implements ClientConsumerInternal {
currentLargeMessageController.setLocal(true);
//sets the packet
- ActiveMQBuffer qbuff = clMessage.getBodyBuffer();
+ ActiveMQBuffer qbuff = clMessage.toCore().getBodyBuffer();
int bytesToRead = qbuff.writerIndex() - qbuff.readerIndex();
final byte[] body = ByteUtil.getActiveArray(qbuff.readBytes(bytesToRead).toByteBuffer());
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientLargeMessageImpl.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientLargeMessageImpl.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientLargeMessageImpl.java
index c3cbceb..cbfaf6f 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientLargeMessageImpl.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientLargeMessageImpl.java
@@ -59,7 +59,7 @@ public final class ClientLargeMessageImpl extends ClientMessageImpl implements C
@Override
public int getEncodeSize() {
- if (bodyBuffer != null) {
+ if (writableBuffer != null) {
return super.getEncodeSize();
} else {
return DataConstants.SIZE_INT + DataConstants.SIZE_INT + getHeadersAndPropertiesEncodeSize();
@@ -93,7 +93,7 @@ public final class ClientLargeMessageImpl extends ClientMessageImpl implements C
throw new RuntimeException(e.getMessage(), e);
}
- return bodyBuffer;
+ return writableBuffer;
}
@Override
@@ -108,7 +108,7 @@ public final class ClientLargeMessageImpl extends ClientMessageImpl implements C
@Override
public void saveToOutputStream(final OutputStream out) throws ActiveMQException {
- if (bodyBuffer != null) {
+ if (writableBuffer != null) {
// The body was rebuilt on the client, so we need to behave as a regular message on this case
super.saveToOutputStream(out);
} else {
@@ -118,7 +118,7 @@ public final class ClientLargeMessageImpl extends ClientMessageImpl implements C
@Override
public ClientLargeMessageImpl setOutputStream(final OutputStream out) throws ActiveMQException {
- if (bodyBuffer != null) {
+ if (writableBuffer != null) {
super.setOutputStream(out);
} else {
largeMessageController.setOutputStream(out);
@@ -129,7 +129,7 @@ public final class ClientLargeMessageImpl extends ClientMessageImpl implements C
@Override
public boolean waitOutputStreamCompletion(final long timeMilliseconds) throws ActiveMQException {
- if (bodyBuffer != null) {
+ if (writableBuffer != null) {
return super.waitOutputStreamCompletion(timeMilliseconds);
} else {
return largeMessageController.waitCompletion(timeMilliseconds);
@@ -138,7 +138,7 @@ public final class ClientLargeMessageImpl extends ClientMessageImpl implements C
@Override
public void discardBody() {
- if (bodyBuffer != null) {
+ if (writableBuffer != null) {
super.discardBody();
} else {
largeMessageController.discardUnusedPackets();
@@ -146,17 +146,17 @@ public final class ClientLargeMessageImpl extends ClientMessageImpl implements C
}
private void checkBuffer() throws ActiveMQException {
- if (bodyBuffer == null) {
+ if (writableBuffer == null) {
long bodySize = this.largeMessageSize + BODY_OFFSET;
if (bodySize > Integer.MAX_VALUE) {
bodySize = Integer.MAX_VALUE;
}
- createBody((int) bodySize);
+ initBuffer((int) bodySize);
- bodyBuffer = new ResetLimitWrappedActiveMQBuffer(BODY_OFFSET, buffer, this);
+ writableBuffer = new ResetLimitWrappedActiveMQBuffer(BODY_OFFSET, buffer.duplicate(), this);
- largeMessageController.saveBuffer(new ActiveMQOutputStream(bodyBuffer));
+ largeMessageController.saveBuffer(new ActiveMQOutputStream(writableBuffer));
}
}
@@ -178,7 +178,7 @@ public final class ClientLargeMessageImpl extends ClientMessageImpl implements C
public void retrieveExistingData(ClientMessageInternal clMessage) {
this.messageID = clMessage.getMessageID();
- this.address = clMessage.getAddress();
+ this.address = clMessage.getAddressSimpleString();
this.setUserID(clMessage.getUserID());
this.setFlowControlSize(clMessage.getFlowControlSize());
this.setDeliveryCount(clMessage.getDeliveryCount());
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientMessageImpl.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientMessageImpl.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientMessageImpl.java
index 7bf8eb7..252ae86 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientMessageImpl.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientMessageImpl.java
@@ -28,14 +28,16 @@ import org.apache.activemq.artemis.api.core.ActiveMQPropertyConversionException;
import org.apache.activemq.artemis.api.core.Message;
import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.core.client.ActiveMQClientMessageBundle;
-import org.apache.activemq.artemis.core.message.BodyEncoder;
-import org.apache.activemq.artemis.core.message.impl.MessageImpl;
+import org.apache.activemq.artemis.core.message.LargeBodyEncoder;
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
import org.apache.activemq.artemis.reader.MessageUtil;
+import org.apache.activemq.artemis.utils.TypedProperties;
+import org.apache.activemq.artemis.utils.UUID;
/**
* A ClientMessageImpl
*/
-public class ClientMessageImpl extends MessageImpl implements ClientMessageInternal {
+public class ClientMessageImpl extends CoreMessage implements ClientMessageInternal {
// added this constant here so that the client package have no dependency on JMS
public static final SimpleString REPLYTO_HEADER_NAME = MessageUtil.REPLYTO_HEADER_NAME;
@@ -57,6 +59,35 @@ public class ClientMessageImpl extends MessageImpl implements ClientMessageInter
public ClientMessageImpl() {
}
+ protected ClientMessageImpl(ClientMessageImpl other) {
+ super(other);
+ }
+
+ @Override
+ public ClientMessageImpl setDurable(boolean durable) {
+ super.setDurable(durable);
+ return this;
+ }
+
+ @Override
+ public ClientMessageImpl setExpiration(long expiration) {
+ super.setExpiration(expiration);
+ return this;
+ }
+
+ @Override
+ public ClientMessageImpl setPriority(byte priority) {
+ super.setPriority(priority);
+ return this;
+ }
+
+ @Override
+ public ClientMessageImpl setUserID(UUID userID) {
+
+ return this;
+ }
+
+
/*
* Construct messages before sending
*/
@@ -66,12 +97,13 @@ public class ClientMessageImpl extends MessageImpl implements ClientMessageInter
final long timestamp,
final byte priority,
final int initialMessageBufferSize) {
- super(type, durable, expiration, timestamp, priority, initialMessageBufferSize);
+ this.setType(type).setExpiration(expiration).setTimestamp(timestamp).setDurable(durable).
+ setPriority(priority).initBuffer(initialMessageBufferSize);
}
@Override
- public boolean isServerMessage() {
- return false;
+ public TypedProperties getProperties() {
+ return this.checkProperties();
}
@Override
@@ -108,6 +140,11 @@ public class ClientMessageImpl extends MessageImpl implements ClientMessageInter
return this;
}
+
+ @Override
+ public void checkCompletion() throws ActiveMQException {
+ }
+
@Override
public int getFlowControlSize() {
if (flowControlSize < 0) {
@@ -141,7 +178,7 @@ public class ClientMessageImpl extends MessageImpl implements ClientMessageInter
@Override
public String toString() {
- return getClass().getSimpleName() + "[messageID=" + messageID + ", durable=" + durable + ", address=" + getAddress() + ",userID=" + (getUserID() != null ? getUserID() : "null") + ",properties=" + properties.toString() + "]";
+ return getClass().getSimpleName() + "[messageID=" + messageID + ", durable=" + durable + ", address=" + getAddress() + ",userID=" + (getUserID() != null ? getUserID() : "null") + ",properties=" + getProperties().toString() + "]";
}
@Override
@@ -189,7 +226,7 @@ public class ClientMessageImpl extends MessageImpl implements ClientMessageInter
}
@Override
- public BodyEncoder getBodyEncoder() throws ActiveMQException {
+ public LargeBodyEncoder getBodyEncoder() throws ActiveMQException {
return new DecodingContext();
}
@@ -307,15 +344,17 @@ public class ClientMessageImpl extends MessageImpl implements ClientMessageInter
@Override
public ClientMessageImpl writeBodyBufferBytes(byte[] bytes) {
- return (ClientMessageImpl) super.writeBodyBufferBytes(bytes);
+ getBodyBuffer().writeBytes(bytes);
+ return this;
}
@Override
public ClientMessageImpl writeBodyBufferString(String string) {
- return (ClientMessageImpl) super.writeBodyBufferString(string);
+ getBodyBuffer().writeString(string);
+ return this;
}
- private final class DecodingContext implements BodyEncoder {
+ private final class DecodingContext implements LargeBodyEncoder {
private DecodingContext() {
}
@@ -347,9 +386,15 @@ public class ClientMessageImpl extends MessageImpl implements ClientMessageInter
@Override
public int encode(final ActiveMQBuffer bufferOut, final int size) {
byte[] bytes = new byte[size];
- getWholeBuffer().readBytes(bytes);
+ buffer.readBytes(bytes);
bufferOut.writeBytes(bytes, 0, size);
return size;
}
}
+
+ @Override
+ public Message copy() {
+ return new ClientMessageImpl(this);
+ }
+
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientMessageInternal.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientMessageInternal.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientMessageInternal.java
index 07d4719..4b87878 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientMessageInternal.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientMessageInternal.java
@@ -16,7 +16,6 @@
*/
package org.apache.activemq.artemis.core.client.impl;
-import org.apache.activemq.artemis.api.core.SimpleString;
import org.apache.activemq.artemis.api.core.client.ClientMessage;
import org.apache.activemq.artemis.utils.TypedProperties;
@@ -34,8 +33,6 @@ public interface ClientMessageInternal extends ClientMessage {
*/
void setFlowControlSize(int flowControlSize);
- void setAddressTransient(SimpleString address);
-
void onReceipt(ClientConsumerInternal consumer);
/**
@@ -44,4 +41,5 @@ public interface ClientMessageInternal extends ClientMessage {
void discardBody();
boolean isCompressed();
+
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientProducerImpl.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientProducerImpl.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientProducerImpl.java
index 1dfbe72..ce4a8a1 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientProducerImpl.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/ClientProducerImpl.java
@@ -23,12 +23,12 @@ import java.util.concurrent.atomic.AtomicLong;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
import org.apache.activemq.artemis.api.core.ActiveMQBuffers;
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.api.core.SimpleString;
import org.apache.activemq.artemis.api.core.client.SendAcknowledgementHandler;
import org.apache.activemq.artemis.core.client.ActiveMQClientMessageBundle;
-import org.apache.activemq.artemis.core.message.BodyEncoder;
-import org.apache.activemq.artemis.core.message.impl.MessageInternal;
+import org.apache.activemq.artemis.core.message.LargeBodyEncoder;
import org.apache.activemq.artemis.spi.core.remoting.SessionContext;
import org.apache.activemq.artemis.utils.ActiveMQBufferInputStream;
import org.apache.activemq.artemis.utils.DeflaterReader;
@@ -208,7 +208,7 @@ public class ClientProducerImpl implements ClientProducerInternal {
}
private void doSend(SimpleString sendingAddress,
- final Message msg,
+ final Message msgToSend,
final SendAcknowledgementHandler handler,
final boolean forceAsync) throws ActiveMQException {
if (sendingAddress == null) {
@@ -217,7 +217,8 @@ public class ClientProducerImpl implements ClientProducerInternal {
session.startCall();
try {
- MessageInternal msgI = (MessageInternal) msg;
+ // In case we received message from another protocol, we first need to convert it to core as the ClientProducer only understands core
+ ICoreMessage msg = msgToSend.toCore();
ClientProducerCredits theCredits;
@@ -225,8 +226,8 @@ public class ClientProducerImpl implements ClientProducerInternal {
// a note about the second check on the writerIndexSize,
// If it's a server's message, it means this is being done through the bridge or some special consumer on the
// server's on which case we can't' convert the message into large at the servers
- if (sessionContext.supportsLargeMessage() && (msgI.getBodyInputStream() != null || msgI.isLargeMessage() ||
- msgI.getBodyBuffer().writerIndex() > minLargeMessageSize && !msgI.isServerMessage())) {
+ if (sessionContext.supportsLargeMessage() && (getBodyInputStream(msg) != null || msg.isLargeMessage() ||
+ msg.getBodyBuffer().writerIndex() > minLargeMessageSize)) {
isLarge = true;
} else {
isLarge = false;
@@ -248,27 +249,31 @@ public class ClientProducerImpl implements ClientProducerInternal {
}
if (groupID != null) {
- msgI.putStringProperty(Message.HDR_GROUP_ID, groupID);
+ msg.putStringProperty(Message.HDR_GROUP_ID, groupID);
}
- final boolean sendBlockingConfig = msgI.isDurable() ? blockOnDurableSend : blockOnNonDurableSend;
+ final boolean sendBlockingConfig = msg.isDurable() ? blockOnDurableSend : blockOnNonDurableSend;
final boolean forceAsyncOverride = handler != null;
final boolean sendBlocking = sendBlockingConfig && !forceAsyncOverride;
session.workDone();
if (isLarge) {
- largeMessageSend(sendBlocking, msgI, theCredits, handler);
+ largeMessageSend(sendBlocking, msg, theCredits, handler);
} else {
- sendRegularMessage(sendingAddress, msgI, sendBlocking, theCredits, handler);
+ sendRegularMessage(sendingAddress, msg, sendBlocking, theCredits, handler);
}
} finally {
session.endCall();
}
}
+ private InputStream getBodyInputStream(ICoreMessage msgI) {
+ return msgI.getBodyInputStream();
+ }
+
private void sendRegularMessage(final SimpleString sendingAddress,
- final MessageInternal msgI,
+ final ICoreMessage msgI,
final boolean sendBlocking,
final ClientProducerCredits theCredits,
final SendAcknowledgementHandler handler) throws ActiveMQException {
@@ -301,7 +306,7 @@ public class ClientProducerImpl implements ClientProducerInternal {
* @throws ActiveMQException
*/
private void largeMessageSend(final boolean sendBlocking,
- final MessageInternal msgI,
+ final ICoreMessage msgI,
final ClientProducerCredits credits,
SendAcknowledgementHandler handler) throws ActiveMQException {
logger.tracef("largeMessageSend::%s, Blocking=%s", msgI, sendBlocking);
@@ -313,22 +318,22 @@ public class ClientProducerImpl implements ClientProducerInternal {
}
// msg.getBody() could be Null on LargeServerMessage
- if (msgI.getBodyInputStream() == null && msgI.getWholeBuffer() != null) {
- msgI.getWholeBuffer().readerIndex(0);
+ if (getBodyInputStream(msgI) == null && msgI.getBuffer() != null) {
+ msgI.getBuffer().readerIndex(0);
}
InputStream input;
if (msgI.isServerMessage()) {
largeMessageSendServer(sendBlocking, msgI, credits, handler);
- } else if ((input = msgI.getBodyInputStream()) != null) {
+ } else if ((input = getBodyInputStream(msgI)) != null) {
largeMessageSendStreamed(sendBlocking, msgI, input, credits, handler);
} else {
largeMessageSendBuffered(sendBlocking, msgI, credits, handler);
}
}
- private void sendInitialLargeMessageHeader(MessageInternal msgI,
+ private void sendInitialLargeMessageHeader(Message msgI,
ClientProducerCredits credits) throws ActiveMQException {
int creditsUsed = sessionContext.sendInitialChunkOnLargeMessage(msgI);
@@ -348,17 +353,14 @@ public class ClientProducerImpl implements ClientProducerInternal {
* @throws ActiveMQException
*/
private void largeMessageSendServer(final boolean sendBlocking,
- final MessageInternal msgI,
+ final ICoreMessage msgI,
final ClientProducerCredits credits,
SendAcknowledgementHandler handler) throws ActiveMQException {
sendInitialLargeMessageHeader(msgI, credits);
- BodyEncoder context = msgI.getBodyEncoder();
+ LargeBodyEncoder context = msgI.getBodyEncoder();
final long bodySize = context.getLargeBodySize();
-
- final int reconnectID = sessionContext.getReconnectID();
-
context.open();
try {
@@ -392,7 +394,7 @@ public class ClientProducerImpl implements ClientProducerInternal {
* @throws ActiveMQException
*/
private void largeMessageSendBuffered(final boolean sendBlocking,
- final MessageInternal msgI,
+ final ICoreMessage msgI,
final ClientProducerCredits credits,
SendAcknowledgementHandler handler) throws ActiveMQException {
msgI.getBodyBuffer().readerIndex(0);
@@ -407,7 +409,7 @@ public class ClientProducerImpl implements ClientProducerInternal {
* @throws ActiveMQException
*/
private void largeMessageSendStreamed(final boolean sendBlocking,
- final MessageInternal msgI,
+ final ICoreMessage msgI,
final InputStream inputStreamParameter,
final ClientProducerCredits credits,
SendAcknowledgementHandler handler) throws ActiveMQException {
@@ -478,7 +480,7 @@ public class ClientProducerImpl implements ClientProducerInternal {
msgI.putLongProperty(Message.HDR_LARGE_BODY_SIZE, deflaterReader.getTotalSize());
msgI.getBodyBuffer().writeBytes(buff, 0, pos);
- sendRegularMessage(msgI.getAddress(), msgI, sendBlocking, credits, handler);
+ sendRegularMessage(msgI.getAddressSimpleString(), msgI, sendBlocking, credits, handler);
return;
} else {
if (!headerSent) {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/CompressedLargeMessageControllerImpl.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/CompressedLargeMessageControllerImpl.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/CompressedLargeMessageControllerImpl.java
index 55f9129..ce652d2 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/CompressedLargeMessageControllerImpl.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/CompressedLargeMessageControllerImpl.java
@@ -513,6 +513,12 @@ final class CompressedLargeMessageControllerImpl implements LargeMessageControll
}
@Override
+ public void writeBytes(ByteBuf src, int srcIndex, int length) {
+ throw new IllegalAccessError(OPERATION_NOT_SUPPORTED);
+ }
+
+
+ @Override
public ByteBuffer toByteBuffer() {
throw new IllegalAccessError(OPERATION_NOT_SUPPORTED);
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/LargeMessageControllerImpl.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/LargeMessageControllerImpl.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/LargeMessageControllerImpl.java
index 951aea2..0bb5690 100644
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/LargeMessageControllerImpl.java
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/client/impl/LargeMessageControllerImpl.java
@@ -863,6 +863,21 @@ public class LargeMessageControllerImpl implements LargeMessageController {
throw new IllegalAccessError(LargeMessageControllerImpl.READ_ONLY_ERROR_MESSAGE);
}
+ /**
+ * Transfers the specified source buffer's data to this buffer starting at
+ * the current {@code writerIndex} until the source buffer's position
+ * reaches its limit, and increases the {@code writerIndex} by the
+ * number of the transferred bytes.
+ *
+ * @param src The source buffer
+ * @throws IndexOutOfBoundsException if {@code src.remaining()} is greater than
+ * {@code this.writableBytes}
+ */
+ @Override
+ public void writeBytes(ByteBuf src, int srcIndex, int length) {
+ throw new IllegalAccessError(LargeMessageControllerImpl.READ_ONLY_ERROR_MESSAGE);
+ }
+
public int writeBytes(final InputStream in, final int length) throws IOException {
throw new IllegalAccessError(LargeMessageControllerImpl.READ_ONLY_ERROR_MESSAGE);
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/BodyEncoder.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/BodyEncoder.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/BodyEncoder.java
deleted file mode 100644
index baafaac..0000000
--- a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/BodyEncoder.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * 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.message;
-
-import java.nio.ByteBuffer;
-
-import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
-import org.apache.activemq.artemis.api.core.ActiveMQException;
-
-/**
- * Class used to encode message body into buffers.
- * <br>
- * Used to send large streams over the wire
- */
-public interface BodyEncoder {
-
- /**
- * This method must not be called directly by ActiveMQ Artemis clients.
- */
- void open() throws ActiveMQException;
-
- /**
- * This method must not be called directly by ActiveMQ Artemis clients.
- */
- void close() throws ActiveMQException;
-
- /**
- * This method must not be called directly by ActiveMQ Artemis clients.
- */
- int encode(ByteBuffer bufferRead) throws ActiveMQException;
-
- /**
- * This method must not be called directly by ActiveMQ Artemis clients.
- */
- int encode(ActiveMQBuffer bufferOut, int size) throws ActiveMQException;
-
- /**
- * This method must not be called directly by ActiveMQ Artemis clients.
- */
- long getLargeBodySize();
-}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/LargeBodyEncoder.java
----------------------------------------------------------------------
diff --git a/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/LargeBodyEncoder.java b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/LargeBodyEncoder.java
new file mode 100644
index 0000000..8b96282
--- /dev/null
+++ b/artemis-core-client/src/main/java/org/apache/activemq/artemis/core/message/LargeBodyEncoder.java
@@ -0,0 +1,55 @@
+/*
+ * 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.message;
+
+import java.nio.ByteBuffer;
+
+import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
+import org.apache.activemq.artemis.api.core.ActiveMQException;
+
+/**
+ * Class used to encode message body into buffers.
+ * <br>
+ * Used to send large streams over the wire
+ */
+public interface LargeBodyEncoder {
+
+ /**
+ * This method must not be called directly by ActiveMQ Artemis clients.
+ */
+ void open() throws ActiveMQException;
+
+ /**
+ * This method must not be called directly by ActiveMQ Artemis clients.
+ */
+ void close() throws ActiveMQException;
+
+ /**
+ * This method must not be called directly by ActiveMQ Artemis clients.
+ */
+ int encode(ByteBuffer bufferRead) throws ActiveMQException;
+
+ /**
+ * This method must not be called directly by ActiveMQ Artemis clients.
+ */
+ int encode(ActiveMQBuffer bufferOut, int size) throws ActiveMQException;
+
+ /**
+ * This method must not be called directly by ActiveMQ Artemis clients.
+ */
+ long getLargeBodySize();
+}
[10/17] activemq-artemis git commit: ARTEMIS-1009 Pure Message
Encoding.
Posted by cl...@apache.org.
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPMessageSupport.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPMessageSupport.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPMessageSupport.java
deleted file mode 100644
index 8c4612d..0000000
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPMessageSupport.java
+++ /dev/null
@@ -1,276 +0,0 @@
-/*
- * 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.converter.message;
-
-import static org.apache.activemq.artemis.api.core.Message.BYTES_TYPE;
-import static org.apache.activemq.artemis.api.core.Message.DEFAULT_TYPE;
-import static org.apache.activemq.artemis.api.core.Message.MAP_TYPE;
-import static org.apache.activemq.artemis.api.core.Message.OBJECT_TYPE;
-import static org.apache.activemq.artemis.api.core.Message.STREAM_TYPE;
-import static org.apache.activemq.artemis.api.core.Message.TEXT_TYPE;
-
-import java.nio.charset.Charset;
-import java.util.Arrays;
-import java.util.Map;
-import java.util.Set;
-
-import javax.jms.Destination;
-import javax.jms.JMSException;
-
-import org.apache.activemq.artemis.core.buffers.impl.ResetLimitWrappedActiveMQBuffer;
-import org.apache.activemq.artemis.core.server.ServerMessage;
-import org.apache.activemq.artemis.core.server.impl.ServerMessageImpl;
-import org.apache.activemq.artemis.jms.client.ActiveMQDestination;
-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;
-import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSObjectMessage;
-import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSStreamMessage;
-import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSTextMessage;
-import org.apache.activemq.artemis.protocol.amqp.exceptions.ActiveMQAMQPInvalidContentTypeException;
-import org.apache.activemq.artemis.utils.IDGenerator;
-import org.apache.qpid.proton.amqp.Binary;
-import org.apache.qpid.proton.amqp.Symbol;
-import org.apache.qpid.proton.amqp.messaging.Data;
-import org.apache.qpid.proton.message.Message;
-
-/**
- * Support class containing constant values and static methods that are used to map to / from
- * AMQP Message types being sent or received.
- */
-public final class AMQPMessageSupport {
-
- // Message Properties used to map AMQP to JMS and back
-
- public static final String JMS_AMQP_PREFIX = "JMS_AMQP_";
- public static final int JMS_AMQP_PREFIX_LENGTH = JMS_AMQP_PREFIX.length();
-
- public static final String MESSAGE_FORMAT = "MESSAGE_FORMAT";
- public static final String ORIGINAL_ENCODING = "ORIGINAL_ENCODING";
- public static final String NATIVE = "NATIVE";
- public static final String HEADER = "HEADER";
- public static final String PROPERTIES = "PROPERTIES";
-
- public static final String FIRST_ACQUIRER = "FirstAcquirer";
- public static final String CONTENT_TYPE = "ContentType";
- public static final String CONTENT_ENCODING = "ContentEncoding";
- public static final String REPLYTO_GROUP_ID = "ReplyToGroupID";
- public static final String DURABLE = "DURABLE";
- public static final String PRIORITY = "PRIORITY";
-
- public static final String DELIVERY_ANNOTATION_PREFIX = "DA_";
- public static final String MESSAGE_ANNOTATION_PREFIX = "MA_";
- public static final String FOOTER_PREFIX = "FT_";
-
- public static final String JMS_AMQP_HEADER = JMS_AMQP_PREFIX + HEADER;
- public static final String JMS_AMQP_HEADER_DURABLE = JMS_AMQP_PREFIX + HEADER + DURABLE;
- public static final String JMS_AMQP_HEADER_PRIORITY = JMS_AMQP_PREFIX + HEADER + PRIORITY;
- public static final String JMS_AMQP_PROPERTIES = JMS_AMQP_PREFIX + PROPERTIES;
- public static final String JMS_AMQP_ORIGINAL_ENCODING = JMS_AMQP_PREFIX + ORIGINAL_ENCODING;
- public static final String JMS_AMQP_MESSAGE_FORMAT = JMS_AMQP_PREFIX + MESSAGE_FORMAT;
- public static final String JMS_AMQP_NATIVE = JMS_AMQP_PREFIX + NATIVE;
- public static final String JMS_AMQP_FIRST_ACQUIRER = JMS_AMQP_PREFIX + FIRST_ACQUIRER;
- public static final String JMS_AMQP_CONTENT_TYPE = JMS_AMQP_PREFIX + CONTENT_TYPE;
- public static final String JMS_AMQP_CONTENT_ENCODING = JMS_AMQP_PREFIX + CONTENT_ENCODING;
- public static final String JMS_AMQP_REPLYTO_GROUP_ID = JMS_AMQP_PREFIX + REPLYTO_GROUP_ID;
- public static final String JMS_AMQP_DELIVERY_ANNOTATION_PREFIX = JMS_AMQP_PREFIX + DELIVERY_ANNOTATION_PREFIX;
- public static final String JMS_AMQP_MESSAGE_ANNOTATION_PREFIX = JMS_AMQP_PREFIX + MESSAGE_ANNOTATION_PREFIX;
- public static final String JMS_AMQP_FOOTER_PREFIX = JMS_AMQP_PREFIX + FOOTER_PREFIX;
-
- // Message body type definitions
- public static final Binary EMPTY_BINARY = new Binary(new byte[0]);
- public static final Data EMPTY_BODY = new Data(EMPTY_BINARY);
-
- public static final short AMQP_UNKNOWN = 0;
- public static final short AMQP_NULL = 1;
- public static final short AMQP_DATA = 2;
- public static final short AMQP_SEQUENCE = 3;
- public static final short AMQP_VALUE_NULL = 4;
- public static final short AMQP_VALUE_STRING = 5;
- public static final short AMQP_VALUE_BINARY = 6;
- public static final short AMQP_VALUE_MAP = 7;
- public static final short AMQP_VALUE_LIST = 8;
-
- /**
- * Content type used to mark Data sections as containing a serialized java object.
- */
- public static final String SERIALIZED_JAVA_OBJECT_CONTENT_TYPE = "application/x-java-serialized-object";
-
- /**
- * Content type used to mark Data sections as containing arbitrary bytes.
- */
- public static final String OCTET_STREAM_CONTENT_TYPE = "application/octet-stream";
-
- /**
- * Lookup and return the correct Proton Symbol instance based on the given key.
- *
- * @param key
- * the String value name of the Symbol to locate.
- *
- * @return the Symbol value that matches the given key.
- */
- public static Symbol getSymbol(String key) {
- return Symbol.valueOf(key);
- }
-
- /**
- * Safe way to access message annotations which will check internal structure and either
- * return the annotation if it exists or null if the annotation or any annotations are
- * present.
- *
- * @param key
- * the String key to use to lookup an annotation.
- * @param message
- * the AMQP message object that is being examined.
- *
- * @return the given annotation value or null if not present in the message.
- */
- public static Object getMessageAnnotation(String key, Message message) {
- if (message != null && message.getMessageAnnotations() != null) {
- Map<Symbol, Object> annotations = message.getMessageAnnotations().getValue();
- return annotations.get(AMQPMessageSupport.getSymbol(key));
- }
-
- return null;
- }
-
- /**
- * Check whether the content-type field of the properties section (if present) in the given
- * message matches the provided string (where null matches if there is no content type
- * present.
- *
- * @param contentType
- * content type string to compare against, or null if none
- * @param message
- * the AMQP message object that is being examined.
- *
- * @return true if content type matches
- */
- public static boolean isContentType(String contentType, Message message) {
- if (contentType == null) {
- return message.getContentType() == null;
- } else {
- return contentType.equals(message.getContentType());
- }
- }
-
- /**
- * @param contentType
- * the contentType of the received message
- * @return the character set to use, or null if not to treat the message as text
- */
- public static Charset getCharsetForTextualContent(String contentType) {
- try {
- return AMQPContentTypeSupport.parseContentTypeForTextualCharset(contentType);
- } catch (ActiveMQAMQPInvalidContentTypeException e) {
- return null;
- }
- }
-
- public static ServerJMSMessage wrapMessage(int messageType, ServerMessage wrapped, int deliveryCount) {
- switch (messageType) {
- case STREAM_TYPE:
- return new ServerJMSStreamMessage(wrapped, deliveryCount);
- case BYTES_TYPE:
- return new ServerJMSBytesMessage(wrapped, deliveryCount);
- case MAP_TYPE:
- return new ServerJMSMapMessage(wrapped, deliveryCount);
- case TEXT_TYPE:
- return new ServerJMSTextMessage(wrapped, deliveryCount);
- case OBJECT_TYPE:
- return new ServerJMSObjectMessage(wrapped, deliveryCount);
- default:
- return new ServerJMSMessage(wrapped, deliveryCount);
- }
- }
-
- public static String toAddress(Destination destination) {
- if (destination instanceof ActiveMQDestination) {
- return ((ActiveMQDestination) destination).getAddress();
- }
- return null;
- }
-
- public static ServerJMSBytesMessage createBytesMessage(IDGenerator idGenerator) {
- return new ServerJMSBytesMessage(newMessage(idGenerator, BYTES_TYPE), 0);
- }
-
- public static ServerJMSMessage createBytesMessage(IDGenerator idGenerator, byte[] array, int arrayOffset, int length) throws JMSException {
- ServerJMSBytesMessage message = createBytesMessage(idGenerator);
- message.writeBytes(array, arrayOffset, length);
- return message;
- }
-
- public static ServerJMSStreamMessage createStreamMessage(IDGenerator idGenerator) {
- return new ServerJMSStreamMessage(newMessage(idGenerator, STREAM_TYPE), 0);
- }
-
- public static ServerJMSMessage createMessage(IDGenerator idGenerator) {
- return new ServerJMSMessage(newMessage(idGenerator, DEFAULT_TYPE), 0);
- }
-
- public static ServerJMSTextMessage createTextMessage(IDGenerator idGenerator) {
- return new ServerJMSTextMessage(newMessage(idGenerator, TEXT_TYPE), 0);
- }
-
- public static ServerJMSTextMessage createTextMessage(IDGenerator idGenerator, String text) throws JMSException {
- ServerJMSTextMessage message = createTextMessage(idGenerator);
- message.setText(text);
- return message;
- }
-
- public static ServerJMSObjectMessage createObjectMessage(IDGenerator idGenerator) {
- return new ServerJMSObjectMessage(newMessage(idGenerator, OBJECT_TYPE), 0);
- }
-
- public static ServerJMSMessage createObjectMessage(IDGenerator idGenerator, Binary serializedForm) throws JMSException {
- ServerJMSObjectMessage message = createObjectMessage(idGenerator);
- message.setSerializedForm(serializedForm);
- return message;
- }
-
- public static ServerJMSMessage createObjectMessage(IDGenerator idGenerator, byte[] array, int offset, int length) throws JMSException {
- ServerJMSObjectMessage message = createObjectMessage(idGenerator);
- message.setSerializedForm(new Binary(array, offset, length));
- return message;
- }
-
- public static ServerJMSMapMessage createMapMessage(IDGenerator idGenerator) {
- return new ServerJMSMapMessage(newMessage(idGenerator, MAP_TYPE), 0);
- }
-
- public static ServerJMSMapMessage createMapMessage(IDGenerator idGenerator, Map<String, Object> content) throws JMSException {
- ServerJMSMapMessage message = createMapMessage(idGenerator);
- final Set<Map.Entry<String, Object>> set = content.entrySet();
- for (Map.Entry<String, Object> entry : set) {
- Object value = entry.getValue();
- if (value instanceof Binary) {
- Binary binary = (Binary) value;
- value = Arrays.copyOfRange(binary.getArray(), binary.getArrayOffset(), binary.getLength());
- }
- message.setObject(entry.getKey(), value);
- }
- return message;
- }
-
- private static ServerMessageImpl newMessage(IDGenerator idGenerator, byte messageType) {
- ServerMessageImpl message = new ServerMessageImpl(idGenerator.generateID(), 512);
- message.setType(messageType);
- ((ResetLimitWrappedActiveMQBuffer) message.getBodyBuffer()).setMessage(null);
- return message;
- }
-}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPMessageTypes.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPMessageTypes.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPMessageTypes.java
deleted file mode 100644
index 70c755a..0000000
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPMessageTypes.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * 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.converter.message;
-
-@Deprecated
-public class AMQPMessageTypes {
-
- // TODO - Remove in future release as these are no longer used by the
- // inbound JMS Transformer.
-
- public static final String AMQP_TYPE_KEY = "amqp:type";
-
- public static final String AMQP_SEQUENCE = "amqp:sequence";
-
- public static final String AMQP_LIST = "amqp:list";
-}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPNativeInboundTransformer.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPNativeInboundTransformer.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPNativeInboundTransformer.java
deleted file mode 100644
index 7028547..0000000
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPNativeInboundTransformer.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * 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.converter.message;
-
-import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSMessage;
-import org.apache.activemq.artemis.utils.IDGenerator;
-
-public class AMQPNativeInboundTransformer extends AMQPRawInboundTransformer {
-
- public AMQPNativeInboundTransformer(IDGenerator idGenerator) {
- super(idGenerator);
- }
-
- @Override
- public String getTransformerName() {
- return TRANSFORMER_NATIVE;
- }
-
- @Override
- public InboundTransformer getFallbackTransformer() {
- return new AMQPRawInboundTransformer(idGenerator);
- }
-
- @Override
- public ServerJMSMessage transform(EncodedMessage amqpMessage) throws Exception {
- org.apache.qpid.proton.message.Message amqp = amqpMessage.decode();
-
- return populateMessage(super.transform(amqpMessage), amqp);
- }
-}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPNativeOutboundTransformer.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPNativeOutboundTransformer.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPNativeOutboundTransformer.java
deleted file mode 100644
index 8e89bb3..0000000
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPNativeOutboundTransformer.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * 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.converter.message;
-
-import java.io.UnsupportedEncodingException;
-
-import javax.jms.JMSException;
-
-import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSBytesMessage;
-import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSMessage;
-import org.apache.activemq.artemis.utils.IDGenerator;
-import org.apache.qpid.proton.amqp.UnsignedInteger;
-import org.apache.qpid.proton.amqp.messaging.Header;
-import org.apache.qpid.proton.codec.WritableBuffer;
-import org.apache.qpid.proton.message.ProtonJMessage;
-
-public class AMQPNativeOutboundTransformer extends OutboundTransformer {
-
- public AMQPNativeOutboundTransformer(IDGenerator idGenerator) {
- super(idGenerator);
- }
-
- @Override
- public long transform(ServerJMSMessage message, WritableBuffer buffer) throws JMSException, UnsupportedEncodingException {
- if (message == null || !(message instanceof ServerJMSBytesMessage)) {
- return 0;
- }
-
- return transform(this, (ServerJMSBytesMessage) message, buffer);
- }
-
- public static long transform(OutboundTransformer options, ServerJMSBytesMessage message, WritableBuffer buffer) throws JMSException {
- byte[] data = new byte[(int) message.getBodyLength()];
- message.readBytes(data);
- message.reset();
-
- // The AMQP delivery-count field only includes prior failed delivery attempts,
- int amqpDeliveryCount = message.getDeliveryCount() - 1;
- if (amqpDeliveryCount >= 1) {
-
- // decode...
- ProtonJMessage amqp = (ProtonJMessage) org.apache.qpid.proton.message.Message.Factory.create();
- int offset = 0;
- int len = data.length;
- while (len > 0) {
- final int decoded = amqp.decode(data, offset, len);
- assert decoded > 0 : "Make progress decoding the message";
- offset += decoded;
- len -= decoded;
- }
-
- // Update the DeliveryCount header which might require adding a Header
- if (amqp.getHeader() == null && amqpDeliveryCount > 0) {
- amqp.setHeader(new Header());
- }
-
- amqp.getHeader().setDeliveryCount(new UnsignedInteger(amqpDeliveryCount));
-
- amqp.encode(buffer);
- } else {
- buffer.put(data, 0, data.length);
- }
-
- return 0;
- }
-}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPRawInboundTransformer.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPRawInboundTransformer.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPRawInboundTransformer.java
deleted file mode 100644
index 445eaca..0000000
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/AMQPRawInboundTransformer.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * 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.converter.message;
-
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.JMS_AMQP_MESSAGE_FORMAT;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.JMS_AMQP_NATIVE;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.createBytesMessage;
-
-import javax.jms.DeliveryMode;
-import javax.jms.Message;
-
-import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSBytesMessage;
-import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSMessage;
-import org.apache.activemq.artemis.utils.IDGenerator;
-
-public class AMQPRawInboundTransformer extends InboundTransformer {
-
- public AMQPRawInboundTransformer(IDGenerator idGenerator) {
- super(idGenerator);
- }
-
- @Override
- public String getTransformerName() {
- return TRANSFORMER_RAW;
- }
-
- @Override
- public InboundTransformer getFallbackTransformer() {
- return null; // No fallback from full raw transform
- }
-
- @Override
- public ServerJMSMessage transform(EncodedMessage amqpMessage) throws Exception {
- ServerJMSBytesMessage message = createBytesMessage(idGenerator);
- message.writeBytes(amqpMessage.getArray(), amqpMessage.getArrayOffset(), amqpMessage.getLength());
-
- // We cannot decode the message headers to check so err on the side of caution
- // and mark all messages as persistent.
- message.setJMSDeliveryMode(DeliveryMode.PERSISTENT);
- message.setJMSPriority(Message.DEFAULT_PRIORITY);
- message.setJMSTimestamp(System.currentTimeMillis());
-
- message.setLongProperty(JMS_AMQP_MESSAGE_FORMAT, amqpMessage.getMessageFormat());
- message.setBooleanProperty(JMS_AMQP_NATIVE, true);
-
- return message;
- }
-}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/EncodedMessage.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/EncodedMessage.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/EncodedMessage.java
deleted file mode 100644
index 22042da..0000000
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/EncodedMessage.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * 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.converter.message;
-
-import org.apache.qpid.proton.amqp.Binary;
-import org.apache.qpid.proton.message.Message;
-
-public class EncodedMessage {
-
- private final Binary data;
- final long messageFormat;
-
- public EncodedMessage(long messageFormat, byte[] data, int offset, int length) {
- this.data = new Binary(data, offset, length);
- this.messageFormat = messageFormat;
- }
-
- public long getMessageFormat() {
- return messageFormat;
- }
-
- public Message decode() throws Exception {
- Message amqp = Message.Factory.create();
-
- int offset = getArrayOffset();
- int len = getLength();
- while (len > 0) {
- final int decoded = amqp.decode(getArray(), offset, len);
- assert decoded > 0 : "Make progress decoding the message";
- offset += decoded;
- len -= decoded;
- }
-
- return amqp;
- }
-
- public int getLength() {
- return data.getLength();
- }
-
- public int getArrayOffset() {
- return data.getArrayOffset();
- }
-
- public byte[] getArray() {
- return data.getArray();
- }
-
- @Override
- public String toString() {
- return data.toString();
- }
-}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/InboundTransformer.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/InboundTransformer.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/InboundTransformer.java
deleted file mode 100644
index 1316ab7..0000000
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/InboundTransformer.java
+++ /dev/null
@@ -1,243 +0,0 @@
-/*
- * 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.converter.message;
-
-import static org.apache.activemq.artemis.api.core.Message.HDR_SCHEDULED_DELIVERY_TIME;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.JMS_AMQP_CONTENT_ENCODING;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.JMS_AMQP_CONTENT_TYPE;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.JMS_AMQP_FIRST_ACQUIRER;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.JMS_AMQP_FOOTER_PREFIX;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.JMS_AMQP_HEADER;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.JMS_AMQP_HEADER_DURABLE;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.JMS_AMQP_HEADER_PRIORITY;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.JMS_AMQP_MESSAGE_ANNOTATION_PREFIX;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.JMS_AMQP_REPLYTO_GROUP_ID;
-
-import java.nio.charset.StandardCharsets;
-import java.util.Map;
-import java.util.Set;
-
-import javax.jms.DeliveryMode;
-import javax.jms.JMSException;
-import javax.jms.Message;
-
-import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerDestination;
-import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSMessage;
-import org.apache.activemq.artemis.utils.IDGenerator;
-import org.apache.qpid.proton.amqp.Binary;
-import org.apache.qpid.proton.amqp.Decimal128;
-import org.apache.qpid.proton.amqp.Decimal32;
-import org.apache.qpid.proton.amqp.Decimal64;
-import org.apache.qpid.proton.amqp.Symbol;
-import org.apache.qpid.proton.amqp.UnsignedByte;
-import org.apache.qpid.proton.amqp.UnsignedInteger;
-import org.apache.qpid.proton.amqp.UnsignedLong;
-import org.apache.qpid.proton.amqp.UnsignedShort;
-import org.apache.qpid.proton.amqp.messaging.ApplicationProperties;
-import org.apache.qpid.proton.amqp.messaging.Footer;
-import org.apache.qpid.proton.amqp.messaging.Header;
-import org.apache.qpid.proton.amqp.messaging.MessageAnnotations;
-import org.apache.qpid.proton.amqp.messaging.Properties;
-
-public abstract class InboundTransformer {
-
- protected IDGenerator idGenerator;
-
- public static final String TRANSFORMER_NATIVE = "native";
- public static final String TRANSFORMER_RAW = "raw";
- public static final String TRANSFORMER_JMS = "jms";
-
- public InboundTransformer(IDGenerator idGenerator) {
- this.idGenerator = idGenerator;
- }
-
- public abstract ServerJMSMessage transform(EncodedMessage amqpMessage) throws Exception;
-
- public abstract String getTransformerName();
-
- public abstract InboundTransformer getFallbackTransformer();
-
- @SuppressWarnings("unchecked")
- protected ServerJMSMessage populateMessage(ServerJMSMessage jms, org.apache.qpid.proton.message.Message amqp) throws Exception {
- Header header = amqp.getHeader();
- if (header != null) {
- jms.setBooleanProperty(JMS_AMQP_HEADER, true);
-
- if (header.getDurable() != null) {
- jms.setBooleanProperty(JMS_AMQP_HEADER_DURABLE, true);
- jms.setJMSDeliveryMode(header.getDurable().booleanValue() ? DeliveryMode.PERSISTENT : DeliveryMode.NON_PERSISTENT);
- } else {
- jms.setJMSDeliveryMode(DeliveryMode.NON_PERSISTENT);
- }
-
- if (header.getPriority() != null) {
- jms.setBooleanProperty(JMS_AMQP_HEADER_PRIORITY, true);
- jms.setJMSPriority(header.getPriority().intValue());
- } else {
- jms.setJMSPriority(Message.DEFAULT_PRIORITY);
- }
-
- if (header.getFirstAcquirer() != null) {
- jms.setBooleanProperty(JMS_AMQP_FIRST_ACQUIRER, header.getFirstAcquirer());
- }
-
- if (header.getDeliveryCount() != null) {
- // AMQP Delivery Count counts only failed delivers where JMS
- // Delivery Count should include the original delivery in the count.
- jms.setLongProperty("JMSXDeliveryCount", header.getDeliveryCount().longValue() + 1);
- }
- } else {
- jms.setJMSPriority((byte) Message.DEFAULT_PRIORITY);
- jms.setJMSDeliveryMode(DeliveryMode.NON_PERSISTENT);
- }
-
- final MessageAnnotations ma = amqp.getMessageAnnotations();
- if (ma != null) {
- for (Map.Entry<?, ?> entry : ma.getValue().entrySet()) {
- String key = entry.getKey().toString();
- if ("x-opt-delivery-time".equals(key) && entry.getValue() != null) {
- long deliveryTime = ((Number) entry.getValue()).longValue();
- jms.setLongProperty(HDR_SCHEDULED_DELIVERY_TIME.toString(), deliveryTime);
- } else if ("x-opt-delivery-delay".equals(key) && entry.getValue() != null) {
- long delay = ((Number) entry.getValue()).longValue();
- if (delay > 0) {
- jms.setLongProperty(HDR_SCHEDULED_DELIVERY_TIME.toString(), System.currentTimeMillis() + delay);
- }
- }
-
- setProperty(jms, JMS_AMQP_MESSAGE_ANNOTATION_PREFIX + key, entry.getValue());
- }
- }
-
- final ApplicationProperties ap = amqp.getApplicationProperties();
- if (ap != null) {
- for (Map.Entry<Object, Object> entry : (Set<Map.Entry<Object, Object>>) ap.getValue().entrySet()) {
- setProperty(jms, entry.getKey().toString(), entry.getValue());
- }
- }
-
- final Properties properties = amqp.getProperties();
- if (properties != null) {
- if (properties.getMessageId() != null) {
- jms.setJMSMessageID(AMQPMessageIdHelper.INSTANCE.toBaseMessageIdString(properties.getMessageId()));
- }
- Binary userId = properties.getUserId();
- if (userId != null) {
- // TODO - Better Way to set this?
- jms.setStringProperty("JMSXUserID", new String(userId.getArray(), userId.getArrayOffset(), userId.getLength(), StandardCharsets.UTF_8));
- }
- if (properties.getTo() != null) {
- jms.setJMSDestination(new ServerDestination(properties.getTo()));
- }
- if (properties.getSubject() != null) {
- jms.setJMSType(properties.getSubject());
- }
- if (properties.getReplyTo() != null) {
- jms.setJMSReplyTo(new ServerDestination(properties.getReplyTo()));
- }
- if (properties.getCorrelationId() != null) {
- jms.setJMSCorrelationID(AMQPMessageIdHelper.INSTANCE.toBaseMessageIdString(properties.getCorrelationId()));
- }
- if (properties.getContentType() != null) {
- jms.setStringProperty(JMS_AMQP_CONTENT_TYPE, properties.getContentType().toString());
- }
- if (properties.getContentEncoding() != null) {
- jms.setStringProperty(JMS_AMQP_CONTENT_ENCODING, properties.getContentEncoding().toString());
- }
- if (properties.getCreationTime() != null) {
- jms.setJMSTimestamp(properties.getCreationTime().getTime());
- }
- if (properties.getGroupId() != null) {
- jms.setStringProperty("_AMQ_GROUP_ID", properties.getGroupId());
- }
- if (properties.getGroupSequence() != null) {
- jms.setIntProperty("JMSXGroupSeq", properties.getGroupSequence().intValue());
- }
- if (properties.getReplyToGroupId() != null) {
- jms.setStringProperty(JMS_AMQP_REPLYTO_GROUP_ID, properties.getReplyToGroupId());
- }
- if (properties.getAbsoluteExpiryTime() != null) {
- jms.setJMSExpiration(properties.getAbsoluteExpiryTime().getTime());
- }
- }
-
- // If the jms expiration has not yet been set...
- if (header != null && jms.getJMSExpiration() == 0) {
- // Then lets try to set it based on the message ttl.
- long ttl = Message.DEFAULT_TIME_TO_LIVE;
- if (header.getTtl() != null) {
- ttl = header.getTtl().longValue();
- }
-
- if (ttl == 0) {
- jms.setJMSExpiration(0);
- } else {
- jms.setJMSExpiration(System.currentTimeMillis() + ttl);
- }
- }
-
- final Footer fp = amqp.getFooter();
- if (fp != null) {
- for (Map.Entry<Object, Object> entry : (Set<Map.Entry<Object, Object>>) fp.getValue().entrySet()) {
- String key = entry.getKey().toString();
- setProperty(jms, JMS_AMQP_FOOTER_PREFIX + key, entry.getValue());
- }
- }
-
- return jms;
- }
-
- private void setProperty(Message msg, String key, Object value) throws JMSException {
- if (value instanceof UnsignedLong) {
- long v = ((UnsignedLong) value).longValue();
- msg.setLongProperty(key, v);
- } else if (value instanceof UnsignedInteger) {
- long v = ((UnsignedInteger) value).longValue();
- if (Integer.MIN_VALUE <= v && v <= Integer.MAX_VALUE) {
- msg.setIntProperty(key, (int) v);
- } else {
- msg.setLongProperty(key, v);
- }
- } else if (value instanceof UnsignedShort) {
- int v = ((UnsignedShort) value).intValue();
- if (Short.MIN_VALUE <= v && v <= Short.MAX_VALUE) {
- msg.setShortProperty(key, (short) v);
- } else {
- msg.setIntProperty(key, v);
- }
- } else if (value instanceof UnsignedByte) {
- short v = ((UnsignedByte) value).shortValue();
- if (Byte.MIN_VALUE <= v && v <= Byte.MAX_VALUE) {
- msg.setByteProperty(key, (byte) v);
- } else {
- msg.setShortProperty(key, v);
- }
- } else if (value instanceof Symbol) {
- msg.setStringProperty(key, value.toString());
- } else if (value instanceof Decimal128) {
- msg.setDoubleProperty(key, ((Decimal128) value).doubleValue());
- } else if (value instanceof Decimal64) {
- msg.setDoubleProperty(key, ((Decimal64) value).doubleValue());
- } else if (value instanceof Decimal32) {
- msg.setFloatProperty(key, ((Decimal32) value).floatValue());
- } else if (value instanceof Binary) {
- msg.setStringProperty(key, value.toString());
- } else {
- msg.setObjectProperty(key, value);
- }
- }
-}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/JMSMappingInboundTransformer.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/JMSMappingInboundTransformer.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/JMSMappingInboundTransformer.java
deleted file mode 100644
index 629c499..0000000
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/JMSMappingInboundTransformer.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * 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.converter.message;
-
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.AMQP_DATA;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.AMQP_NULL;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.AMQP_SEQUENCE;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.AMQP_VALUE_BINARY;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.AMQP_VALUE_LIST;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.AMQP_VALUE_MAP;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.AMQP_VALUE_NULL;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.AMQP_VALUE_STRING;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.JMS_AMQP_MESSAGE_FORMAT;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.JMS_AMQP_ORIGINAL_ENCODING;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.OCTET_STREAM_CONTENT_TYPE;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.SERIALIZED_JAVA_OBJECT_CONTENT_TYPE;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.createBytesMessage;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.createMapMessage;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.createMessage;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.createObjectMessage;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.createStreamMessage;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.createTextMessage;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.getCharsetForTextualContent;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.isContentType;
-
-import java.nio.ByteBuffer;
-import java.nio.CharBuffer;
-import java.nio.charset.CharacterCodingException;
-import java.nio.charset.Charset;
-import java.nio.charset.StandardCharsets;
-import java.util.List;
-import java.util.Map;
-
-import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSMessage;
-import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSStreamMessage;
-import org.apache.activemq.artemis.protocol.amqp.exceptions.ActiveMQAMQPInternalErrorException;
-import org.apache.activemq.artemis.utils.IDGenerator;
-import org.apache.qpid.proton.amqp.Binary;
-import org.apache.qpid.proton.amqp.messaging.AmqpSequence;
-import org.apache.qpid.proton.amqp.messaging.AmqpValue;
-import org.apache.qpid.proton.amqp.messaging.Data;
-import org.apache.qpid.proton.amqp.messaging.Section;
-import org.apache.qpid.proton.message.Message;
-
-public class JMSMappingInboundTransformer extends InboundTransformer {
-
- public JMSMappingInboundTransformer(IDGenerator idGenerator) {
- super(idGenerator);
- }
-
- @Override
- public String getTransformerName() {
- return TRANSFORMER_JMS;
- }
-
- @Override
- public InboundTransformer getFallbackTransformer() {
- return new AMQPNativeInboundTransformer(idGenerator);
- }
-
- @Override
- public ServerJMSMessage transform(EncodedMessage encodedMessage) throws Exception {
- ServerJMSMessage transformedMessage = null;
-
- try {
- Message amqpMessage = encodedMessage.decode();
- transformedMessage = createServerMessage(amqpMessage);
- populateMessage(transformedMessage, amqpMessage);
- } catch (Exception ex) {
- InboundTransformer transformer = this.getFallbackTransformer();
-
- while (transformer != null) {
- try {
- transformedMessage = transformer.transform(encodedMessage);
- break;
- } catch (Exception e) {
- transformer = transformer.getFallbackTransformer();
- }
- }
- }
-
- // Regardless of the transformer that finally decoded the message we need to ensure that
- // the AMQP Message Format value is preserved for application on retransmit.
- if (transformedMessage != null && encodedMessage.getMessageFormat() != 0) {
- transformedMessage.setLongProperty(JMS_AMQP_MESSAGE_FORMAT, encodedMessage.getMessageFormat());
- }
-
- return transformedMessage;
- }
-
- @SuppressWarnings("unchecked")
- private ServerJMSMessage createServerMessage(Message message) throws Exception {
-
- Section body = message.getBody();
- ServerJMSMessage result;
-
- if (body == null) {
- if (isContentType(SERIALIZED_JAVA_OBJECT_CONTENT_TYPE, message)) {
- result = createObjectMessage(idGenerator);
- } else if (isContentType(OCTET_STREAM_CONTENT_TYPE, message) || isContentType(null, message)) {
- result = createBytesMessage(idGenerator);
- } else {
- Charset charset = getCharsetForTextualContent(message.getContentType());
- if (charset != null) {
- result = createTextMessage(idGenerator);
- } else {
- result = createMessage(idGenerator);
- }
- }
-
- result.setShortProperty(JMS_AMQP_ORIGINAL_ENCODING, AMQP_NULL);
- } else if (body instanceof Data) {
- Binary payload = ((Data) body).getValue();
-
- if (isContentType(SERIALIZED_JAVA_OBJECT_CONTENT_TYPE, message)) {
- result = createObjectMessage(idGenerator, payload.getArray(), payload.getArrayOffset(), payload.getLength());
- } else if (isContentType(OCTET_STREAM_CONTENT_TYPE, message)) {
- result = createBytesMessage(idGenerator, payload.getArray(), payload.getArrayOffset(), payload.getLength());
- } else {
- Charset charset = getCharsetForTextualContent(message.getContentType());
- if (StandardCharsets.UTF_8.equals(charset)) {
- ByteBuffer buf = ByteBuffer.wrap(payload.getArray(), payload.getArrayOffset(), payload.getLength());
-
- try {
- CharBuffer chars = charset.newDecoder().decode(buf);
- result = createTextMessage(idGenerator, String.valueOf(chars));
- } catch (CharacterCodingException e) {
- result = createBytesMessage(idGenerator, payload.getArray(), payload.getArrayOffset(), payload.getLength());
- }
- } else {
- result = createBytesMessage(idGenerator, payload.getArray(), payload.getArrayOffset(), payload.getLength());
- }
- }
-
- result.setShortProperty(JMS_AMQP_ORIGINAL_ENCODING, AMQP_DATA);
- } else if (body instanceof AmqpSequence) {
- AmqpSequence sequence = (AmqpSequence) body;
- ServerJMSStreamMessage m = createStreamMessage(idGenerator);
- for (Object item : sequence.getValue()) {
- m.writeObject(item);
- }
-
- result = m;
- result.setShortProperty(JMS_AMQP_ORIGINAL_ENCODING, AMQP_SEQUENCE);
- } else if (body instanceof AmqpValue) {
- Object value = ((AmqpValue) body).getValue();
- if (value == null || value instanceof String) {
- result = createTextMessage(idGenerator, (String) value);
-
- result.setShortProperty(JMS_AMQP_ORIGINAL_ENCODING, value == null ? AMQP_VALUE_NULL : AMQP_VALUE_STRING);
- } else if (value instanceof Binary) {
- Binary payload = (Binary) value;
-
- if (isContentType(SERIALIZED_JAVA_OBJECT_CONTENT_TYPE, message)) {
- result = createObjectMessage(idGenerator, payload);
- } else {
- result = createBytesMessage(idGenerator, payload.getArray(), payload.getArrayOffset(), payload.getLength());
- }
-
- result.setShortProperty(JMS_AMQP_ORIGINAL_ENCODING, AMQP_VALUE_BINARY);
- } else if (value instanceof List) {
- ServerJMSStreamMessage m = createStreamMessage(idGenerator);
- for (Object item : (List<Object>) value) {
- m.writeObject(item);
- }
- result = m;
- result.setShortProperty(JMS_AMQP_ORIGINAL_ENCODING, AMQP_VALUE_LIST);
- } else if (value instanceof Map) {
- result = createMapMessage(idGenerator, (Map<String, Object>) value);
- result.setShortProperty(JMS_AMQP_ORIGINAL_ENCODING, AMQP_VALUE_MAP);
- } else {
- // Trigger fall-back to native encoder which generates BytesMessage with the
- // original message stored in the message body.
- throw new ActiveMQAMQPInternalErrorException("Unable to encode to ActiveMQ JMS Message");
- }
- } else {
- throw new RuntimeException("Unexpected body type: " + body.getClass());
- }
-
- return result;
- }
-}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/JMSMappingOutboundTransformer.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/JMSMappingOutboundTransformer.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/JMSMappingOutboundTransformer.java
deleted file mode 100644
index 7dbc6d4..0000000
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/JMSMappingOutboundTransformer.java
+++ /dev/null
@@ -1,592 +0,0 @@
-/*
- * 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.converter.message;
-
-import static org.apache.activemq.artemis.api.core.FilterConstants.NATIVE_MESSAGE_ID;
-import static org.apache.activemq.artemis.api.core.Message.HDR_SCHEDULED_DELIVERY_TIME;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.AMQP_DATA;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.AMQP_NULL;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.AMQP_SEQUENCE;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.AMQP_UNKNOWN;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.AMQP_VALUE_BINARY;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.AMQP_VALUE_LIST;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.AMQP_VALUE_STRING;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.EMPTY_BINARY;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.JMS_AMQP_CONTENT_ENCODING;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.JMS_AMQP_CONTENT_TYPE;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.JMS_AMQP_DELIVERY_ANNOTATION_PREFIX;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.JMS_AMQP_FIRST_ACQUIRER;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.JMS_AMQP_FOOTER_PREFIX;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.JMS_AMQP_HEADER;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.JMS_AMQP_HEADER_DURABLE;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.JMS_AMQP_HEADER_PRIORITY;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.JMS_AMQP_MESSAGE_ANNOTATION_PREFIX;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.JMS_AMQP_MESSAGE_FORMAT;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.JMS_AMQP_NATIVE;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.JMS_AMQP_ORIGINAL_ENCODING;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.JMS_AMQP_PREFIX;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.JMS_AMQP_PROPERTIES;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.JMS_AMQP_REPLYTO_GROUP_ID;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.SERIALIZED_JAVA_OBJECT_CONTENT_TYPE;
-import static org.apache.activemq.artemis.protocol.amqp.converter.message.AMQPMessageSupport.toAddress;
-
-import java.io.UnsupportedEncodingException;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Set;
-
-import javax.jms.Destination;
-import javax.jms.JMSException;
-import javax.jms.Message;
-import javax.jms.MessageEOFException;
-import javax.jms.Queue;
-import javax.jms.TemporaryQueue;
-import javax.jms.TemporaryTopic;
-import javax.jms.TextMessage;
-import javax.jms.Topic;
-
-import org.apache.activemq.artemis.core.message.impl.MessageInternal;
-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;
-import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSObjectMessage;
-import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSStreamMessage;
-import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSTextMessage;
-import org.apache.activemq.artemis.protocol.amqp.exceptions.ActiveMQAMQPIllegalStateException;
-import org.apache.activemq.artemis.reader.MessageUtil;
-import org.apache.activemq.artemis.utils.IDGenerator;
-import org.apache.qpid.proton.amqp.Binary;
-import org.apache.qpid.proton.amqp.Symbol;
-import org.apache.qpid.proton.amqp.UnsignedByte;
-import org.apache.qpid.proton.amqp.UnsignedInteger;
-import org.apache.qpid.proton.amqp.messaging.AmqpSequence;
-import org.apache.qpid.proton.amqp.messaging.AmqpValue;
-import org.apache.qpid.proton.amqp.messaging.ApplicationProperties;
-import org.apache.qpid.proton.amqp.messaging.Data;
-import org.apache.qpid.proton.amqp.messaging.DeliveryAnnotations;
-import org.apache.qpid.proton.amqp.messaging.Footer;
-import org.apache.qpid.proton.amqp.messaging.Header;
-import org.apache.qpid.proton.amqp.messaging.MessageAnnotations;
-import org.apache.qpid.proton.amqp.messaging.Properties;
-import org.apache.qpid.proton.amqp.messaging.Section;
-import org.apache.qpid.proton.codec.AMQPDefinedTypes;
-import org.apache.qpid.proton.codec.DecoderImpl;
-import org.apache.qpid.proton.codec.EncoderImpl;
-import org.apache.qpid.proton.codec.WritableBuffer;
-import org.jboss.logging.Logger;
-
-public class JMSMappingOutboundTransformer extends OutboundTransformer {
-
- private static final Logger logger = Logger.getLogger(JMSMappingOutboundTransformer.class);
-
- public static final Symbol JMS_DEST_TYPE_MSG_ANNOTATION = Symbol.valueOf("x-opt-jms-dest");
- public static final Symbol JMS_REPLY_TO_TYPE_MSG_ANNOTATION = Symbol.valueOf("x-opt-jms-reply-to");
-
- public static final byte QUEUE_TYPE = 0x00;
- public static final byte TOPIC_TYPE = 0x01;
- public static final byte TEMP_QUEUE_TYPE = 0x02;
- public static final byte TEMP_TOPIC_TYPE = 0x03;
-
- // For now Proton requires that we create a decoder to create an encoder
- private static class EncoderDecoderPair {
- DecoderImpl decoder = new DecoderImpl();
- EncoderImpl encoder = new EncoderImpl(decoder);
- {
- AMQPDefinedTypes.registerAllTypes(decoder, encoder);
- }
- }
-
- private static final ThreadLocal<EncoderDecoderPair> tlsCodec = new ThreadLocal<EncoderDecoderPair>() {
- @Override
- protected EncoderDecoderPair initialValue() {
- return new EncoderDecoderPair();
- }
- };
-
- public JMSMappingOutboundTransformer(IDGenerator idGenerator) {
- super(idGenerator);
- }
-
- @Override
- public long transform(ServerJMSMessage message, WritableBuffer buffer) throws JMSException, UnsupportedEncodingException {
- if (message == null) {
- return 0;
- }
-
- long messageFormat = 0;
- Header header = null;
- Properties properties = null;
- Map<Symbol, Object> daMap = null;
- Map<Symbol, Object> maMap = null;
- Map<String, Object> apMap = null;
- Map<Object, Object> footerMap = null;
-
- Section body = convertBody(message);
-
- if (message.getInnerMessage().isDurable()) {
- if (header == null) {
- header = new Header();
- }
- header.setDurable(true);
- }
- byte priority = (byte) message.getJMSPriority();
- if (priority != Message.DEFAULT_PRIORITY) {
- if (header == null) {
- header = new Header();
- }
- header.setPriority(UnsignedByte.valueOf(priority));
- }
- String type = message.getJMSType();
- if (type != null) {
- if (properties == null) {
- properties = new Properties();
- }
- properties.setSubject(type);
- }
- String messageId = message.getJMSMessageID();
- if (messageId != null) {
- if (properties == null) {
- properties = new Properties();
- }
- try {
- properties.setMessageId(AMQPMessageIdHelper.INSTANCE.toIdObject(messageId));
- } catch (ActiveMQAMQPIllegalStateException e) {
- properties.setMessageId(messageId);
- }
- }
- Destination destination = message.getJMSDestination();
- if (destination != null) {
- if (properties == null) {
- properties = new Properties();
- }
- properties.setTo(toAddress(destination));
- if (maMap == null) {
- maMap = new HashMap<>();
- }
- maMap.put(JMS_DEST_TYPE_MSG_ANNOTATION, destinationType(destination));
- }
- Destination replyTo = message.getJMSReplyTo();
- if (replyTo != null) {
- if (properties == null) {
- properties = new Properties();
- }
- properties.setReplyTo(toAddress(replyTo));
- if (maMap == null) {
- maMap = new HashMap<>();
- }
- maMap.put(JMS_REPLY_TO_TYPE_MSG_ANNOTATION, destinationType(replyTo));
- }
- String correlationId = message.getJMSCorrelationID();
- if (correlationId != null) {
- if (properties == null) {
- properties = new Properties();
- }
- try {
- properties.setCorrelationId(AMQPMessageIdHelper.INSTANCE.toIdObject(correlationId));
- } catch (ActiveMQAMQPIllegalStateException e) {
- properties.setCorrelationId(correlationId);
- }
- }
- long expiration = message.getJMSExpiration();
- if (expiration != 0) {
- long ttl = expiration - System.currentTimeMillis();
- if (ttl < 0) {
- ttl = 1;
- }
-
- if (header == null) {
- header = new Header();
- }
- header.setTtl(new UnsignedInteger((int) ttl));
-
- if (properties == null) {
- properties = new Properties();
- }
- properties.setAbsoluteExpiryTime(new Date(expiration));
- }
- long timeStamp = message.getJMSTimestamp();
- if (timeStamp != 0) {
- if (properties == null) {
- properties = new Properties();
- }
- properties.setCreationTime(new Date(timeStamp));
- }
-
- final Set<String> keySet = MessageUtil.getPropertyNames(message.getInnerMessage());
- for (String key : keySet) {
- if (key.startsWith("JMSX")) {
- if (key.equals("JMSXDeliveryCount")) {
- // The AMQP delivery-count field only includes prior failed delivery attempts,
- // whereas JMSXDeliveryCount includes the first/current delivery attempt.
- int amqpDeliveryCount = message.getDeliveryCount() - 1;
- if (amqpDeliveryCount > 0) {
- if (header == null) {
- header = new Header();
- }
- header.setDeliveryCount(new UnsignedInteger(amqpDeliveryCount));
- }
- continue;
- } else if (key.equals("JMSXUserID")) {
- String value = message.getStringProperty(key);
- if (properties == null) {
- properties = new Properties();
- }
- properties.setUserId(new Binary(value.getBytes(StandardCharsets.UTF_8)));
- continue;
- } else if (key.equals("JMSXGroupID")) {
- String value = message.getStringProperty(key);
- if (properties == null) {
- properties = new Properties();
- }
- properties.setGroupId(value);
- continue;
- } else if (key.equals("JMSXGroupSeq")) {
- UnsignedInteger value = new UnsignedInteger(message.getIntProperty(key));
- if (properties == null) {
- properties = new Properties();
- }
- properties.setGroupSequence(value);
- continue;
- }
- } else if (key.startsWith(JMS_AMQP_PREFIX)) {
- // AMQP Message Information stored from a conversion to the Core Message
- if (key.equals(JMS_AMQP_MESSAGE_FORMAT)) {
- messageFormat = message.getLongProperty(JMS_AMQP_MESSAGE_FORMAT);
- continue;
- } else if (key.equals(JMS_AMQP_NATIVE)) {
- // skip..internal use only
- continue;
- } else if (key.equals(JMS_AMQP_ORIGINAL_ENCODING)) {
- // skip..internal use only
- continue;
- } else if (key.equals(JMS_AMQP_FIRST_ACQUIRER)) {
- if (header == null) {
- header = new Header();
- }
- header.setFirstAcquirer(message.getBooleanProperty(key));
- continue;
- } else if (key.equals(JMS_AMQP_HEADER)) {
- if (header == null) {
- header = new Header();
- }
- continue;
- } else if (key.equals(JMS_AMQP_HEADER_DURABLE)) {
- if (header == null) {
- header = new Header();
- }
- header.setDurable(message.getInnerMessage().isDurable());
- continue;
- } else if (key.equals(JMS_AMQP_HEADER_PRIORITY)) {
- if (header == null) {
- header = new Header();
- }
- header.setPriority(UnsignedByte.valueOf(priority));
- continue;
- } else if (key.startsWith(JMS_AMQP_PROPERTIES)) {
- if (properties == null) {
- properties = new Properties();
- }
- continue;
- } else if (key.startsWith(JMS_AMQP_DELIVERY_ANNOTATION_PREFIX)) {
- if (daMap == null) {
- daMap = new HashMap<>();
- }
- String name = key.substring(JMS_AMQP_DELIVERY_ANNOTATION_PREFIX.length());
- daMap.put(Symbol.valueOf(name), message.getObjectProperty(key));
- continue;
- } else if (key.startsWith(JMS_AMQP_MESSAGE_ANNOTATION_PREFIX)) {
- if (maMap == null) {
- maMap = new HashMap<>();
- }
- String name = key.substring(JMS_AMQP_MESSAGE_ANNOTATION_PREFIX.length());
- maMap.put(Symbol.valueOf(name), message.getObjectProperty(key));
- continue;
- } else if (key.equals(JMS_AMQP_CONTENT_TYPE)) {
- if (properties == null) {
- properties = new Properties();
- }
- properties.setContentType(Symbol.getSymbol(message.getStringProperty(key)));
- continue;
- } else if (key.equals(JMS_AMQP_CONTENT_ENCODING)) {
- if (properties == null) {
- properties = new Properties();
- }
- properties.setContentEncoding(Symbol.getSymbol(message.getStringProperty(key)));
- continue;
- } else if (key.equals(JMS_AMQP_REPLYTO_GROUP_ID)) {
- if (properties == null) {
- properties = new Properties();
- }
- properties.setReplyToGroupId(message.getStringProperty(key));
- continue;
- } else if (key.startsWith(JMS_AMQP_FOOTER_PREFIX)) {
- if (footerMap == null) {
- footerMap = new HashMap<>();
- }
- String name = key.substring(JMS_AMQP_FOOTER_PREFIX.length());
- footerMap.put(name, message.getObjectProperty(key));
- continue;
- }
- } else if (key.equals("_AMQ_GROUP_ID")) {
- String value = message.getStringProperty(key);
- if (properties == null) {
- properties = new Properties();
- }
- properties.setGroupId(value);
- continue;
- } else if (key.equals(NATIVE_MESSAGE_ID)) {
- // skip..internal use only
- continue;
- } else if (key.endsWith(HDR_SCHEDULED_DELIVERY_TIME.toString())) {
- // skip..remove annotation from previous inbound transformation
- continue;
- } else if (key.equals(AMQPMessageTypes.AMQP_TYPE_KEY)) {
- // skip..internal use only - TODO - Remove this deprecated value in future release.
- continue;
- }
-
- if (apMap == null) {
- apMap = new HashMap<>();
- }
-
- Object objectProperty = message.getObjectProperty(key);
- if (objectProperty instanceof byte[]) {
- objectProperty = new Binary((byte[]) objectProperty);
- }
-
- apMap.put(key, objectProperty);
- }
-
- EncoderImpl encoder = tlsCodec.get().encoder;
- encoder.setByteBuffer(buffer);
-
- if (header != null) {
- encoder.writeObject(header);
- }
- if (daMap != null) {
- encoder.writeObject(new DeliveryAnnotations(daMap));
- }
- if (maMap != null) {
- encoder.writeObject(new MessageAnnotations(maMap));
- }
- if (properties != null) {
- encoder.writeObject(properties);
- }
- if (apMap != null) {
- encoder.writeObject(new ApplicationProperties(apMap));
- }
- if (body != null) {
- encoder.writeObject(body);
- }
- if (footerMap != null) {
- encoder.writeObject(new Footer(footerMap));
- }
-
- return messageFormat;
- }
-
- private Section convertBody(ServerJMSMessage message) throws JMSException {
-
- Section body = null;
- short orignalEncoding = AMQP_UNKNOWN;
-
- try {
- orignalEncoding = message.getShortProperty(JMS_AMQP_ORIGINAL_ENCODING);
- } catch (Exception ex) {
- // Ignore and stick with UNKNOWN
- }
-
- if (message instanceof ServerJMSBytesMessage) {
- Binary payload = getBinaryFromMessageBody((ServerJMSBytesMessage) message);
-
- if (payload == null) {
- payload = EMPTY_BINARY;
- }
-
- switch (orignalEncoding) {
- case AMQP_NULL:
- break;
- case AMQP_VALUE_BINARY:
- body = new AmqpValue(payload);
- break;
- case AMQP_DATA:
- case AMQP_UNKNOWN:
- default:
- body = new Data(payload);
- break;
- }
- } else if (message instanceof ServerJMSTextMessage) {
- switch (orignalEncoding) {
- case AMQP_NULL:
- break;
- case AMQP_DATA:
- body = new Data(getBinaryFromMessageBody((ServerJMSTextMessage) message));
- break;
- case AMQP_VALUE_STRING:
- case AMQP_UNKNOWN:
- default:
- body = new AmqpValue(((TextMessage) message).getText());
- break;
- }
- } else if (message instanceof ServerJMSMapMessage) {
- body = new AmqpValue(getMapFromMessageBody((ServerJMSMapMessage) message));
- } else if (message instanceof ServerJMSStreamMessage) {
- ArrayList<Object> list = new ArrayList<>();
- final ServerJMSStreamMessage m = (ServerJMSStreamMessage) message;
- try {
- while (true) {
- list.add(m.readObject());
- }
- } catch (MessageEOFException e) {
- }
-
- // Deprecated encoding markers - TODO - Remove on future release
- if (orignalEncoding == AMQP_UNKNOWN) {
- String amqpType = message.getStringProperty(AMQPMessageTypes.AMQP_TYPE_KEY);
- if (amqpType != null) {
- if (amqpType.equals(AMQPMessageTypes.AMQP_LIST)) {
- orignalEncoding = AMQP_VALUE_LIST;
- } else {
- orignalEncoding = AMQP_SEQUENCE;
- }
- }
- }
-
- switch (orignalEncoding) {
- case AMQP_SEQUENCE:
- body = new AmqpSequence(list);
- break;
- case AMQP_VALUE_LIST:
- case AMQP_UNKNOWN:
- default:
- body = new AmqpValue(list);
- break;
- }
- } else if (message instanceof ServerJMSObjectMessage) {
- Binary payload = getBinaryFromMessageBody((ServerJMSObjectMessage) message);
-
- if (payload == null) {
- payload = EMPTY_BINARY;
- }
-
- switch (orignalEncoding) {
- case AMQP_VALUE_BINARY:
- body = new AmqpValue(payload);
- break;
- case AMQP_DATA:
- case AMQP_UNKNOWN:
- default:
- body = new Data(payload);
- break;
- }
-
- // For a non-AMQP message we tag the outbound content type as containing
- // a serialized Java object so that an AMQP client has a hint as to what
- // we are sending it.
- if (!message.propertyExists(JMS_AMQP_CONTENT_TYPE)) {
- message.setStringProperty(JMS_AMQP_CONTENT_TYPE, SERIALIZED_JAVA_OBJECT_CONTENT_TYPE);
- }
- } else if (message instanceof ServerJMSMessage) {
- // If this is not an AMQP message that was converted then the original encoding
- // will be unknown so we check for special cases of messages with special data
- // encoded into the server message body.
- if (orignalEncoding == AMQP_UNKNOWN) {
- MessageInternal internalMessage = message.getInnerMessage();
- int readerIndex = internalMessage.getBodyBuffer().readerIndex();
- try {
- Object s = internalMessage.getBodyBuffer().readNullableSimpleString();
- if (s != null) {
- body = new AmqpValue(s.toString());
- }
- } catch (Throwable ignored) {
- logger.debug("Exception ignored during conversion, should be ok!", ignored.getMessage(), ignored);
- } finally {
- internalMessage.getBodyBuffer().readerIndex(readerIndex);
- }
- }
- }
-
- return body;
- }
-
- private Binary getBinaryFromMessageBody(ServerJMSBytesMessage message) throws JMSException {
- byte[] data = new byte[(int) message.getBodyLength()];
- message.readBytes(data);
- message.reset(); // Need to reset after readBytes or future readBytes
-
- return new Binary(data);
- }
-
- private Binary getBinaryFromMessageBody(ServerJMSTextMessage message) throws JMSException {
- Binary result = null;
- String text = message.getText();
- if (text != null) {
- result = new Binary(text.getBytes(StandardCharsets.UTF_8));
- }
-
- return result;
- }
-
- private Binary getBinaryFromMessageBody(ServerJMSObjectMessage message) throws JMSException {
- message.getInnerMessage().getBodyBuffer().resetReaderIndex();
- int size = message.getInnerMessage().getBodyBuffer().readInt();
- byte[] bytes = new byte[size];
- message.getInnerMessage().getBodyBuffer().readBytes(bytes);
-
- return new Binary(bytes);
- }
-
- private Map<String, Object> getMapFromMessageBody(ServerJMSMapMessage message) throws JMSException {
- final HashMap<String, Object> map = new LinkedHashMap<>();
-
- @SuppressWarnings("unchecked")
- final Enumeration<String> names = message.getMapNames();
- while (names.hasMoreElements()) {
- String key = names.nextElement();
- Object value = message.getObject(key);
- if (value instanceof byte[]) {
- value = new Binary((byte[]) value);
- }
- map.put(key, value);
- }
-
- return map;
- }
-
- private static byte destinationType(Destination destination) {
- if (destination instanceof Queue) {
- if (destination instanceof TemporaryQueue) {
- return TEMP_QUEUE_TYPE;
- } else {
- return QUEUE_TYPE;
- }
- } else if (destination instanceof Topic) {
- if (destination instanceof TemporaryTopic) {
- return TEMP_TOPIC_TYPE;
- } else {
- return TOPIC_TYPE;
- }
- }
-
- throw new IllegalArgumentException("Unknown Destination Type passed to JMS Transformer.");
- }
-}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/OutboundTransformer.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/OutboundTransformer.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/OutboundTransformer.java
deleted file mode 100644
index 5113513..0000000
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/message/OutboundTransformer.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * 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.converter.message;
-
-import java.io.UnsupportedEncodingException;
-
-import javax.jms.JMSException;
-
-import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSMessage;
-import org.apache.activemq.artemis.utils.IDGenerator;
-import org.apache.qpid.proton.codec.WritableBuffer;
-
-public abstract class OutboundTransformer {
-
- protected IDGenerator idGenerator;
-
- public OutboundTransformer(IDGenerator idGenerator) {
- this.idGenerator = idGenerator;
- }
-
- /**
- * Given an JMS Message perform a conversion to an AMQP Message and encode into a form that
- * is ready for transmission.
- *
- * @param message
- * the message to transform
- * @param buffer
- * the buffer where encoding should write to
- *
- * @return the message format key of the encoded message.
- *
- * @throws JMSException
- * if an error occurs during message transformation
- * @throws UnsupportedEncodingException
- * if an error occurs during message encoding
- */
- public abstract long transform(ServerJMSMessage message, WritableBuffer buffer) throws JMSException, UnsupportedEncodingException;
-
-}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/AMQPConnectionContext.java
----------------------------------------------------------------------
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 6462315..bac3e7e 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
@@ -134,6 +134,10 @@ public class AMQPConnectionContext extends ProtonInitializable {
handler.flush();
}
+ public void flush(boolean wait) {
+ handler.flush(wait);
+ }
+
public void close(ErrorCondition errorCondition) {
handler.close(errorCondition);
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/proton/ProtonServerReceiverContext.java
----------------------------------------------------------------------
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 8341de7..ea2635e 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
@@ -134,6 +134,7 @@ public class ProtonServerReceiverContext extends ProtonInitializable implements
@Override
public void onMessage(Delivery delivery) throws ActiveMQAMQPException {
Receiver receiver;
+ ByteBuf buffer = null;
try {
receiver = ((Receiver) delivery.getLink());
@@ -144,26 +145,30 @@ public class ProtonServerReceiverContext extends ProtonInitializable implements
if (delivery.isPartial()) {
return;
}
+ // This should be used if getDataLength was avilable
+// byte[] data = new byte[delivery.getDataLength()];
- ByteBuf buffer = PooledByteBufAllocator.DEFAULT.heapBuffer(10 * 1024);
- try {
- synchronized (connection.getLock()) {
- DeliveryUtil.readDelivery(receiver, buffer);
+ buffer = PooledByteBufAllocator.DEFAULT.heapBuffer(10 * 1024);
+ Transaction tx = null;
- receiver.advance();
+ synchronized (connection.getLock()) {
+ DeliveryUtil.readDelivery(receiver, buffer);
+ receiver.advance();
+ }
- Transaction tx = null;
- if (delivery.getRemoteState() instanceof TransactionalState) {
+ byte[] data = new byte[buffer.writerIndex()];
+ buffer.readBytes(data);
- TransactionalState txState = (TransactionalState) delivery.getRemoteState();
- tx = this.sessionSPI.getTransaction(txState.getTxnId());
- }
- sessionSPI.serverSend(tx, receiver, delivery, address, delivery.getMessageFormat(), buffer);
+ if (delivery.getRemoteState() instanceof TransactionalState) {
- flow(maxCreditAllocation, minCreditRefresh);
- }
- } finally {
- buffer.release();
+ TransactionalState txState = (TransactionalState) delivery.getRemoteState();
+ tx = this.sessionSPI.getTransaction(txState.getTxnId());
+ }
+
+ sessionSPI.serverSend(tx, receiver, delivery, address, delivery.getMessageFormat(), data);
+
+ synchronized (connection.getLock()) {
+ flow(maxCreditAllocation, minCreditRefresh);
}
} catch (Exception e) {
log.warn(e.getMessage(), e);
@@ -174,6 +179,10 @@ public class ProtonServerReceiverContext extends ProtonInitializable implements
rejected.setError(condition);
delivery.disposition(rejected);
delivery.settle();
+ } finally {
+ if (buffer != null) {
+ buffer.release();
+ }
}
}
[12/17] activemq-artemis git commit: ARTEMIS-1009 Pure Message
Encoding.
Posted by cl...@apache.org.
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPMessage.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPMessage.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPMessage.java
new file mode 100644
index 0000000..40c041d
--- /dev/null
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPMessage.java
@@ -0,0 +1,846 @@
+/*
+ * 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.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import io.netty.buffer.ByteBuf;
+import io.netty.buffer.PooledByteBufAllocator;
+import io.netty.buffer.Unpooled;
+import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
+import org.apache.activemq.artemis.api.core.ActiveMQPropertyConversionException;
+import org.apache.activemq.artemis.api.core.ICoreMessage;
+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.persistence.Persister;
+import org.apache.activemq.artemis.protocol.amqp.converter.AMQPConverter;
+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.qpid.proton.amqp.Symbol;
+import org.apache.qpid.proton.amqp.UnsignedInteger;
+import org.apache.qpid.proton.amqp.messaging.ApplicationProperties;
+import org.apache.qpid.proton.amqp.messaging.DeliveryAnnotations;
+import org.apache.qpid.proton.amqp.messaging.Header;
+import org.apache.qpid.proton.amqp.messaging.MessageAnnotations;
+import org.apache.qpid.proton.amqp.messaging.Properties;
+import org.apache.qpid.proton.amqp.messaging.Section;
+import org.apache.qpid.proton.codec.DecoderImpl;
+import org.apache.qpid.proton.message.Message;
+import org.apache.qpid.proton.message.impl.MessageImpl;
+
+// see https://docs.oasis-open.org/amqp/core/v1.0/os/amqp-core-messaging-v1.0-os.html#section-message-format
+public class AMQPMessage extends RefCountMessage {
+
+ final long messageFormat;
+ ByteBuf data;
+ boolean bufferValid;
+ byte type;
+ long messageID;
+ String address;
+ MessageImpl protonMessage;
+ private volatile int memoryEstimate = -1;
+ private long expiration = 0;
+ // this is to store where to start sending bytes, ignoring header and delivery annotations.
+ private int sendFrom = -1;
+ private boolean parsedHeaders = false;
+ private Header _header;
+ private DeliveryAnnotations _deliveryAnnotations;
+ private MessageAnnotations _messageAnnotations;
+ private Properties _properties;
+ private ApplicationProperties applicationProperties;
+ private long scheduledTime = -1;
+
+ public AMQPMessage(long messageFormat, byte[] data) {
+ this.data = Unpooled.wrappedBuffer(data);
+ this.messageFormat = messageFormat;
+ this.bufferValid = true;
+
+ }
+
+ /** for persistence reload */
+ public AMQPMessage(long messageFormat) {
+ this.messageFormat = messageFormat;
+ this.bufferValid = false;
+
+ }
+
+ public AMQPMessage(long messageFormat, Message message) {
+ this.messageFormat = messageFormat;
+ this.protonMessage = (MessageImpl)message;
+
+ }
+
+ public AMQPMessage(Message message) {
+ this(0, message);
+ }
+
+ public MessageImpl getProtonMessage() {
+ if (protonMessage == null) {
+ protonMessage = (MessageImpl) Message.Factory.create();
+
+ if (data != null) {
+ data.readerIndex(0);
+ protonMessage.decode(data.nioBuffer());
+ this._header = protonMessage.getHeader();
+ protonMessage.setHeader(null);
+ }
+ }
+
+ return protonMessage;
+ }
+
+ private void initalizeObjects() {
+ if (protonMessage == null) {
+ if (data == null) {
+ this.sendFrom = -1;
+ _header = new Header();
+ _deliveryAnnotations = new DeliveryAnnotations(new HashMap<>());
+ _properties = new Properties();
+ this.applicationProperties = new ApplicationProperties(new HashMap<>());
+ this.protonMessage = (MessageImpl)Message.Factory.create();
+ this.protonMessage.setApplicationProperties(applicationProperties);
+ this.protonMessage.setDeliveryAnnotations(_deliveryAnnotations);
+ }
+ }
+ }
+
+ private Map getApplicationPropertiesMap() {
+
+ ApplicationProperties appMap = getApplicationProperties();
+ Map map = null;
+
+ if (appMap != null) {
+ map = appMap.getValue();
+ }
+
+ if (map == null) {
+ return Collections.emptyMap();
+ } else {
+ return map;
+ }
+ }
+
+ private ApplicationProperties getApplicationProperties() {
+ parseHeaders();
+ return applicationProperties;
+ }
+
+ private void parseHeaders() {
+ if (!parsedHeaders) {
+ if (data == null) {
+ initalizeObjects();
+ } else {
+ partialDecode(data.nioBuffer());
+ }
+ parsedHeaders = true;
+ }
+ }
+
+ public MessageAnnotations getMessageAnnotations() {
+ parseHeaders();
+ return _messageAnnotations;
+ }
+
+ public Header getHeader() {
+ parseHeaders();
+ return _header;
+ }
+
+ public Properties getProperties() {
+ parseHeaders();
+ return _properties;
+ }
+
+ private Object getSymbol(String symbol) {
+ return getSymbol(Symbol.getSymbol(symbol));
+ }
+
+ private Object getSymbol(Symbol symbol) {
+ MessageAnnotations annotations = getMessageAnnotations();
+ Map mapAnnotations = annotations != null ? annotations.getValue() : null;
+ if (mapAnnotations != null) {
+ return mapAnnotations.get(symbol);
+ }
+
+ return null;
+ }
+
+ @Override
+ public RoutingType getRouteType() {
+
+ switch (((Byte)type).byteValue()) {
+ case AMQPMessageSupport.QUEUE_TYPE:
+ case AMQPMessageSupport.TEMP_QUEUE_TYPE:
+ return RoutingType.ANYCAST;
+
+ case AMQPMessageSupport.TOPIC_TYPE:
+ case AMQPMessageSupport.TEMP_TOPIC_TYPE:
+ return RoutingType.MULTICAST;
+ default:
+ return null;
+ }
+ }
+
+
+
+ @Override
+ public Long getScheduledDeliveryTime() {
+
+ if (scheduledTime < 0) {
+ Object objscheduledTime = getSymbol("x-opt-delivery-time");
+ Object objdelay = getSymbol("x-opt-delivery-delay");
+
+ if (objscheduledTime != null && objscheduledTime instanceof Number) {
+ this.scheduledTime = ((Number) objscheduledTime).longValue();
+ } else if (objdelay != null && objdelay instanceof Number) {
+ this.scheduledTime = System.currentTimeMillis() + ((Number) objdelay).longValue();
+ } else {
+ this.scheduledTime = 0;
+ }
+ }
+
+ return scheduledTime == 0 ? null : scheduledTime;
+ }
+
+ @Override
+ public Persister<org.apache.activemq.artemis.api.core.Message> getPersister() {
+ return AMQPMessagePersister.getInstance();
+ }
+
+ private synchronized void partialDecode(ByteBuffer buffer) {
+ DecoderImpl decoder = TLSEncode.getDecoder();
+ decoder.setByteBuffer(buffer);
+ buffer.position(0);
+
+ _header = null;
+ _deliveryAnnotations = null;
+ _messageAnnotations = null;
+ _properties = null;
+ applicationProperties = null;
+ Section section = null;
+
+ try {
+ if (buffer.hasRemaining()) {
+ section = (Section) decoder.readObject();
+ }
+
+ if (section instanceof Header) {
+ sendFrom = buffer.position();
+ _header = (Header) section;
+
+ if (_header.getTtl() != null) {
+ this.expiration = System.currentTimeMillis() + _header.getTtl().intValue();
+ }
+
+ if (buffer.hasRemaining()) {
+ section = (Section) decoder.readObject();
+ } else {
+ section = null;
+ }
+ } else {
+ // meaning there is no header
+ sendFrom = 0;
+ }
+ if (section instanceof DeliveryAnnotations) {
+ _deliveryAnnotations = (DeliveryAnnotations) section;
+ sendFrom = buffer.position();
+
+ if (buffer.hasRemaining()) {
+ section = (Section) decoder.readObject();
+ } else {
+ section = null;
+ }
+
+ }
+ if (section instanceof MessageAnnotations) {
+ _messageAnnotations = (MessageAnnotations) section;
+
+ if (buffer.hasRemaining()) {
+ section = (Section) decoder.readObject();
+ } else {
+ section = null;
+ }
+
+ }
+ if (section instanceof Properties) {
+ _properties = (Properties) section;
+
+ if (buffer.hasRemaining()) {
+ section = (Section) decoder.readObject();
+ } else {
+ section = null;
+ }
+ }
+
+ if (section instanceof ApplicationProperties) {
+ applicationProperties = (ApplicationProperties) section;
+ }
+ } finally {
+ decoder.setByteBuffer(null);
+ }
+ }
+
+ public long getMessageFormat() {
+ return messageFormat;
+ }
+
+ public int getLength() {
+ return data.array().length;
+ }
+
+ public byte[] getArray() {
+ return data.array();
+ }
+
+ @Override
+ public void messageChanged() {
+ bufferValid = false;
+ this.data = null;
+ }
+
+ @Override
+ public ByteBuf getBuffer() {
+ if (data == null) {
+ return null;
+ } else {
+ return Unpooled.wrappedBuffer(data);
+ }
+ }
+
+ @Override
+ public AMQPMessage setBuffer(ByteBuf buffer) {
+ this.data = null;
+ return this;
+ }
+
+ @Override
+ public org.apache.activemq.artemis.api.core.Message copy() {
+ checkBuffer();
+ AMQPMessage newEncode = new AMQPMessage(this.messageFormat, data.array());
+ return newEncode;
+ }
+
+ @Override
+ public org.apache.activemq.artemis.api.core.Message copy(long newID) {
+ checkBuffer();
+ return copy().setMessageID(newID);
+ }
+
+ @Override
+ public long getMessageID() {
+ return messageID;
+ }
+
+ @Override
+ public org.apache.activemq.artemis.api.core.Message setMessageID(long id) {
+ this.messageID = id;
+ return this;
+ }
+
+ @Override
+ public long getExpiration() {
+ return expiration;
+ }
+
+ @Override
+ public AMQPMessage setExpiration(long expiration) {
+ this.expiration = expiration;
+ return this;
+ }
+
+ @Override
+ public Object getUserID() {
+ return getProperties().getMessageId();
+ }
+
+ @Override
+ public org.apache.activemq.artemis.api.core.Message setUserID(Object userID) {
+ return null;
+ }
+
+ @Override
+ public void copyHeadersAndProperties(org.apache.activemq.artemis.api.core.Message msg) {
+
+ }
+
+ @Override
+ public boolean isDurable() {
+ if (getHeader() != null && getHeader().getDurable() != null) {
+ return getHeader().getDurable().booleanValue();
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public org.apache.activemq.artemis.api.core.Message setDurable(boolean durable) {
+ return null;
+ }
+
+ @Override
+ public String getAddress() {
+ if (address == null) {
+ Properties properties = getProtonMessage().getProperties();
+ if (properties != null) {
+ return properties.getTo();
+ } else {
+ return null;
+ }
+ } else {
+ return address;
+ }
+ }
+
+ @Override
+ public AMQPMessage setAddress(String address) {
+ this.address = address;
+ return this;
+ }
+
+ @Override
+ public AMQPMessage setAddress(SimpleString address) {
+ return setAddress(address.toString());
+ }
+
+ @Override
+ public SimpleString getAddressSimpleString() {
+ return SimpleString.toSimpleString(getAddress());
+ }
+
+ @Override
+ public long getTimestamp() {
+ return 0;
+ }
+
+ @Override
+ public org.apache.activemq.artemis.api.core.Message setTimestamp(long timestamp) {
+ return null;
+ }
+
+ @Override
+ public byte getPriority() {
+ return 0;
+ }
+
+ @Override
+ public org.apache.activemq.artemis.api.core.Message setPriority(byte priority) {
+ return null;
+ }
+
+ @Override
+ public void receiveBuffer(ByteBuf buffer) {
+
+ }
+
+ private synchronized void checkBuffer() {
+ if (!bufferValid) {
+ ByteBuf buffer = PooledByteBufAllocator.DEFAULT.heapBuffer(1500);
+ try {
+ getProtonMessage().encode(new NettyWritable(buffer));
+ byte[] bytes = new byte[buffer.writerIndex()];
+ buffer.readBytes(bytes);
+ this.data = Unpooled.wrappedBuffer(bytes);
+ } finally {
+ buffer.release();
+ }
+ }
+ }
+
+ @Override
+ public void sendBuffer(ByteBuf buffer, int deliveryCount) {
+ checkBuffer();
+ Header header = getHeader();
+ if (header != null) {
+ synchronized (header) {
+ if (header.getDeliveryCount() != null) {
+ header.setDeliveryCount(UnsignedInteger.valueOf(header.getDeliveryCount().intValue() + 1));
+ } else {
+ header.setDeliveryCount(UnsignedInteger.valueOf(1));
+ }
+ TLSEncode.getEncoder().setByteBuffer(new NettyWritable(buffer));
+ TLSEncode.getEncoder().writeObject(header);
+ }
+ }
+ buffer.writeBytes(data, sendFrom, data.writerIndex() - sendFrom);
+ }
+
+ @Override
+ public org.apache.activemq.artemis.api.core.Message putBooleanProperty(String key, boolean value) {
+ getApplicationPropertiesMap().put(key, Boolean.valueOf(value));
+ return this;
+ }
+
+ @Override
+ public org.apache.activemq.artemis.api.core.Message putByteProperty(String key, byte value) {
+ getApplicationPropertiesMap().put(key, Byte.valueOf(value));
+ return this;
+ }
+
+ @Override
+ public org.apache.activemq.artemis.api.core.Message putBytesProperty(String key, byte[] value) {
+ getApplicationPropertiesMap().put(key, value);
+ return this;
+ }
+
+ @Override
+ public org.apache.activemq.artemis.api.core.Message putShortProperty(String key, short value) {
+ getApplicationPropertiesMap().put(key, Short.valueOf(value));
+ return this;
+ }
+
+ @Override
+ public org.apache.activemq.artemis.api.core.Message putCharProperty(String key, char value) {
+ getApplicationPropertiesMap().put(key, Character.valueOf(value));
+ return this;
+ }
+
+ @Override
+ public org.apache.activemq.artemis.api.core.Message putIntProperty(String key, int value) {
+ getApplicationPropertiesMap().put(key, Integer.valueOf(value));
+ return this;
+ }
+
+ @Override
+ public org.apache.activemq.artemis.api.core.Message putLongProperty(String key, long value) {
+ getApplicationPropertiesMap().put(key, Long.valueOf(value));
+ return this;
+ }
+
+ @Override
+ public org.apache.activemq.artemis.api.core.Message putFloatProperty(String key, float value) {
+ getApplicationPropertiesMap().put(key, Float.valueOf(value));
+ return this;
+ }
+
+ @Override
+ public org.apache.activemq.artemis.api.core.Message putDoubleProperty(String key, double value) {
+ getApplicationPropertiesMap().put(key, Double.valueOf(value));
+ return this;
+ }
+
+ @Override
+ public org.apache.activemq.artemis.api.core.Message putBooleanProperty(SimpleString key, boolean value) {
+ getApplicationPropertiesMap().put(key, Boolean.valueOf(value));
+ return this;
+ }
+
+ @Override
+ public 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) {
+ return putBytesProperty(key.toString(), value);
+ }
+
+ @Override
+ public 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) {
+ return putCharProperty(key.toString(), value);
+ }
+
+ @Override
+ public 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) {
+ return putLongProperty(key.toString(), value);
+ }
+
+ @Override
+ public 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) {
+ return putDoubleProperty(key.toString(), value);
+ }
+
+ @Override
+ public org.apache.activemq.artemis.api.core.Message putStringProperty(String key, String value) {
+ getApplicationPropertiesMap().put(key, value);
+ return this;
+ }
+
+ @Override
+ public org.apache.activemq.artemis.api.core.Message putObjectProperty(String key,
+ Object value) throws ActiveMQPropertyConversionException {
+ getApplicationPropertiesMap().put(key, value);
+ return this;
+ }
+
+ @Override
+ public org.apache.activemq.artemis.api.core.Message putObjectProperty(SimpleString key,
+ Object value) throws ActiveMQPropertyConversionException {
+ return putObjectProperty(key.toString(), value);
+ }
+
+ @Override
+ public Object removeProperty(String key) {
+ return getApplicationPropertiesMap().remove(key);
+ }
+
+ @Override
+ public boolean containsProperty(String key) {
+ return getApplicationPropertiesMap().containsKey(key);
+ }
+
+ @Override
+ public Boolean getBooleanProperty(String key) throws ActiveMQPropertyConversionException {
+ return (Boolean)getApplicationPropertiesMap().get(key);
+ }
+
+ @Override
+ public Byte getByteProperty(String key) throws ActiveMQPropertyConversionException {
+ return (Byte)getApplicationPropertiesMap().get(key);
+ }
+
+ @Override
+ public Double getDoubleProperty(String key) throws ActiveMQPropertyConversionException {
+ return (Double)getApplicationPropertiesMap().get(key);
+ }
+
+ @Override
+ public Integer getIntProperty(String key) throws ActiveMQPropertyConversionException {
+ return (Integer)getApplicationPropertiesMap().get(key);
+ }
+
+ @Override
+ public Long getLongProperty(String key) throws ActiveMQPropertyConversionException {
+ return (Long)getApplicationPropertiesMap().get(key);
+ }
+
+ @Override
+ public Object getObjectProperty(String key) {
+ if (key.equals("JMSType")) {
+ return getProperties().getSubject();
+ }
+
+ return getApplicationPropertiesMap().get(key);
+ }
+
+ @Override
+ public Short getShortProperty(String key) throws ActiveMQPropertyConversionException {
+ return (Short)getApplicationPropertiesMap().get(key);
+ }
+
+ @Override
+ public Float getFloatProperty(String key) throws ActiveMQPropertyConversionException {
+ return (Float)getApplicationPropertiesMap().get(key);
+ }
+
+ @Override
+ public String getStringProperty(String key) throws ActiveMQPropertyConversionException {
+ if (key.equals("JMSType")) {
+ return getProperties().getSubject();
+ }
+ return (String)getApplicationPropertiesMap().get(key);
+ }
+
+ @Override
+ public boolean containsDeliveryAnnotationProperty(SimpleString key) {
+ parseHeaders();
+ if (_deliveryAnnotations == null || _deliveryAnnotations.getValue() == null) {
+ return false;
+ }
+ return _deliveryAnnotations.getValue().containsKey(key.toString());
+ }
+
+ @Override
+ public Object removeDeliveryAnnoationProperty(SimpleString key) {
+ parseHeaders();
+ if (_deliveryAnnotations == null || _deliveryAnnotations.getValue() == null) {
+ return null;
+ }
+ return _deliveryAnnotations.getValue().remove(key.toString());
+ }
+
+ @Override
+ public Object getDeliveryAnnotationProperty(SimpleString key) {
+ return null;
+ }
+
+ @Override
+ public SimpleString getSimpleStringProperty(String key) throws ActiveMQPropertyConversionException {
+ return SimpleString.toSimpleString((String)getApplicationPropertiesMap().get(key));
+ }
+
+ @Override
+ public byte[] getBytesProperty(String key) throws ActiveMQPropertyConversionException {
+ return (byte[]) getApplicationPropertiesMap().get(key);
+ }
+
+ @Override
+ public Object removeProperty(SimpleString key) {
+ return removeProperty(key.toString());
+ }
+
+ @Override
+ public boolean containsProperty(SimpleString key) {
+ return containsProperty(key.toString());
+ }
+
+ @Override
+ public Boolean getBooleanProperty(SimpleString key) throws ActiveMQPropertyConversionException {
+ return getBooleanProperty(key.toString());
+ }
+
+ @Override
+ public Byte getByteProperty(SimpleString key) throws ActiveMQPropertyConversionException {
+ return getByteProperty(key.toString());
+ }
+
+ @Override
+ public Double getDoubleProperty(SimpleString key) throws ActiveMQPropertyConversionException {
+ return getDoubleProperty(key.toString());
+ }
+
+ @Override
+ public Integer getIntProperty(SimpleString key) throws ActiveMQPropertyConversionException {
+ return getIntProperty(key.toString());
+ }
+
+ @Override
+ public Long getLongProperty(SimpleString key) throws ActiveMQPropertyConversionException {
+ return getLongProperty(key.toString());
+ }
+
+ @Override
+ public Object getObjectProperty(SimpleString key) {
+ return getObjectProperty(key.toString());
+ }
+
+ @Override
+ public Short getShortProperty(SimpleString key) throws ActiveMQPropertyConversionException {
+ return getShortProperty(key.toString());
+ }
+
+ @Override
+ public Float getFloatProperty(SimpleString key) throws ActiveMQPropertyConversionException {
+ return getFloatProperty(key.toString());
+ }
+
+ @Override
+ public String getStringProperty(SimpleString key) throws ActiveMQPropertyConversionException {
+ return getStringProperty(key.toString());
+ }
+
+ @Override
+ public SimpleString getSimpleStringProperty(SimpleString key) throws ActiveMQPropertyConversionException {
+ return getSimpleStringProperty(key.toString());
+ }
+
+ @Override
+ public byte[] getBytesProperty(SimpleString key) throws ActiveMQPropertyConversionException {
+ return getBytesProperty(key.toString());
+ }
+
+ @Override
+ public org.apache.activemq.artemis.api.core.Message putStringProperty(SimpleString key, SimpleString value) {
+ return putStringProperty(key.toString(), value.toString());
+ }
+
+ @Override
+ public int getEncodeSize() {
+ return 0;
+ }
+
+ @Override
+ public Set<SimpleString> getPropertyNames() {
+ HashSet<SimpleString> values = new HashSet<>();
+ for (Object k : getApplicationPropertiesMap().keySet()) {
+ values.add(SimpleString.toSimpleString(k.toString()));
+ }
+ return values;
+ }
+
+ @Override
+ public int getMemoryEstimate() {
+ if (memoryEstimate == -1) {
+ memoryEstimate = memoryOffset +
+ (data != null ? data.capacity() : 0);
+ }
+
+ return memoryEstimate;
+ }
+
+ @Override
+ public ICoreMessage toCore() {
+ try {
+ return AMQPConverter.getInstance().toCore(this);
+ } catch (Exception e) {
+ throw new RuntimeException(e.getMessage(), e);
+ }
+ }
+
+
+ @Override
+ public SimpleString getReplyTo() {
+ if (getProperties() != null) {
+ return SimpleString.toSimpleString(getProperties().getReplyTo());
+ } else {
+ return null;
+ }
+
+ }
+
+ @Override
+ public AMQPMessage setReplyTo(SimpleString address) {
+ if (getProperties() != null) {
+ getProperties().setReplyTo(address != null ? address.toString() : null);
+ }
+ return this;
+ }
+
+
+ @Override
+ public int getPersistSize() {
+ checkBuffer();
+ return data.array().length + DataConstants.SIZE_INT;
+ }
+
+ @Override
+ public void persist(ActiveMQBuffer targetRecord) {
+ checkBuffer();
+ targetRecord.writeInt(data.array().length);
+ targetRecord.writeBytes(data.array());
+ }
+
+ @Override
+ public void reloadPersistence(ActiveMQBuffer record) {
+ int size = record.readInt();
+ byte[] recordArray = new byte[size];
+ record.readBytes(recordArray);
+ this.data = Unpooled.wrappedBuffer(recordArray);
+ this.bufferValid = true;
+ }
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPMessagePersister.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..3b5bdda
--- /dev/null
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPMessagePersister.java
@@ -0,0 +1,75 @@
+/**
+ * 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 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.spi.core.protocol.MessagePersister;
+import org.apache.activemq.artemis.utils.DataConstants;
+
+public class AMQPMessagePersister extends MessagePersister {
+
+ public static AMQPMessagePersister theInstance = new AMQPMessagePersister();
+
+ public static AMQPMessagePersister getInstance() {
+ return theInstance;
+ }
+
+ private AMQPMessagePersister() {
+ }
+
+ @Override
+ protected byte getID() {
+ return ProtonProtocolManagerFactory.ID;
+ }
+
+ @Override
+ public int getEncodeSize(Message record) {
+ return DataConstants.SIZE_BYTE + record.getPersistSize() +
+ SimpleString.sizeofNullableString(record.getAddressSimpleString()) + DataConstants.SIZE_LONG + DataConstants.SIZE_LONG;
+ }
+
+
+ /** Sub classes must add the first short as the protocol-id */
+ @Override
+ public void encode(ActiveMQBuffer buffer, Message record) {
+ super.encode(buffer, record);
+ AMQPMessage msgEncode = (AMQPMessage)record;
+ buffer.writeLong(record.getMessageID());
+ buffer.writeLong(msgEncode.getMessageFormat());
+ buffer.writeNullableSimpleString(record.getAddressSimpleString());
+ record.persist(buffer);
+ }
+
+
+ @Override
+ public Message decode(ActiveMQBuffer buffer, Message record) {
+ long id = buffer.readLong();
+ long format = buffer.readLong();
+ SimpleString address = buffer.readNullableSimpleString();
+ record = new AMQPMessage(format);
+ record.reloadPersistence(buffer);
+ record.setMessageID(id);
+ if (address != null) {
+ record.setAddress(address);
+ }
+ return record;
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/AMQPSessionCallback.java
----------------------------------------------------------------------
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 18c6b05..5fc2209 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
@@ -23,6 +23,8 @@ import java.util.concurrent.atomic.AtomicBoolean;
import org.apache.activemq.artemis.api.core.ActiveMQException;
import org.apache.activemq.artemis.api.core.ActiveMQQueueExistsException;
+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.ActiveMQClient;
import org.apache.activemq.artemis.core.io.IOCallback;
@@ -32,16 +34,12 @@ import org.apache.activemq.artemis.core.server.AddressQueryResult;
import org.apache.activemq.artemis.core.server.BindingQueryResult;
import org.apache.activemq.artemis.core.server.MessageReference;
import org.apache.activemq.artemis.core.server.QueueQueryResult;
-import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.core.server.ServerConsumer;
-import org.apache.activemq.artemis.core.server.ServerMessage;
import org.apache.activemq.artemis.core.server.ServerSession;
import org.apache.activemq.artemis.core.server.impl.AddressInfo;
import org.apache.activemq.artemis.core.server.impl.ServerConsumerImpl;
import org.apache.activemq.artemis.core.transaction.Transaction;
import org.apache.activemq.artemis.jms.client.ActiveMQConnection;
-import org.apache.activemq.artemis.protocol.amqp.converter.ProtonMessageConverter;
-import org.apache.activemq.artemis.protocol.amqp.converter.message.EncodedMessage;
import org.apache.activemq.artemis.protocol.amqp.exceptions.ActiveMQAMQPException;
import org.apache.activemq.artemis.protocol.amqp.exceptions.ActiveMQAMQPInternalErrorException;
import org.apache.activemq.artemis.protocol.amqp.exceptions.ActiveMQAMQPResourceLimitExceededException;
@@ -65,11 +63,9 @@ import org.apache.qpid.proton.amqp.messaging.Accepted;
import org.apache.qpid.proton.amqp.messaging.Rejected;
import org.apache.qpid.proton.amqp.transport.AmqpError;
import org.apache.qpid.proton.amqp.transport.ErrorCondition;
-import org.apache.qpid.proton.codec.WritableBuffer;
import org.apache.qpid.proton.engine.Delivery;
import org.apache.qpid.proton.engine.EndpointState;
import org.apache.qpid.proton.engine.Receiver;
-import io.netty.buffer.ByteBuf;
import org.jboss.logging.Logger;
public class AMQPSessionCallback implements SessionCallback {
@@ -298,13 +294,6 @@ public class AMQPSessionCallback implements SessionCallback {
}
}
- public long encodeMessage(Object message, int deliveryCount, WritableBuffer buffer) throws Exception {
- ProtonMessageConverter converter = (ProtonMessageConverter) manager.getConverter();
-
- // The Proton variant accepts a WritableBuffer to allow for a faster more direct encode.
- return (long) converter.outbound((ServerMessage) message, deliveryCount, buffer);
- }
-
public String tempQueueName() {
return UUIDGenerator.getInstance().generateStringUUID();
}
@@ -321,22 +310,22 @@ public class AMQPSessionCallback implements SessionCallback {
}
}
- public void ack(Transaction transaction, Object brokerConsumer, Object message) throws Exception {
+ public void ack(Transaction transaction, Object brokerConsumer, Message message) throws Exception {
if (transaction == null) {
transaction = serverSession.getCurrentTransaction();
}
recoverContext();
try {
- ((ServerConsumer) brokerConsumer).individualAcknowledge(transaction, ((ServerMessage) message).getMessageID());
+ ((ServerConsumer) brokerConsumer).individualAcknowledge(transaction, message.getMessageID());
} finally {
resetContext();
}
}
- public void cancel(Object brokerConsumer, Object message, boolean updateCounts) throws Exception {
+ public void cancel(Object brokerConsumer, Message message, boolean updateCounts) throws Exception {
recoverContext();
try {
- ((ServerConsumer) brokerConsumer).individualCancel(((ServerMessage) message).getMessageID(), updateCounts);
+ ((ServerConsumer) brokerConsumer).individualCancel(message.getMessageID(), updateCounts);
} finally {
resetContext();
}
@@ -351,11 +340,8 @@ public class AMQPSessionCallback implements SessionCallback {
final Delivery delivery,
String address,
int messageFormat,
- ByteBuf messageEncoded) throws Exception {
- EncodedMessage encodedMessage = new EncodedMessage(messageFormat, messageEncoded.array(), messageEncoded.arrayOffset(), messageEncoded.writerIndex());
-
- ServerMessage message = manager.getConverter().inbound(encodedMessage);
- //use the address on the receiver if not null, if null let's hope it was set correctly on the message
+ byte[] data) throws Exception {
+ AMQPMessage message = new AMQPMessage(messageFormat, data);
if (address != null) {
message.setAddress(new SimpleString(address));
} else {
@@ -372,7 +358,7 @@ public class AMQPSessionCallback implements SessionCallback {
recoverContext();
- PagingStore store = manager.getServer().getPagingManager().getPageStore(message.getAddress());
+ PagingStore store = manager.getServer().getPagingManager().getPageStore(message.getAddressSimpleString());
if (store.isRejectingMessages()) {
// We drop pre-settled messages (and abort any associated Tx)
if (delivery.remotelySettled()) {
@@ -401,12 +387,12 @@ public class AMQPSessionCallback implements SessionCallback {
}
private void serverSend(final Transaction transaction,
- final ServerMessage message,
+ final Message message,
final Delivery delivery,
final Receiver receiver) throws Exception {
try {
- message.putStringProperty(ActiveMQConnection.CONNECTION_ID_PROPERTY_NAME.toString(), receiver.getSession().getConnection().getRemoteContainer());
+// message.putStringProperty(ActiveMQConnection.CONNECTION_ID_PROPERTY_NAME.toString(), receiver.getSession().getConnection().getRemoteContainer());
serverSession.send(transaction, message, false, false);
// FIXME Potential race here...
@@ -416,8 +402,8 @@ public class AMQPSessionCallback implements SessionCallback {
synchronized (connection.getLock()) {
delivery.disposition(Accepted.getInstance());
delivery.settle();
- connection.flush();
}
+ connection.flush(true);
}
@Override
@@ -492,14 +478,14 @@ public class AMQPSessionCallback implements SessionCallback {
}
@Override
- public int sendMessage(MessageReference ref, ServerMessage message, ServerConsumer consumer, int deliveryCount) {
+ public int sendMessage(MessageReference ref, Message message, ServerConsumer consumer, int deliveryCount) {
message.removeProperty(ActiveMQConnection.CONNECTION_ID_PROPERTY_NAME.toString());
ProtonServerSenderContext plugSender = (ProtonServerSenderContext) consumer.getProtocolContext();
try {
- return plugSender.deliverMessage(message, deliveryCount);
+ return plugSender.deliverMessage(CoreAmqpConverter.checkAMQP(message), deliveryCount);
} catch (Exception e) {
synchronized (connection.getLock()) {
plugSender.getSender().setCondition(new ErrorCondition(AmqpError.INTERNAL_ERROR, e.getMessage()));
@@ -512,7 +498,7 @@ public class AMQPSessionCallback implements SessionCallback {
@Override
public int sendLargeMessage(MessageReference ref,
- ServerMessage message,
+ Message message,
ServerConsumer consumer,
long bodySize,
int deliveryCount) {
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/ProtonProtocolManager.java
----------------------------------------------------------------------
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 754172a..9c7d24d 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
@@ -26,19 +26,17 @@ import io.netty.channel.ChannelPipeline;
import org.apache.activemq.artemis.api.core.ActiveMQBuffer;
import org.apache.activemq.artemis.api.core.BaseInterceptor;
import org.apache.activemq.artemis.api.core.Interceptor;
+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.remoting.impl.netty.NettyServerConnection;
import org.apache.activemq.artemis.core.server.ActiveMQServer;
-import org.apache.activemq.artemis.api.core.RoutingType;
import org.apache.activemq.artemis.core.server.management.Notification;
import org.apache.activemq.artemis.core.server.management.NotificationListener;
import org.apache.activemq.artemis.jms.client.ActiveMQDestination;
-import org.apache.activemq.artemis.protocol.amqp.converter.ProtonMessageConverter;
import org.apache.activemq.artemis.protocol.amqp.proton.AMQPConnectionContext;
import org.apache.activemq.artemis.protocol.amqp.proton.AMQPConstants;
import org.apache.activemq.artemis.spi.core.protocol.ConnectionEntry;
-import org.apache.activemq.artemis.spi.core.protocol.MessageConverter;
import org.apache.activemq.artemis.spi.core.protocol.ProtocolManager;
import org.apache.activemq.artemis.spi.core.protocol.ProtocolManagerFactory;
import org.apache.activemq.artemis.spi.core.protocol.RemotingConnection;
@@ -54,8 +52,6 @@ public class ProtonProtocolManager implements ProtocolManager<Interceptor>, Noti
private final ActiveMQServer server;
- private MessageConverter protonConverter;
-
private final ProtonProtocolManagerFactory factory;
private final Map<SimpleString, RoutingType> prefixes = new HashMap<>();
@@ -72,7 +68,6 @@ public class ProtonProtocolManager implements ProtocolManager<Interceptor>, Noti
public ProtonProtocolManager(ProtonProtocolManagerFactory factory, ActiveMQServer server) {
this.factory = factory;
this.server = server;
- this.protonConverter = new ProtonMessageConverter(server.getStorageManager());
}
public ActiveMQServer getServer() {
@@ -80,11 +75,6 @@ public class ProtonProtocolManager implements ProtocolManager<Interceptor>, Noti
}
@Override
- public MessageConverter getConverter() {
- return protonConverter;
- }
-
- @Override
public void onNotification(Notification notification) {
}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/ProtonProtocolManagerFactory.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/ProtonProtocolManagerFactory.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/ProtonProtocolManagerFactory.java
index bef8ef0..98ec228 100644
--- a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/ProtonProtocolManagerFactory.java
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/broker/ProtonProtocolManagerFactory.java
@@ -22,6 +22,8 @@ import java.util.Map;
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.core.persistence.Persister;
import org.apache.activemq.artemis.core.server.ActiveMQServer;
import org.apache.activemq.artemis.spi.core.protocol.AbstractProtocolManagerFactory;
import org.apache.activemq.artemis.spi.core.protocol.ProtocolManager;
@@ -32,6 +34,8 @@ import org.osgi.service.component.annotations.Component;
@Component(service = ProtocolManagerFactory.class)
public class ProtonProtocolManagerFactory extends AbstractProtocolManagerFactory<Interceptor> {
+ public static final byte ID = 2;
+
private static final String AMQP_PROTOCOL_NAME = "AMQP";
private static final String MODULE_NAME = "artemis-amqp-protocol";
@@ -39,6 +43,16 @@ public class ProtonProtocolManagerFactory extends AbstractProtocolManagerFactory
private static String[] SUPPORTED_PROTOCOLS = {AMQP_PROTOCOL_NAME};
@Override
+ public byte getStoreID() {
+ return ID;
+ }
+
+ @Override
+ public Persister<Message> getPersister() {
+ return AMQPMessagePersister.getInstance();
+ }
+
+ @Override
public ProtocolManager createProtocolManager(ActiveMQServer server,
final Map<String, Object> parameters,
List<BaseInterceptor> incomingInterceptors,
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/AMQPContentTypeSupport.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/AMQPContentTypeSupport.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/AMQPContentTypeSupport.java
new file mode 100644
index 0000000..e040138
--- /dev/null
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/AMQPContentTypeSupport.java
@@ -0,0 +1,146 @@
+/*
+ * 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.converter;
+
+import java.nio.charset.Charset;
+import java.nio.charset.IllegalCharsetNameException;
+import java.nio.charset.StandardCharsets;
+import java.nio.charset.UnsupportedCharsetException;
+import java.util.StringTokenizer;
+
+import org.apache.activemq.artemis.protocol.amqp.exceptions.ActiveMQAMQPInvalidContentTypeException;
+
+public final class AMQPContentTypeSupport {
+
+ private static final String UTF_8 = "UTF-8";
+ private static final String CHARSET = "charset";
+ private static final String TEXT = "text";
+ private static final String APPLICATION = "application";
+ private static final String JAVASCRIPT = "javascript";
+ private static final String XML = "xml";
+ private static final String XML_VARIANT = "+xml";
+ private static final String JSON = "json";
+ private static final String JSON_VARIANT = "+json";
+ private static final String XML_DTD = "xml-dtd";
+ private static final String ECMASCRIPT = "ecmascript";
+
+ /**
+ * @param contentType
+ * the contentType of the received message
+ * @return the character set to use, or null if not to treat the message as text
+ * @throws ActiveMQAMQPInvalidContentTypeException
+ * if the content-type is invalid in some way.
+ */
+ public static Charset parseContentTypeForTextualCharset(final String contentType) throws ActiveMQAMQPInvalidContentTypeException {
+ if (contentType == null || contentType.trim().isEmpty()) {
+ throw new ActiveMQAMQPInvalidContentTypeException("Content type can't be null or empty");
+ }
+
+ int subTypeSeparator = contentType.indexOf("/");
+ if (subTypeSeparator == -1) {
+ throw new ActiveMQAMQPInvalidContentTypeException("Content type has no '/' separator: " + contentType);
+ }
+
+ final String type = contentType.substring(0, subTypeSeparator).toLowerCase().trim();
+
+ String subTypePart = contentType.substring(subTypeSeparator + 1).toLowerCase().trim();
+
+ String parameterPart = null;
+ int parameterSeparator = subTypePart.indexOf(";");
+ if (parameterSeparator != -1) {
+ if (parameterSeparator < subTypePart.length() - 1) {
+ parameterPart = contentType.substring(subTypeSeparator + 1).toLowerCase().trim();
+ }
+ subTypePart = subTypePart.substring(0, parameterSeparator).trim();
+ }
+
+ if (subTypePart.isEmpty()) {
+ throw new ActiveMQAMQPInvalidContentTypeException("Content type has no subtype after '/'" + contentType);
+ }
+
+ final String subType = subTypePart;
+
+ if (isTextual(type, subType)) {
+ String charset = findCharset(parameterPart);
+ if (charset == null) {
+ charset = UTF_8;
+ }
+
+ if (UTF_8.equals(charset)) {
+ return StandardCharsets.UTF_8;
+ } else {
+ try {
+ return Charset.forName(charset);
+ } catch (IllegalCharsetNameException icne) {
+ throw new ActiveMQAMQPInvalidContentTypeException("Illegal charset: " + charset);
+ } catch (UnsupportedCharsetException uce) {
+ throw new ActiveMQAMQPInvalidContentTypeException("Unsupported charset: " + charset);
+ }
+ }
+ }
+
+ return null;
+ }
+
+ // ----- Internal Content Type utilities ----------------------------------//
+
+ private static boolean isTextual(String type, String subType) {
+ if (TEXT.equals(type)) {
+ return true;
+ }
+
+ if (APPLICATION.equals(type)) {
+ if (XML.equals(subType) || JSON.equals(subType) || JAVASCRIPT.equals(subType) || subType.endsWith(XML_VARIANT) || subType.endsWith(JSON_VARIANT)
+ || XML_DTD.equals(subType) || ECMASCRIPT.equals(subType)) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ private static String findCharset(String paramaterPart) {
+ String charset = null;
+
+ if (paramaterPart != null) {
+ StringTokenizer tokenizer = new StringTokenizer(paramaterPart, ";");
+ while (tokenizer.hasMoreTokens()) {
+ String parameter = tokenizer.nextToken().trim();
+ int eqIndex = parameter.indexOf('=');
+ if (eqIndex != -1) {
+ String name = parameter.substring(0, eqIndex);
+ if (CHARSET.equalsIgnoreCase(name.trim())) {
+ String value = unquote(parameter.substring(eqIndex + 1));
+
+ charset = value.toUpperCase();
+ break;
+ }
+ }
+ }
+ }
+
+ return charset;
+ }
+
+ private static String unquote(String s) {
+ if (s.length() > 1 && (s.startsWith("\"") && s.endsWith("\""))) {
+ return s.substring(1, s.length() - 1);
+ } else {
+ return s;
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/AMQPConverter.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..724474b
--- /dev/null
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/AMQPConverter.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.protocol.amqp.converter;
+
+import org.apache.activemq.artemis.api.core.ICoreMessage;
+import org.apache.activemq.artemis.protocol.amqp.broker.AMQPMessage;
+import org.apache.activemq.artemis.spi.core.protocol.MessageConverter;
+
+
+public class AMQPConverter implements MessageConverter<AMQPMessage> {
+
+ private static final AMQPConverter theInstance = new AMQPConverter();
+
+ private AMQPConverter() {
+ }
+
+ public static AMQPConverter getInstance() {
+ return theInstance;
+ }
+
+ @Override
+ public AMQPMessage fromCore(ICoreMessage coreMessage) throws Exception {
+ return CoreAmqpConverter.fromCore(coreMessage);
+ }
+
+ @Override
+ public ICoreMessage toCore(AMQPMessage messageSource) throws Exception {
+ return AmqpCoreConverter.toCore(messageSource);
+ }
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/AMQPMessageIdHelper.java
----------------------------------------------------------------------
diff --git a/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/AMQPMessageIdHelper.java b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/AMQPMessageIdHelper.java
new file mode 100644
index 0000000..00282e0
--- /dev/null
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/AMQPMessageIdHelper.java
@@ -0,0 +1,252 @@
+/*
+ *
+ * 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.converter;
+
+import java.nio.ByteBuffer;
+import java.util.UUID;
+
+import org.apache.activemq.artemis.protocol.amqp.exceptions.ActiveMQAMQPIllegalStateException;
+import org.apache.qpid.proton.amqp.Binary;
+import org.apache.qpid.proton.amqp.UnsignedLong;
+
+/**
+ * Helper class for identifying and converting message-id and correlation-id values between the
+ * AMQP types and the Strings values used by JMS.
+ * <p>
+ * AMQP messages allow for 4 types of message-id/correlation-id: message-id-string,
+ * message-id-binary, message-id-uuid, or message-id-ulong. In order to accept or return a
+ * string representation of these for interoperability with other AMQP clients, the following
+ * encoding can be used after removing or before adding the "ID:" prefix used for a JMSMessageID
+ * value:<br>
+ * <p>
+ * {@literal "AMQP_BINARY:<hex representation of binary content>"}<br>
+ * {@literal "AMQP_UUID:<string representation of uuid>"}<br>
+ * {@literal "AMQP_ULONG:<string representation of ulong>"}<br>
+ * {@literal "AMQP_STRING:<string>"}<br>
+ * <p>
+ * The AMQP_STRING encoding exists only for escaping message-id-string values that happen to
+ * begin with one of the encoding prefixes (including AMQP_STRING itself). It MUST NOT be used
+ * otherwise.
+ * <p>
+ * When provided a string for conversion which attempts to identify itself as an encoded binary,
+ * uuid, or ulong but can't be converted into the indicated format, an exception will be thrown.
+ */
+public class AMQPMessageIdHelper {
+
+ public static final AMQPMessageIdHelper INSTANCE = new AMQPMessageIdHelper();
+
+ public static final String AMQP_STRING_PREFIX = "AMQP_STRING:";
+ public static final String AMQP_UUID_PREFIX = "AMQP_UUID:";
+ public static final String AMQP_ULONG_PREFIX = "AMQP_ULONG:";
+ public static final String AMQP_BINARY_PREFIX = "AMQP_BINARY:";
+
+ private static final int AMQP_UUID_PREFIX_LENGTH = AMQP_UUID_PREFIX.length();
+ private static final int AMQP_ULONG_PREFIX_LENGTH = AMQP_ULONG_PREFIX.length();
+ private static final int AMQP_STRING_PREFIX_LENGTH = AMQP_STRING_PREFIX.length();
+ private static final int AMQP_BINARY_PREFIX_LENGTH = AMQP_BINARY_PREFIX.length();
+ private static final char[] HEX_CHARS = "0123456789ABCDEF".toCharArray();
+
+ /**
+ * Takes the provided AMQP messageId style object, and convert it to a base string. Encodes
+ * type information as a prefix where necessary to convey or escape the type of the provided
+ * object.
+ *
+ * @param messageId
+ * the raw messageId object to process
+ * @return the base string to be used in creating the actual id.
+ */
+ public String toBaseMessageIdString(Object messageId) {
+ if (messageId == null) {
+ return null;
+ } else if (messageId instanceof String) {
+ String stringId = (String) messageId;
+
+ // If the given string has a type encoding prefix,
+ // we need to escape it as an encoded string (even if
+ // the existing encoding prefix was also for string)
+ if (hasTypeEncodingPrefix(stringId)) {
+ return AMQP_STRING_PREFIX + stringId;
+ } else {
+ return stringId;
+ }
+ } else if (messageId instanceof UUID) {
+ return AMQP_UUID_PREFIX + messageId.toString();
+ } else if (messageId instanceof UnsignedLong) {
+ return AMQP_ULONG_PREFIX + messageId.toString();
+ } else if (messageId instanceof Binary) {
+ ByteBuffer dup = ((Binary) messageId).asByteBuffer();
+
+ byte[] bytes = new byte[dup.remaining()];
+ dup.get(bytes);
+
+ String hex = convertBinaryToHexString(bytes);
+
+ return AMQP_BINARY_PREFIX + hex;
+ } else {
+ throw new IllegalArgumentException("Unsupported type provided: " + messageId.getClass());
+ }
+ }
+
+ /**
+ * Takes the provided base id string and return the appropriate amqp messageId style object.
+ * Converts the type based on any relevant encoding information found as a prefix.
+ *
+ * @param baseId
+ * the object to be converted to an AMQP MessageId value.
+ * @return the AMQP messageId style object
+ * @throws ActiveMQAMQPIllegalStateException
+ * if the provided baseId String indicates an encoded type but can't be converted to
+ * that type.
+ */
+ public Object toIdObject(String baseId) throws ActiveMQAMQPIllegalStateException {
+ if (baseId == null) {
+ return null;
+ }
+
+ try {
+ if (hasAmqpUuidPrefix(baseId)) {
+ String uuidString = strip(baseId, AMQP_UUID_PREFIX_LENGTH);
+ return UUID.fromString(uuidString);
+ } else if (hasAmqpUlongPrefix(baseId)) {
+ String longString = strip(baseId, AMQP_ULONG_PREFIX_LENGTH);
+ return UnsignedLong.valueOf(longString);
+ } else if (hasAmqpStringPrefix(baseId)) {
+ return strip(baseId, AMQP_STRING_PREFIX_LENGTH);
+ } else if (hasAmqpBinaryPrefix(baseId)) {
+ String hexString = strip(baseId, AMQP_BINARY_PREFIX_LENGTH);
+ byte[] bytes = convertHexStringToBinary(hexString);
+ return new Binary(bytes);
+ } else {
+ // We have a string without any type prefix, transmit it as-is.
+ return baseId;
+ }
+ } catch (IllegalArgumentException e) {
+ throw new ActiveMQAMQPIllegalStateException("Unable to convert ID value");
+ }
+ }
+
+ /**
+ * Convert the provided hex-string into a binary representation where each byte represents
+ * two characters of the hex string.
+ * <p>
+ * The hex characters may be upper or lower case.
+ *
+ * @param hexString
+ * string to convert to a binary value.
+ * @return a byte array containing the binary representation
+ * @throws IllegalArgumentException
+ * if the provided String is a non-even length or contains non-hex characters
+ */
+ public byte[] convertHexStringToBinary(String hexString) throws IllegalArgumentException {
+ int length = hexString.length();
+
+ // As each byte needs two characters in the hex encoding, the string must be an even
+ // length.
+ if (length % 2 != 0) {
+ throw new IllegalArgumentException("The provided hex String must be an even length, but was of length " + length + ": " + hexString);
+ }
+
+ byte[] binary = new byte[length / 2];
+
+ for (int i = 0; i < length; i += 2) {
+ char highBitsChar = hexString.charAt(i);
+ char lowBitsChar = hexString.charAt(i + 1);
+
+ int highBits = hexCharToInt(highBitsChar, hexString) << 4;
+ int lowBits = hexCharToInt(lowBitsChar, hexString);
+
+ binary[i / 2] = (byte) (highBits + lowBits);
+ }
+
+ return binary;
+ }
+
+ /**
+ * Convert the provided binary into a hex-string representation where each character
+ * represents 4 bits of the provided binary, i.e each byte requires two characters.
+ * <p>
+ * The returned hex characters are upper-case.
+ *
+ * @param bytes
+ * the binary value to convert to a hex String instance.
+ * @return a String containing a hex representation of the bytes
+ */
+ public String convertBinaryToHexString(byte[] bytes) {
+ // Each byte is represented as 2 chars
+ StringBuilder builder = new StringBuilder(bytes.length * 2);
+
+ for (byte b : bytes) {
+ // The byte will be expanded to int before shifting, replicating the
+ // sign bit, so mask everything beyond the first 4 bits afterwards
+ int highBitsInt = (b >> 4) & 0xF;
+ // We only want the first 4 bits
+ int lowBitsInt = b & 0xF;
+
+ builder.append(HEX_CHARS[highBitsInt]);
+ builder.append(HEX_CHARS[lowBitsInt]);
+ }
+
+ return builder.toString();
+ }
+
+ // ----- Internal implementation ------------------------------------------//
+
+ private boolean hasTypeEncodingPrefix(String stringId) {
+ return hasAmqpBinaryPrefix(stringId) || hasAmqpUuidPrefix(stringId) || hasAmqpUlongPrefix(stringId) || hasAmqpStringPrefix(stringId);
+ }
+
+ private boolean hasAmqpStringPrefix(String stringId) {
+ return stringId.startsWith(AMQP_STRING_PREFIX);
+ }
+
+ private boolean hasAmqpUlongPrefix(String stringId) {
+ return stringId.startsWith(AMQP_ULONG_PREFIX);
+ }
+
+ private boolean hasAmqpUuidPrefix(String stringId) {
+ return stringId.startsWith(AMQP_UUID_PREFIX);
+ }
+
+ private boolean hasAmqpBinaryPrefix(String stringId) {
+ return stringId.startsWith(AMQP_BINARY_PREFIX);
+ }
+
+ private String strip(String id, int numChars) {
+ return id.substring(numChars);
+ }
+
+ private int hexCharToInt(char ch, String orig) throws IllegalArgumentException {
+ if (ch >= '0' && ch <= '9') {
+ // subtract '0' to get difference in position as an int
+ return ch - '0';
+ } else if (ch >= 'A' && ch <= 'F') {
+ // subtract 'A' to get difference in position as an int
+ // and then add 10 for the offset of 'A'
+ return ch - 'A' + 10;
+ } else if (ch >= 'a' && ch <= 'f') {
+ // subtract 'a' to get difference in position as an int
+ // and then add 10 for the offset of 'a'
+ return ch - 'a' + 10;
+ }
+
+ throw new IllegalArgumentException("The provided hex string contains non-hex character '" + ch + "': " + orig);
+ }
+}
http://git-wip-us.apache.org/repos/asf/activemq-artemis/blob/4894015d/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/AMQPMessageSupport.java
----------------------------------------------------------------------
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
new file mode 100644
index 0000000..351c1a6
--- /dev/null
+++ b/artemis-protocols/artemis-amqp-protocol/src/main/java/org/apache/activemq/artemis/protocol/amqp/converter/AMQPMessageSupport.java
@@ -0,0 +1,308 @@
+/*
+ * 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.converter;
+
+import javax.jms.Destination;
+import javax.jms.JMSException;
+import java.nio.charset.Charset;
+import java.util.Arrays;
+import java.util.Map;
+import java.util.Set;
+
+import org.apache.activemq.artemis.core.message.impl.CoreMessage;
+import org.apache.activemq.artemis.jms.client.ActiveMQDestination;
+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;
+import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSObjectMessage;
+import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSStreamMessage;
+import org.apache.activemq.artemis.protocol.amqp.converter.jms.ServerJMSTextMessage;
+import org.apache.activemq.artemis.protocol.amqp.exceptions.ActiveMQAMQPInvalidContentTypeException;
+import org.apache.qpid.proton.amqp.Binary;
+import org.apache.qpid.proton.amqp.Symbol;
+import org.apache.qpid.proton.amqp.messaging.Data;
+import org.apache.qpid.proton.message.Message;
+
+import static org.apache.activemq.artemis.api.core.Message.BYTES_TYPE;
+import static org.apache.activemq.artemis.api.core.Message.DEFAULT_TYPE;
+import static org.apache.activemq.artemis.api.core.Message.MAP_TYPE;
+import static org.apache.activemq.artemis.api.core.Message.OBJECT_TYPE;
+import static org.apache.activemq.artemis.api.core.Message.STREAM_TYPE;
+import static org.apache.activemq.artemis.api.core.Message.TEXT_TYPE;
+
+/**
+ * Support class containing constant values and static methods that are used to map to / from
+ * AMQP Message types being sent or received.
+ */
+public final class AMQPMessageSupport {
+
+ public static final String JMS_REPLY_TO_TYPE_MSG_ANNOTATION_SYMBOL_NAME = "x-opt-jms-reply-to";
+
+ // Message Properties used to map AMQP to JMS and back
+ /**
+ * Attribute used to mark the class type of JMS message that a particular message
+ * instance represents, used internally by the client.
+ */
+ public static final Symbol JMS_MSG_TYPE = Symbol.getSymbol("x-opt-jms-msg-type");
+
+ /**
+ * Attribute used to mark the Application defined delivery time assigned to the message
+ */
+ public static final String JMS_DELIVERY_TIME = "x-opt-delivery-time";
+
+ /**
+ * Value mapping for JMS_MSG_TYPE which indicates the message is a generic JMS Message
+ * which has no body.
+ */
+ public static final byte JMS_MESSAGE = 0;
+
+ /**
+ * Value mapping for JMS_MSG_TYPE which indicates the message is a JMS ObjectMessage
+ * which has an Object value serialized in its message body.
+ */
+ public static final byte JMS_OBJECT_MESSAGE = 1;
+
+ /**
+ * Value mapping for JMS_MSG_TYPE which indicates the message is a JMS MapMessage
+ * which has an Map instance serialized in its message body.
+ */
+ public static final byte JMS_MAP_MESSAGE = 2;
+
+ /**
+ * Value mapping for JMS_MSG_TYPE which indicates the message is a JMS BytesMessage
+ * which has a body that consists of raw bytes.
+ */
+ public static final byte JMS_BYTES_MESSAGE = 3;
+
+ /**
+ * Value mapping for JMS_MSG_TYPE which indicates the message is a JMS StreamMessage
+ * which has a body that is a structured collection of primitives values.
+ */
+ public static final byte JMS_STREAM_MESSAGE = 4;
+
+ /**
+ * Value mapping for JMS_MSG_TYPE which indicates the message is a JMS TextMessage
+ * which has a body that contains a UTF-8 encoded String.
+ */
+ public static final byte JMS_TEXT_MESSAGE = 5;
+
+
+ /**
+ * Content type used to mark Data sections as containing a serialized java object.
+ */
+ public static final Symbol SERIALIZED_JAVA_OBJECT_CONTENT_TYPE = Symbol.getSymbol("application/x-java-serialized-object");
+
+ public static final String JMS_AMQP_PREFIX = "JMS_AMQP_";
+ public static final int JMS_AMQP_PREFIX_LENGTH = JMS_AMQP_PREFIX.length();
+
+ public static final String NATIVE = "NATIVE";
+ public static final String HEADER = "HEADER";
+ public static final String PROPERTIES = "PROPERTIES";
+
+ public static final String FIRST_ACQUIRER = "FirstAcquirer";
+ public static final String CONTENT_TYPE = "ContentType";
+ public static final String CONTENT_ENCODING = "ContentEncoding";
+ public static final String REPLYTO_GROUP_ID = "ReplyToGroupID";
+ public static final String DURABLE = "DURABLE";
+ public static final String PRIORITY = "PRIORITY";
+
+ public static final String DELIVERY_ANNOTATION_PREFIX = "DA_";
+ public static final String MESSAGE_ANNOTATION_PREFIX = "MA_";
+ public static final String FOOTER_PREFIX = "FT_";
+
+ public static final String JMS_AMQP_HEADER = JMS_AMQP_PREFIX + HEADER;
+ public static final String JMS_AMQP_HEADER_DURABLE = JMS_AMQP_PREFIX + HEADER + DURABLE;
+ public static final String JMS_AMQP_HEADER_PRIORITY = JMS_AMQP_PREFIX + HEADER + PRIORITY;
+ public static final String JMS_AMQP_PROPERTIES = JMS_AMQP_PREFIX + PROPERTIES;
+ public static final String JMS_AMQP_NATIVE = JMS_AMQP_PREFIX + NATIVE;
+ public static final String JMS_AMQP_FIRST_ACQUIRER = JMS_AMQP_PREFIX + FIRST_ACQUIRER;
+ public static final String JMS_AMQP_CONTENT_TYPE = JMS_AMQP_PREFIX + CONTENT_TYPE;
+ public static final String JMS_AMQP_CONTENT_ENCODING = JMS_AMQP_PREFIX + CONTENT_ENCODING;
+ public static final String JMS_AMQP_REPLYTO_GROUP_ID = JMS_AMQP_PREFIX + REPLYTO_GROUP_ID;
+ public static final String JMS_AMQP_DELIVERY_ANNOTATION_PREFIX = JMS_AMQP_PREFIX + DELIVERY_ANNOTATION_PREFIX;
+ public static final String JMS_AMQP_MESSAGE_ANNOTATION_PREFIX = JMS_AMQP_PREFIX + MESSAGE_ANNOTATION_PREFIX;
+ public static final String JMS_AMQP_FOOTER_PREFIX = JMS_AMQP_PREFIX + FOOTER_PREFIX;
+
+ // Message body type definitions
+ public static final Binary EMPTY_BINARY = new Binary(new byte[0]);
+ public static final Data EMPTY_BODY = new Data(EMPTY_BINARY);
+
+ public static final short AMQP_UNKNOWN = 0;
+ public static final short AMQP_NULL = 1;
+ public static final short AMQP_DATA = 2;
+ public static final short AMQP_SEQUENCE = 3;
+ public static final short AMQP_VALUE_NULL = 4;
+ public static final short AMQP_VALUE_STRING = 5;
+ public static final short AMQP_VALUE_BINARY = 6;
+ public static final short AMQP_VALUE_MAP = 7;
+ public static final short AMQP_VALUE_LIST = 8;
+
+ public static final Symbol JMS_DEST_TYPE_MSG_ANNOTATION = getSymbol("x-opt-jms-dest");
+ public static final Symbol JMS_REPLY_TO_TYPE_MSG_ANNOTATION = getSymbol("x-opt-jms-reply-to");
+
+ public static final byte QUEUE_TYPE = 0x00;
+ public static final byte TOPIC_TYPE = 0x01;
+ public static final byte TEMP_QUEUE_TYPE = 0x02;
+ public static final byte TEMP_TOPIC_TYPE = 0x03;
+
+ /**
+ * Content type used to mark Data sections as containing arbitrary bytes.
+ */
+ public static final String OCTET_STREAM_CONTENT_TYPE = "application/octet-stream";
+
+ /**
+ * Lookup and return the correct Proton Symbol instance based on the given key.
+ *
+ * @param key
+ * the String value name of the Symbol to locate.
+ *
+ * @return the Symbol value that matches the given key.
+ */
+ public static Symbol getSymbol(String key) {
+ return Symbol.valueOf(key);
+ }
+
+ /**
+ * Safe way to access message annotations which will check internal structure and either
+ * return the annotation if it exists or null if the annotation or any annotations are
+ * present.
+ *
+ * @param key
+ * the String key to use to lookup an annotation.
+ * @param message
+ * the AMQP message object that is being examined.
+ *
+ * @return the given annotation value or null if not present in the message.
+ */
+ public static Object getMessageAnnotation(String key, Message message) {
+ if (message != null && message.getMessageAnnotations() != null) {
+ Map<Symbol, Object> annotations = message.getMessageAnnotations().getValue();
+ return annotations.get(AMQPMessageSupport.getSymbol(key));
+ }
+
+ return null;
+ }
+
+ /**
+ * Check whether the content-type field of the properties section (if present) in the given
+ * message matches the provided string (where null matches if there is no content type
+ * present.
+ *
+ * @param contentType
+ * content type string to compare against, or null if none
+ * @param message
+ * the AMQP message object that is being examined.
+ *
+ * @return true if content type matches
+ */
+ public static boolean isContentType(String contentType, Message message) {
+ if (contentType == null) {
+ return message.getContentType() == null;
+ } else {
+ return contentType.equals(message.getContentType());
+ }
+ }
+
+ /**
+ * @param contentType
+ * the contentType of the received message
+ * @return the character set to use, or null if not to treat the message as text
+ */
+ public static Charset getCharsetForTextualContent(String contentType) {
+ try {
+ return AMQPContentTypeSupport.parseContentTypeForTextualCharset(contentType);
+ } catch (ActiveMQAMQPInvalidContentTypeException e) {
+ return null;
+ }
+ }
+
+ public static String toAddress(Destination destination) {
+ if (destination instanceof ActiveMQDestination) {
+ return ((ActiveMQDestination) destination).getAddress();
+ }
+ return null;
+ }
+
+ public static ServerJMSBytesMessage createBytesMessage(long id) {
+ return new ServerJMSBytesMessage(newMessage(id, BYTES_TYPE));
+ }
+
+ public static ServerJMSBytesMessage createBytesMessage(long id, byte[] array, int arrayOffset, int length) throws JMSException {
+ ServerJMSBytesMessage message = createBytesMessage(id);
+ message.writeBytes(array, arrayOffset, length);
+ return message;
+ }
+
+ public static ServerJMSStreamMessage createStreamMessage(long id) {
+ return new ServerJMSStreamMessage(newMessage(id, STREAM_TYPE));
+ }
+
+ public static ServerJMSMessage createMessage(long id) {
+ return new ServerJMSMessage(newMessage(id, DEFAULT_TYPE));
+ }
+
+ public static ServerJMSTextMessage createTextMessage(long id) {
+ return new ServerJMSTextMessage(newMessage(id, TEXT_TYPE));
+ }
+
+ public static ServerJMSTextMessage createTextMessage(long id, String text) throws JMSException {
+ ServerJMSTextMessage message = createTextMessage(id);
+ message.setText(text);
+ return message;
+ }
+
+ public static ServerJMSObjectMessage createObjectMessage(long id) {
+ return new ServerJMSObjectMessage(newMessage(id, OBJECT_TYPE));
+ }
+
+ public static ServerJMSMessage createObjectMessage(long id, Binary serializedForm) throws JMSException {
+ ServerJMSObjectMessage message = createObjectMessage(id);
+ message.setSerializedForm(serializedForm);
+ return message;
+ }
+
+ public static ServerJMSMessage createObjectMessage(long id, byte[] array, int offset, int length) throws JMSException {
+ ServerJMSObjectMessage message = createObjectMessage(id);
+ message.setSerializedForm(new Binary(array, offset, length));
+ return message;
+ }
+
+ public static ServerJMSMapMessage createMapMessage(long id) {
+ return new ServerJMSMapMessage(newMessage(id, MAP_TYPE));
+ }
+
+ public static ServerJMSMapMessage createMapMessage(long id, Map<String, Object> content) throws JMSException {
+ ServerJMSMapMessage message = createMapMessage(id);
+ final Set<Map.Entry<String, Object>> set = content.entrySet();
+ for (Map.Entry<String, Object> entry : set) {
+ Object value = entry.getValue();
+ if (value instanceof Binary) {
+ Binary binary = (Binary) value;
+ value = Arrays.copyOfRange(binary.getArray(), binary.getArrayOffset(), binary.getLength());
+ }
+ message.setObject(entry.getKey(), value);
+ }
+ return message;
+ }
+
+ private static CoreMessage newMessage(long id, byte messageType) {
+ CoreMessage message = new CoreMessage(id, 512);
+ message.setType(messageType);
+// ((ResetLimitWrappedActiveMQBuffer) message.getBodyBuffer()).setMessage(null);
+ return message;
+ }
+}