use of org.apache.activemq.artemis.core.server.Queue in project activemq-artemis by apache.
the class CommitRollbackTest method testReceiveWithRollback.
@Test
public void testReceiveWithRollback() throws Exception {
ActiveMQServer server = createServer(false);
server.start();
ServerLocator locator = createInVMNonHALocator();
ClientSessionFactory cf = createSessionFactory(locator);
ClientSession sendSession = cf.createSession(false, true, true);
ClientSession session = cf.createSession(false, false, false);
sendSession.createQueue(addressA, queueA, false);
ClientProducer cp = sendSession.createProducer(addressA);
ClientConsumer cc = session.createConsumer(queueA);
int numMessages = 100;
for (int i = 0; i < numMessages; i++) {
cp.send(sendSession.createMessage(false));
}
session.start();
for (int i = 0; i < numMessages; i++) {
ClientMessage cm = cc.receive(5000);
Assert.assertNotNull(cm);
cm.acknowledge();
}
Queue q = (Queue) server.getPostOffice().getBinding(queueA).getBindable();
Assert.assertEquals(numMessages, q.getDeliveringCount());
session.rollback();
for (int i = 0; i < numMessages; i++) {
ClientMessage cm = cc.receive(5000);
Assert.assertNotNull(cm);
cm.acknowledge();
}
Assert.assertEquals(numMessages, q.getDeliveringCount());
session.close();
sendSession.close();
}
use of org.apache.activemq.artemis.core.server.Queue in project activemq-artemis by apache.
the class CommitRollbackTest method testReceiveWithRollbackMultipleConsumersDifferentQueues.
@Test
public void testReceiveWithRollbackMultipleConsumersDifferentQueues() throws Exception {
ActiveMQServer server = createServer(false);
server.start();
ServerLocator locator = createInVMNonHALocator();
ClientSessionFactory cf = createSessionFactory(locator);
ClientSession sendSession = cf.createSession(false, true, true);
ClientSession session = cf.createSession(false, false, false);
sendSession.createQueue(addressA, queueA, false);
sendSession.createQueue(addressB, queueB, false);
ClientProducer cp = sendSession.createProducer(addressA);
ClientProducer cp2 = sendSession.createProducer(addressB);
ClientConsumer cc = session.createConsumer(queueA);
ClientConsumer cc2 = session.createConsumer(queueB);
int numMessages = 100;
for (int i = 0; i < numMessages; i++) {
cp.send(sendSession.createMessage(false));
cp2.send(sendSession.createMessage(false));
}
session.start();
for (int i = 0; i < numMessages; i++) {
ClientMessage cm = cc.receive(5000);
Assert.assertNotNull(cm);
cm.acknowledge();
cm = cc2.receive(5000);
Assert.assertNotNull(cm);
cm.acknowledge();
}
Queue q = (Queue) server.getPostOffice().getBinding(queueA).getBindable();
Queue q2 = (Queue) server.getPostOffice().getBinding(queueB).getBindable();
Assert.assertEquals(numMessages, q.getDeliveringCount());
cc.close();
cc2.close();
session.rollback();
Assert.assertEquals(0, q2.getDeliveringCount());
Assert.assertEquals(numMessages, getMessageCount(q));
Assert.assertEquals(0, q2.getDeliveringCount());
Assert.assertEquals(numMessages, getMessageCount(q));
sendSession.close();
session.close();
}
use of org.apache.activemq.artemis.core.server.Queue in project activemq-artemis by apache.
the class ConcurrentCreateDeleteProduceTest method testConcurrentProduceCreateAndDelete.
@Test
public void testConcurrentProduceCreateAndDelete() throws Throwable {
ClientSessionFactory factory = locator.createSessionFactory();
ClientSession session = factory.createSession(true, true);
ClientProducer producer = session.createProducer(ADDRESS);
// just to make it page forever
Queue serverQueue = server.createQueue(ADDRESS, RoutingType.ANYCAST, SimpleString.toSimpleString("everPage"), null, true, false);
serverQueue.getPageSubscription().getPagingStore().startPaging();
Consumer[] consumers = new Consumer[10];
for (int i = 0; i < consumers.length; i++) {
consumers[i] = new Consumer();
consumers[i].start();
}
for (int i = 0; i < 50000 && running; i++) {
producer.send(session.createMessage(true));
// Thread.sleep(10);
}
session.close();
running = false;
for (Consumer consumer : consumers) {
consumer.join();
if (consumer.ex != null) {
throw consumer.ex;
}
}
}
use of org.apache.activemq.artemis.core.server.Queue in project activemq-artemis by apache.
the class QueueComparatorTest method testQueueSorting.
@Test
public void testQueueSorting() {
FakeQueue queue1 = new FakeQueue(new SimpleString("1"));
queue1.setMessageCount(1);
FakeQueue queue2 = new FakeQueue(new SimpleString("2"));
queue2.setMessageCount(2);
FakeQueue queue3 = new FakeQueue(new SimpleString("3"));
queue3.setMessageCount(3);
List<Queue> queues = new ArrayList<>();
queues.add(queue1);
queues.add(queue2);
queues.add(queue3);
Assert.assertEquals(1, queues.get(0).getMessageCount());
Assert.assertEquals(2, queues.get(1).getMessageCount());
Assert.assertEquals(3, queues.get(2).getMessageCount());
Collections.sort(queues, new ScaleDownHandler.OrderQueueByNumberOfReferencesComparator());
Assert.assertEquals(3, queues.get(0).getMessageCount());
Assert.assertEquals(2, queues.get(1).getMessageCount());
Assert.assertEquals(1, queues.get(2).getMessageCount());
}
use of org.apache.activemq.artemis.core.server.Queue in project activemq-artemis by apache.
the class BMFailoverTest method testFailoverOnCommit2.
@Test
@BMRules(rules = { @BMRule(name = "trace clientsessionimpl commit", targetClass = "org.apache.activemq.artemis.core.client.impl.ClientSessionImpl", targetMethod = "start(javax.transaction.xa.Xid, int)", targetLocation = "AT EXIT", action = "org.apache.activemq.artemis.tests.extras.byteman.BMFailoverTest.serverToStop.getServer().stop(true)") })
public void testFailoverOnCommit2() throws Exception {
serverToStop = liveServer;
locator = getServerLocator().setFailoverOnInitialConnection(true);
SimpleString inQueue = new SimpleString("inQueue");
SimpleString outQueue = new SimpleString("outQueue");
createSessionFactory();
createSessionFactory2();
// closeable will take care of closing it
try (ClientSession session = sf.createSession(false, true, true);
ClientProducer sendInitialProducer = session.createProducer()) {
session.createQueue(inQueue, inQueue, null, true);
session.createQueue(outQueue, outQueue, null, true);
sendInitialProducer.send(inQueue, createMessage(session, 0, true));
}
ClientSession xaSessionRec = addClientSession(sf.createSession(true, false, false));
ClientConsumer consumer = addClientConsumer(xaSessionRec.createConsumer(inQueue));
byte[] globalTransactionId = UUIDGenerator.getInstance().generateStringUUID().getBytes();
Xid xidRec = new XidImpl("xa2".getBytes(), 1, globalTransactionId);
xaSessionRec.start();
xaSessionRec.getXAResource().start(xidRec, XAResource.TMNOFLAGS);
// failover is now occurring, receive, ack and end will be called whilst this is happening.
ClientMessageImpl m = (ClientMessageImpl) consumer.receive(5000);
assertNotNull(m);
System.out.println("********************" + m.getIntProperty("counter"));
// the mdb would ack the message before calling onMessage()
m.acknowledge();
try {
// this may fail but thats ok, it depends on the race and when failover actually happens
xaSessionRec.end(xidRec, XAResource.TMSUCCESS);
} catch (XAException ignore) {
}
// we always reset the client on the RA
((ClientSessionInternal) xaSessionRec).resetIfNeeded();
// closeable will take care of closing it
try (ClientSession session = sf.createSession(false, true, true);
ClientProducer sendInitialProducer = session.createProducer()) {
sendInitialProducer.send(inQueue, createMessage(session, 0, true));
}
// now receive and send a message successfully
globalTransactionId = UUIDGenerator.getInstance().generateStringUUID().getBytes();
xidRec = new XidImpl("xa4".getBytes(), 1, globalTransactionId);
xaSessionRec.getXAResource().start(xidRec, XAResource.TMNOFLAGS);
Binding binding = backupServer.getServer().getPostOffice().getBinding(inQueue);
Queue inQ = (Queue) binding.getBindable();
m = (ClientMessageImpl) consumer.receive(5000);
assertNotNull(m);
// the mdb would ack the message before calling onMessage()
m.acknowledge();
System.out.println("********************" + m.getIntProperty("counter"));
xaSessionRec.getXAResource().end(xidRec, XAResource.TMSUCCESS);
xaSessionRec.getXAResource().prepare(xidRec);
xaSessionRec.getXAResource().commit(xidRec, false);
// let's close the consumer so anything pending is handled
consumer.close();
assertEquals(1, getMessageCount(inQ));
}
Aggregations