Search in sources :

Example 16 with XASession

use of javax.jms.XASession in project activemq-artemis by apache.

the class SimpleOpenWireTest method testXASameConsumerRollback.

@Test
public void testXASameConsumerRollback() throws Exception {
    Queue queue;
    try (Session session = connection.createSession(false, Session.CLIENT_ACKNOWLEDGE)) {
        queue = session.createQueue(queueName);
        System.out.println("Queue:" + queue);
        MessageProducer producer = session.createProducer(queue);
        for (int i = 0; i < 10; i++) {
            TextMessage msg = session.createTextMessage("test" + i);
            msg.setStringProperty("myobj", "test" + i);
            producer.send(msg);
        }
        session.close();
    }
    try (XAConnection xaconnection = xaFactory.createXAConnection()) {
        Xid xid = newXID();
        XASession session = xaconnection.createXASession();
        session.getXAResource().start(xid, XAResource.TMNOFLAGS);
        MessageConsumer consumer = session.createConsumer(queue);
        xaconnection.start();
        for (int i = 0; i < 5; i++) {
            TextMessage message = (TextMessage) consumer.receive(5000);
            Assert.assertNotNull(message);
            Assert.assertEquals("test" + i, message.getText());
        }
        session.getXAResource().end(xid, XAResource.TMSUCCESS);
        session.getXAResource().rollback(xid);
        xid = newXID();
        session.getXAResource().start(xid, XAResource.TMNOFLAGS);
        for (int i = 0; i < 10; i++) {
            TextMessage message = (TextMessage) consumer.receive(5000);
            Assert.assertNotNull(message);
            Assert.assertEquals("test" + i, message.getText());
        }
        checkDuplicate(consumer);
        session.getXAResource().end(xid, XAResource.TMSUCCESS);
        session.getXAResource().commit(xid, true);
    }
}
Also used : Xid(javax.transaction.xa.Xid) MessageConsumer(javax.jms.MessageConsumer) XASession(javax.jms.XASession) MessageProducer(javax.jms.MessageProducer) ActiveMQQueue(org.apache.activemq.command.ActiveMQQueue) Queue(javax.jms.Queue) TemporaryQueue(javax.jms.TemporaryQueue) TextMessage(javax.jms.TextMessage) XASession(javax.jms.XASession) Session(javax.jms.Session) ActiveMQSession(org.apache.activemq.ActiveMQSession) TopicSession(javax.jms.TopicSession) QueueSession(javax.jms.QueueSession) XAConnection(javax.jms.XAConnection) Test(org.junit.Test)

Example 17 with XASession

use of javax.jms.XASession in project activemq-artemis by apache.

the class XATest method testMultipleSessionsOneTxCommitSend1PCOptimization.

@Test
public void testMultipleSessionsOneTxCommitSend1PCOptimization() throws Exception {
    // Since both resources have some RM, TM will probably use 1PC optimization
    XAConnection conn = null;
    Connection conn2 = null;
    try {
        conn = xacf.createXAConnection();
        conn.start();
        tm.begin();
        // Create 2 sessions and enlist them
        XASession sess1 = conn.createXASession();
        XAResource res1 = sess1.getXAResource();
        XASession sess2 = conn.createXASession();
        XAResource res2 = sess2.getXAResource();
        Transaction tx = tm.getTransaction();
        tx.enlistResource(res1);
        tx.enlistResource(res2);
        // Send 2 messages - one from each session
        MessageProducer prod1 = sess1.createProducer(queue1);
        MessageProducer prod2 = sess2.createProducer(queue1);
        prod1.send(sess1.createTextMessage("echidna1"));
        prod2.send(sess2.createTextMessage("echidna2"));
        tx.delistResource(res1, XAResource.TMSUCCESS);
        tx.delistResource(res2, XAResource.TMSUCCESS);
        // commit
        tm.commit();
        // Messages should be in queue
        conn2 = cf.createConnection();
        Session sess = conn2.createSession(false, Session.AUTO_ACKNOWLEDGE);
        MessageConsumer cons = sess.createConsumer(queue1);
        conn2.start();
        TextMessage r1 = (TextMessage) cons.receive(5000);
        Assert.assertNotNull(r1);
        Assert.assertEquals("echidna1", r1.getText());
        TextMessage r2 = (TextMessage) cons.receive(5000);
        Assert.assertNotNull(r2);
        Assert.assertEquals("echidna2", r2.getText());
    } finally {
        if (conn != null) {
            conn.close();
        }
        if (conn2 != null) {
            conn2.close();
        }
    }
}
Also used : XAResource(javax.transaction.xa.XAResource) MessageConsumer(javax.jms.MessageConsumer) Transaction(javax.transaction.Transaction) XASession(javax.jms.XASession) XAConnection(javax.jms.XAConnection) Connection(javax.jms.Connection) MessageProducer(javax.jms.MessageProducer) TextMessage(javax.jms.TextMessage) XAConnection(javax.jms.XAConnection) XASession(javax.jms.XASession) Session(javax.jms.Session) Test(org.junit.Test)

Example 18 with XASession

use of javax.jms.XASession in project activemq-artemis by apache.

the class XATest method test2PCSendCommit.

@Test
public void test2PCSendCommit() throws Exception {
    XAConnection conn = null;
    Connection conn2 = null;
    try {
        conn = xacf.createXAConnection();
        tm.begin();
        XASession sess = conn.createXASession();
        XAResource res = sess.getXAResource();
        XAResource res2 = new DummyXAResource();
        // To prevent 1PC optimization being used
        // res.setForceNotSameRM(true);
        Transaction tx = tm.getTransaction();
        tx.enlistResource(res);
        tx.enlistResource(res2);
        MessageProducer prod = sess.createProducer(queue1);
        prod.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
        Message m = sess.createTextMessage("XATest1");
        prod.send(m);
        m = sess.createTextMessage("XATest2");
        prod.send(m);
        tx.delistResource(res, XAResource.TMSUCCESS);
        tx.delistResource(res2, XAResource.TMSUCCESS);
        tm.commit();
        conn2 = cf.createConnection();
        conn2.start();
        Session sessReceiver = conn2.createSession(false, Session.AUTO_ACKNOWLEDGE);
        MessageConsumer cons = sessReceiver.createConsumer(queue1);
        TextMessage m2 = (TextMessage) cons.receive(5000);
        Assert.assertNotNull(m2);
        Assert.assertEquals("XATest1", m2.getText());
        m2 = (TextMessage) cons.receive(5000);
        Assert.assertNotNull(m2);
        Assert.assertEquals("XATest2", m2.getText());
    } finally {
        if (conn != null) {
            conn.close();
        }
        if (conn2 != null) {
            conn2.close();
        }
    }
}
Also used : XAResource(javax.transaction.xa.XAResource) MessageConsumer(javax.jms.MessageConsumer) Transaction(javax.transaction.Transaction) Message(javax.jms.Message) TextMessage(javax.jms.TextMessage) XASession(javax.jms.XASession) XAConnection(javax.jms.XAConnection) Connection(javax.jms.Connection) MessageProducer(javax.jms.MessageProducer) TextMessage(javax.jms.TextMessage) XAConnection(javax.jms.XAConnection) XASession(javax.jms.XASession) Session(javax.jms.Session) Test(org.junit.Test)

Example 19 with XASession

use of javax.jms.XASession in project activemq-artemis by apache.

the class XATest method test2PCSendRollback.

@Test
public void test2PCSendRollback() throws Exception {
    XAConnection conn = null;
    Connection conn2 = null;
    try {
        conn = xacf.createXAConnection();
        tm.begin();
        XASession sess = conn.createXASession();
        XAResource res = sess.getXAResource();
        // prevent 1Pc optimisation
        // res.setForceNotSameRM(true);
        XAResource res2 = new DummyXAResource();
        Transaction tx = tm.getTransaction();
        tx.enlistResource(res);
        tx.enlistResource(res2);
        MessageProducer prod = sess.createProducer(null);
        prod.setDeliveryMode(DeliveryMode.NON_PERSISTENT);
        Message m = sess.createTextMessage("XATest1");
        prod.send(queue1, m);
        m = sess.createTextMessage("XATest2");
        prod.send(queue1, m);
        tx.delistResource(res, XAResource.TMSUCCESS);
        tx.delistResource(res2, XAResource.TMSUCCESS);
        tm.rollback();
        conn2 = cf.createConnection();
        conn2.start();
        Session sessReceiver = conn2.createSession(false, Session.AUTO_ACKNOWLEDGE);
        MessageConsumer cons = sessReceiver.createConsumer(queue1);
        Message m2 = cons.receive(100);
        Assert.assertNull(m2);
    } finally {
        if (conn != null) {
            conn.close();
        }
        if (conn2 != null) {
            conn2.close();
        }
    }
}
Also used : XAResource(javax.transaction.xa.XAResource) MessageConsumer(javax.jms.MessageConsumer) Transaction(javax.transaction.Transaction) Message(javax.jms.Message) TextMessage(javax.jms.TextMessage) XASession(javax.jms.XASession) XAConnection(javax.jms.XAConnection) Connection(javax.jms.Connection) MessageProducer(javax.jms.MessageProducer) XAConnection(javax.jms.XAConnection) XASession(javax.jms.XASession) Session(javax.jms.Session) Test(org.junit.Test)

Example 20 with XASession

use of javax.jms.XASession in project activemq-artemis by apache.

the class XATest method testMultipleSessionsOneTxRollbackAcknowledge.

@Test
public void testMultipleSessionsOneTxRollbackAcknowledge() throws Exception {
    XAConnection conn = null;
    Connection conn2 = null;
    try {
        // First send 2 messages
        conn2 = cf.createConnection();
        Session sessProducer = conn2.createSession(false, Session.AUTO_ACKNOWLEDGE);
        MessageProducer prod = sessProducer.createProducer(queue1);
        Message m = sessProducer.createTextMessage("jellyfish1");
        prod.send(m);
        m = sessProducer.createTextMessage("jellyfish2");
        prod.send(m);
        m = sessProducer.createTextMessage("jellyfish3");
        prod.send(m);
        m = sessProducer.createTextMessage("jellyfish4");
        prod.send(m);
        conn = xacf.createXAConnection();
        conn.start();
        tm.begin();
        // Create 2 sessions and enlist them
        XASession sess1 = conn.createXASession();
        ClientSessionInternal res1 = (ClientSessionInternal) sess1.getXAResource();
        XASession sess2 = conn.createXASession();
        ClientSessionInternal res2 = (ClientSessionInternal) sess2.getXAResource();
        res1.setForceNotSameRM(true);
        res2.setForceNotSameRM(true);
        Transaction tx = tm.getTransaction();
        tx.enlistResource(res1);
        tx.enlistResource(res2);
        // Receive the messages, two on each consumer
        MessageConsumer cons1 = sess1.createConsumer(queue1);
        TextMessage r1 = (TextMessage) cons1.receive(5000);
        Assert.assertNotNull(r1);
        Assert.assertEquals("jellyfish1", r1.getText());
        r1 = (TextMessage) cons1.receive(5000);
        Assert.assertNotNull(r1);
        Assert.assertEquals("jellyfish2", r1.getText());
        cons1.close();
        // Cancel is asynch
        Thread.sleep(500);
        MessageConsumer cons2 = sess2.createConsumer(queue1);
        TextMessage r2 = (TextMessage) cons2.receive(5000);
        Assert.assertNotNull(r2);
        Assert.assertEquals("jellyfish3", r2.getText());
        r2 = (TextMessage) cons2.receive(5000);
        Assert.assertNotNull(r2);
        Assert.assertEquals("jellyfish4", r2.getText());
        // rollback
        cons2.close();
        tx.delistResource(res1, XAResource.TMSUCCESS);
        tx.delistResource(res2, XAResource.TMSUCCESS);
        tm.rollback();
        // Rollback causes cancel which is asynch
        Thread.sleep(1000);
        // We cannot assume anything about the order in which the transaction manager rollsback
        // the sessions - this is implementation dependent
        Session sess = conn2.createSession(false, Session.AUTO_ACKNOWLEDGE);
        MessageConsumer cons = sess.createConsumer(queue1);
        conn2.start();
        TextMessage r = (TextMessage) cons.receive(5000);
        Assert.assertNotNull(r);
        boolean session1First = false;
        if (r.getText().equals("jellyfish1")) {
            session1First = true;
        } else if (r.getText().equals("jellyfish3")) {
            session1First = false;
        } else {
            Assert.fail("Unexpected message");
        }
        if (session1First) {
            r = (TextMessage) cons.receive(5000);
            Assert.assertNotNull(r);
            Assert.assertEquals("jellyfish2", r.getText());
            r = (TextMessage) cons.receive(5000);
            Assert.assertNotNull(r);
            Assert.assertEquals("jellyfish3", r.getText());
            r = (TextMessage) cons.receive(5000);
            Assert.assertNotNull(r);
            Assert.assertEquals("jellyfish4", r.getText());
        } else {
            r = (TextMessage) cons.receive(5000);
            Assert.assertNotNull(r);
            Assert.assertEquals("jellyfish4", r.getText());
            r = (TextMessage) cons.receive(5000);
            Assert.assertNotNull(r);
            Assert.assertEquals("jellyfish1", r.getText());
            r = (TextMessage) cons.receive(5000);
            Assert.assertNotNull(r);
            Assert.assertEquals("jellyfish2", r.getText());
        }
        r = (TextMessage) cons.receive(100);
        Assert.assertNull(r);
    } finally {
        if (conn != null) {
            conn.close();
        }
        if (conn2 != null) {
            conn2.close();
        }
    }
}
Also used : ClientSessionInternal(org.apache.activemq.artemis.core.client.impl.ClientSessionInternal) MessageConsumer(javax.jms.MessageConsumer) Message(javax.jms.Message) TextMessage(javax.jms.TextMessage) Transaction(javax.transaction.Transaction) XASession(javax.jms.XASession) XAConnection(javax.jms.XAConnection) Connection(javax.jms.Connection) MessageProducer(javax.jms.MessageProducer) TextMessage(javax.jms.TextMessage) XAConnection(javax.jms.XAConnection) XASession(javax.jms.XASession) Session(javax.jms.Session) Test(org.junit.Test)

Aggregations

XASession (javax.jms.XASession)58 XAConnection (javax.jms.XAConnection)51 MessageProducer (javax.jms.MessageProducer)41 Test (org.junit.Test)41 MessageConsumer (javax.jms.MessageConsumer)36 Session (javax.jms.Session)35 TextMessage (javax.jms.TextMessage)35 XAResource (javax.transaction.xa.XAResource)34 Connection (javax.jms.Connection)26 Transaction (javax.transaction.Transaction)24 Message (javax.jms.Message)19 Xid (javax.transaction.xa.Xid)19 Queue (javax.jms.Queue)14 ActiveMQQueue (org.apache.activemq.command.ActiveMQQueue)12 XAException (javax.transaction.xa.XAException)11 TemporaryQueue (javax.jms.TemporaryQueue)8 JMSException (javax.jms.JMSException)7 XidImpl (org.apache.activemq.artemis.core.transaction.impl.XidImpl)6 QueueSession (javax.jms.QueueSession)5 TopicSession (javax.jms.TopicSession)5