Search in sources :

Example 36 with Queue

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();
}
Also used : ActiveMQServer(org.apache.activemq.artemis.core.server.ActiveMQServer) ClientSession(org.apache.activemq.artemis.api.core.client.ClientSession) ClientSessionFactory(org.apache.activemq.artemis.api.core.client.ClientSessionFactory) ClientMessage(org.apache.activemq.artemis.api.core.client.ClientMessage) ClientConsumer(org.apache.activemq.artemis.api.core.client.ClientConsumer) ClientProducer(org.apache.activemq.artemis.api.core.client.ClientProducer) Queue(org.apache.activemq.artemis.core.server.Queue) ServerLocator(org.apache.activemq.artemis.api.core.client.ServerLocator) Test(org.junit.Test)

Example 37 with Queue

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();
}
Also used : ActiveMQServer(org.apache.activemq.artemis.core.server.ActiveMQServer) ClientSession(org.apache.activemq.artemis.api.core.client.ClientSession) ClientSessionFactory(org.apache.activemq.artemis.api.core.client.ClientSessionFactory) ClientMessage(org.apache.activemq.artemis.api.core.client.ClientMessage) ClientConsumer(org.apache.activemq.artemis.api.core.client.ClientConsumer) ClientProducer(org.apache.activemq.artemis.api.core.client.ClientProducer) Queue(org.apache.activemq.artemis.core.server.Queue) ServerLocator(org.apache.activemq.artemis.api.core.client.ServerLocator) Test(org.junit.Test)

Example 38 with Queue

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;
        }
    }
}
Also used : ClientConsumer(org.apache.activemq.artemis.api.core.client.ClientConsumer) ClientSession(org.apache.activemq.artemis.api.core.client.ClientSession) ClientSessionFactory(org.apache.activemq.artemis.api.core.client.ClientSessionFactory) ClientProducer(org.apache.activemq.artemis.api.core.client.ClientProducer) Queue(org.apache.activemq.artemis.core.server.Queue) Test(org.junit.Test)

Example 39 with Queue

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());
}
Also used : ArrayList(java.util.ArrayList) SimpleString(org.apache.activemq.artemis.api.core.SimpleString) ScaleDownHandler(org.apache.activemq.artemis.core.server.impl.ScaleDownHandler) Queue(org.apache.activemq.artemis.core.server.Queue) Test(org.junit.Test)

Example 40 with Queue

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));
}
Also used : Binding(org.apache.activemq.artemis.core.postoffice.Binding) ClientSessionInternal(org.apache.activemq.artemis.core.client.impl.ClientSessionInternal) Xid(javax.transaction.xa.Xid) XAException(javax.transaction.xa.XAException) XidImpl(org.apache.activemq.artemis.core.transaction.impl.XidImpl) ClientSession(org.apache.activemq.artemis.api.core.client.ClientSession) SimpleString(org.apache.activemq.artemis.api.core.SimpleString) ClientConsumer(org.apache.activemq.artemis.api.core.client.ClientConsumer) ClientProducer(org.apache.activemq.artemis.api.core.client.ClientProducer) Queue(org.apache.activemq.artemis.core.server.Queue) ClientMessageImpl(org.apache.activemq.artemis.core.client.impl.ClientMessageImpl) Test(org.junit.Test) BMRules(org.jboss.byteman.contrib.bmunit.BMRules)

Aggregations

Queue (org.apache.activemq.artemis.core.server.Queue)275 Test (org.junit.Test)193 SimpleString (org.apache.activemq.artemis.api.core.SimpleString)128 ClientSession (org.apache.activemq.artemis.api.core.client.ClientSession)89 ClientProducer (org.apache.activemq.artemis.api.core.client.ClientProducer)85 ClientMessage (org.apache.activemq.artemis.api.core.client.ClientMessage)75 AmqpClient (org.apache.activemq.transport.amqp.client.AmqpClient)70 AmqpConnection (org.apache.activemq.transport.amqp.client.AmqpConnection)70 AmqpSession (org.apache.activemq.transport.amqp.client.AmqpSession)70 ClientConsumer (org.apache.activemq.artemis.api.core.client.ClientConsumer)64 AmqpReceiver (org.apache.activemq.transport.amqp.client.AmqpReceiver)59 AmqpMessage (org.apache.activemq.transport.amqp.client.AmqpMessage)56 ClientSessionFactory (org.apache.activemq.artemis.api.core.client.ClientSessionFactory)49 AmqpSender (org.apache.activemq.transport.amqp.client.AmqpSender)47 Session (javax.jms.Session)36 Connection (javax.jms.Connection)32 Configuration (org.apache.activemq.artemis.core.config.Configuration)31 ActiveMQServer (org.apache.activemq.artemis.core.server.ActiveMQServer)30 AddressSettings (org.apache.activemq.artemis.core.settings.impl.AddressSettings)27 TextMessage (javax.jms.TextMessage)25