@Override public void run() throws XAException { session.end(randomXid(), XAResource.TMSUCCESS); } });
@Test public void testFailXID() throws Exception { Xid xid = newXID(); ClientSession session = sessionFactory.createSession(true, false, false); session.start(xid, XAResource.TMNOFLAGS); session.end(xid, XAResource.TMFAIL); session.rollback(xid); session.close(); }
@Override public void onMessage(final ClientMessage message) { Xid xid = new XidImpl(UUIDGenerator.getInstance().generateStringUUID().getBytes(), 1, UUIDGenerator.getInstance().generateStringUUID().getBytes()); try { session.start(xid, XAResource.TMNOFLAGS); } catch (XAException e) { e.printStackTrace(); } try { message.acknowledge(); } catch (ActiveMQException e) { BasicXaTest.log.error("Failed to process message", e); } try { session.end(xid, XAResource.TMSUCCESS); session.rollback(xid); } catch (Exception e) { e.printStackTrace(); failedToAck = true; try { session.close(); } catch (ActiveMQException e1) { // } } latch.countDown(); } }
@Test(timeout = 120000) public void testXAMessagesNotSentSoNoRollbackOnCommit() throws Exception { createSessionFactory(); ClientSession session = createSession(sf, true, false, false); Xid xid = new XidImpl("uhuhuhu".getBytes(), 126512, "auhsduashd".getBytes()); session.createQueue(FailoverTestBase.ADDRESS, RoutingType.MULTICAST, FailoverTestBase.ADDRESS, null, true); ClientProducer producer = session.createProducer(FailoverTestBase.ADDRESS); session.start(xid, XAResource.TMNOFLAGS); sendMessagesSomeDurable(session, producer); session.end(xid, XAResource.TMSUCCESS); session.prepare(xid); session.commit(xid, false); crash(session); ClientConsumer consumer = session.createConsumer(FailoverTestBase.ADDRESS); session.start(); Xid xid2 = new XidImpl("tfytftyf".getBytes(), 54654, "iohiuohiuhgiu".getBytes()); session.start(xid2, XAResource.TMNOFLAGS); receiveDurableMessages(consumer); session.end(xid2, XAResource.TMSUCCESS); session.prepare(xid2); session.commit(xid2, false); }
@Test public void testXAInterleaveResourceSuspendWorkCommit() throws Exception { Xid xid = newXID(); Xid xid2 = newXID(); ClientProducer clientProducer = clientSession.createProducer(atestq); ClientSession recSession = sessionFactory.createSession(); recSession.start(); ClientConsumer clientConsumer = recSession.createConsumer(atestq); ClientMessage m1 = createTextMessage(clientSession, "m1"); ClientMessage m2 = createTextMessage(clientSession, "m2"); clientSession.start(xid, XAResource.TMNOFLAGS); clientProducer.send(m1); clientSession.end(xid, XAResource.TMSUSPEND); clientSession.start(xid2, XAResource.TMNOFLAGS); clientProducer.send(m2); clientSession.end(xid, XAResource.TMSUCCESS); clientSession.commit(xid, true); ClientMessage message = clientConsumer.receiveImmediate(); assertNotNull(message); message = clientConsumer.receiveImmediate(); assertNull(message); clientSession.end(xid2, XAResource.TMSUCCESS); clientSession.commit(xid2, true); message = clientConsumer.receiveImmediate(); assertNotNull(message); }
@Test(timeout = 120000) public void testXAMessagesSentSoRollbackOnEnd() throws Exception { createSessionFactory(); ClientSession session = createSession(sf, true, false, false); Xid xid = new XidImpl("uhuhuhu".getBytes(), 126512, "auhsduashd".getBytes()); session.createQueue(FailoverTestBase.ADDRESS, RoutingType.MULTICAST, FailoverTestBase.ADDRESS, null, true); ClientProducer producer = session.createProducer(FailoverTestBase.ADDRESS); session.start(xid, XAResource.TMNOFLAGS); sendMessagesSomeDurable(session, producer); crash(session); try { session.end(xid, XAResource.TMSUCCESS); Assert.fail("Should throw exception"); } catch (XAException e) { Assert.assertEquals(XAException.XAER_RMFAIL, e.errorCode); } ClientConsumer consumer = session.createConsumer(FailoverTestBase.ADDRESS); session.start(); ClientMessage message = consumer.receiveImmediate(); Assert.assertNull(message); }
@Test(timeout = 120000) public void testXAMessagesConsumedSoRollbackOnEnd() throws Exception { createSessionFactory(); ClientSession session1 = createSessionAndQueue(); ClientProducer producer = session1.createProducer(FailoverTestBase.ADDRESS); sendMessagesSomeDurable(session1, producer); session1.commit(); ClientSession session2 = createSession(sf, true, false, false); ClientConsumer consumer = session2.createConsumer(FailoverTestBase.ADDRESS); session2.start(); Xid xid = new XidImpl("uhuhuhu".getBytes(), 126512, "auhsduashd".getBytes()); session2.start(xid, XAResource.TMNOFLAGS); receiveMessages(consumer); crash(session2); try { session2.end(xid, XAResource.TMSUCCESS); Assert.fail("Should throw exception"); } catch (XAException e) { Assert.assertEquals(XAException.XAER_RMFAIL, e.errorCode); } }
@Test(timeout = 120000) //start a tx but sending messages after crash public void testXAMessagesSentSoRollbackOnEnd2() throws Exception { createSessionFactory(); ClientSession session = createSession(sf, true, false, false); Xid xid = new XidImpl("uhuhuhu".getBytes(), 126512, "auhsduashd".getBytes()); session.createQueue(FailoverTestBase.ADDRESS, RoutingType.MULTICAST, FailoverTestBase.ADDRESS, null, true); ClientProducer producer = session.createProducer(FailoverTestBase.ADDRESS); session.start(xid, XAResource.TMNOFLAGS); crash(session); // sendMessagesSomeDurable(session, producer); producer.send(createMessage(session, 1, true)); try { session.end(xid, XAResource.TMSUCCESS); Assert.fail("Should throw exception"); } catch (XAException e) { // Assert.assertEquals(XAException.XAER_NOTA, e.errorCode); } ClientConsumer consumer = session.createConsumer(FailoverTestBase.ADDRESS); session.start(); ClientMessage message = consumer.receiveImmediate(); Assert.assertNull(message); }
@Test public void testXAInterleaveResourceRollbackAfterPrepare() throws Exception { Xid xid = newXID(); Xid xid2 = newXID(); Xid xid3 = newXID(); ClientProducer clientProducer = clientSession.createProducer(atestq); ClientConsumer clientConsumer = clientSession.createConsumer(atestq); ClientMessage m1 = createTextMessage(clientSession, "m1"); clientSession.start(xid, XAResource.TMNOFLAGS); clientProducer.send(m1); clientSession.end(xid, XAResource.TMSUCCESS); clientSession.prepare(xid); clientSession.commit(xid, false); clientSession.start(); clientSession.start(xid2, XAResource.TMNOFLAGS); ClientMessage m2 = clientConsumer.receiveImmediate(); assertNotNull(m2); clientSession.end(xid2, XAResource.TMSUCCESS); clientSession.prepare(xid2); clientSession.rollback(xid2); clientSession.start(xid3, XAResource.TMNOFLAGS); m2 = clientConsumer.receiveImmediate(); assertNotNull(m2); clientSession.end(xid3, XAResource.TMSUCCESS); clientSession.prepare(xid3); clientSession.commit(xid3, false); }
@Test(timeout = 120000) public void testXAMessagesConsumedSoRollbackOnPrepare() throws Exception { createSessionFactory(); ClientSession session1 = createSessionAndQueue(); ClientProducer producer = session1.createProducer(FailoverTestBase.ADDRESS); sendMessagesSomeDurable(session1, producer); session1.commit(); ClientSession session2 = createSession(sf, true, false, false); ClientConsumer consumer = session2.createConsumer(FailoverTestBase.ADDRESS); session2.start(); Xid xid = new XidImpl("uhuhuhu".getBytes(), 126512, "auhsduashd".getBytes()); session2.start(xid, XAResource.TMNOFLAGS); receiveMessages(consumer); session2.end(xid, XAResource.TMSUCCESS); crash(session2); try { session2.prepare(xid); Assert.fail("Should throw exception"); } catch (XAException e) { Assert.assertEquals(XAException.XAER_RMFAIL, e.errorCode); } }
@Test(timeout = 120000) public void testXAMessagesSentSoRollbackOnCommit() throws Exception { createSessionFactory(); ClientSession session = createSession(sf, true, false, false); Xid xid = new XidImpl("uhuhuhu".getBytes(), 126512, "auhsduashd".getBytes()); session.createQueue(FailoverTestBase.ADDRESS, RoutingType.MULTICAST, FailoverTestBase.ADDRESS, null, true); ClientProducer producer = session.createProducer(FailoverTestBase.ADDRESS); session.start(xid, XAResource.TMNOFLAGS); sendMessagesSomeDurable(session, producer); session.end(xid, XAResource.TMSUCCESS); crash(session); try { session.commit(xid, false); Assert.fail("Should throw exception"); } catch (XAException e) { Assert.assertEquals(XAException.XAER_NOTA, e.errorCode); } ClientConsumer consumer = session.createConsumer(FailoverTestBase.ADDRESS); session.start(); ClientMessage message = consumer.receiveImmediate(); Assert.assertNull(message); }
@Test(timeout = 120000) public void testXAMessagesConsumedSoRollbackOnEnd2() throws Exception { createSessionFactory(); ClientSession session1 = createSessionAndQueue(); ClientProducer producer = session1.createProducer(FailoverTestBase.ADDRESS); for (int i = 0; i < NUM_MESSAGES; i++) { // some are durable, some are not! producer.send(createMessage(session1, i, true)); } session1.commit(); ClientSession session2 = createSession(sf, true, false, false); ClientConsumer consumer = session2.createConsumer(FailoverTestBase.ADDRESS); session2.start(); Xid xid = new XidImpl("uhuhuhu".getBytes(), 126512, "auhsduashd".getBytes()); session2.start(xid, XAResource.TMNOFLAGS); crash(session2); receiveMessages(consumer); try { session2.end(xid, XAResource.TMSUCCESS); Assert.fail("Should throw exception"); } catch (XAException e) { } // Since the end was not accepted, the messages should be redelivered receiveMessages(consumer); }
@Test public void testSimpleTimeoutOnSendOnCommit() throws Exception { Xid xid = new XidImpl("xa1".getBytes(), 1, UUIDGenerator.getInstance().generateStringUUID().getBytes()); ClientMessage m1 = createTextMessage(clientSession, "m1"); ClientMessage m2 = createTextMessage(clientSession, "m2"); ClientMessage m3 = createTextMessage(clientSession, "m3"); ClientMessage m4 = createTextMessage(clientSession, "m4"); clientSession.setTransactionTimeout(1); clientSession.start(xid, XAResource.TMNOFLAGS); clientProducer.send(m1); clientProducer.send(m2); clientProducer.send(m3); clientProducer.send(m4); clientSession.end(xid, XAResource.TMSUCCESS); CountDownLatch latch = new CountDownLatch(1); server.getResourceManager().getTransaction(xid).addOperation(new RollbackCompleteOperation(latch)); Assert.assertTrue(latch.await(5, TimeUnit.SECONDS)); try { clientSession.commit(xid, true); } catch (XAException e) { Assert.assertTrue(e.errorCode == XAException.XAER_NOTA); } clientSession.start(); ClientMessage m = clientConsumer.receiveImmediate(); Assert.assertNull(m); }
@Test public void testForgetHeuristicallyRolledBackXID() throws Exception { Xid xid = newXID(); clientSession.start(xid, XAResource.TMNOFLAGS); clientSession.end(xid, XAResource.TMSUCCESS); clientSession.prepare(xid); String[] preparedTransactions = messagingService.getActiveMQServerControl().listPreparedTransactions(); Assert.assertEquals(1, preparedTransactions.length); System.out.println(preparedTransactions[0]); Assert.assertTrue(messagingService.getActiveMQServerControl().rollbackPreparedTransaction(XidImpl.toBase64String(xid))); Assert.assertEquals(1, messagingService.getActiveMQServerControl().listHeuristicRolledBackTransactions().length); clientSession.forget(xid); Assert.assertEquals(0, messagingService.getActiveMQServerControl().listHeuristicRolledBackTransactions().length); }
@Test(timeout = 120000) public void testXAMessagesConsumedSoRollbackOnCommit() throws Exception { createSessionFactory(); ClientSession session1 = createSessionAndQueue(); ClientProducer producer = session1.createProducer(FailoverTestBase.ADDRESS); sendMessagesSomeDurable(session1, producer); session1.commit(); ClientSession session2 = createSession(sf, true, false, false); ClientConsumer consumer = session2.createConsumer(FailoverTestBase.ADDRESS); session2.start(); Xid xid = new XidImpl("uhuhuhu".getBytes(), 126512, "auhsduashd".getBytes()); session2.start(xid, XAResource.TMNOFLAGS); receiveMessages(consumer); session2.end(xid, XAResource.TMSUCCESS); // session2.prepare(xid); crash(session2); try { session2.commit(xid, false); Assert.fail("Should throw exception"); } catch (XAException e) { // it should be rolled back Assert.assertEquals(XAException.XAER_NOTA, e.errorCode); } session1.close(); session2.close(); }
@Test(timeout = 120000) public void testXAMessagesSentSoRollbackOnPrepare() throws Exception { createSessionFactory(); final ClientSession session = createSession(sf, true, false, false); Xid xid = new XidImpl("uhuhuhu".getBytes(), 126512, "auhsduashd".getBytes()); session.createQueue(FailoverTestBase.ADDRESS, RoutingType.MULTICAST, FailoverTestBase.ADDRESS, null, true); final ClientProducer producer = session.createProducer(FailoverTestBase.ADDRESS); session.start(xid, XAResource.TMNOFLAGS); sendMessagesSomeDurable(session, producer); session.end(xid, XAResource.TMSUCCESS); crash(session); try { session.prepare(xid); Assert.fail("Should throw exception"); } catch (XAException e) { Assert.assertEquals(XAException.XAER_RMFAIL, e.errorCode); // XXXX session.rollback(); } ClientConsumer consumer = session.createConsumer(FailoverTestBase.ADDRESS); session.start(); ClientMessage message = consumer.receiveImmediate(); Assert.assertNull(message); producer.close(); consumer.close(); }
@Test public void testForgetHeuristicallyCommittedXID() throws Exception { Xid xid = newXID(); clientSession.start(xid, XAResource.TMNOFLAGS); clientSession.end(xid, XAResource.TMSUCCESS); clientSession.prepare(xid); String[] preparedTransactions = messagingService.getActiveMQServerControl().listPreparedTransactions(); Assert.assertEquals(1, preparedTransactions.length); System.out.println(preparedTransactions[0]); Assert.assertTrue(messagingService.getActiveMQServerControl().commitPreparedTransaction(XidImpl.toBase64String(xid))); Assert.assertEquals(1, messagingService.getActiveMQServerControl().listHeuristicCommittedTransactions().length); clientSession.forget(xid); Assert.assertEquals(0, messagingService.getActiveMQServerControl().listHeuristicCommittedTransactions().length); }
@Test public void testNonPersistentMultipleIDs() throws Exception { for (int i = 0; i < 10; i++) { Xid xid = new XidImpl("xa1".getBytes(), 1, UUIDGenerator.getInstance().generateStringUUID().getBytes()); ClientMessage m1 = createTextMessage("m1", false); ClientMessage m2 = createTextMessage("m2", false); ClientMessage m3 = createTextMessage("m3", false); ClientMessage m4 = createTextMessage("m4", false); clientSession.start(xid, XAResource.TMNOFLAGS); clientProducer.send(m1); clientProducer.send(m2); clientProducer.send(m3); clientProducer.send(m4); clientSession.end(xid, XAResource.TMSUCCESS); clientSession.prepare(xid); if (i == 2) { clientSession.commit(xid, false); } recreateClients(); } stopAndRestartServer(); Xid[] xids = clientSession.recover(XAResource.TMSTARTRSCAN); Assert.assertEquals(9, xids.length); }
public void testNonPersistent(final boolean commit) throws Exception { Xid xid = new XidImpl("xa1".getBytes(), 1, UUIDGenerator.getInstance().generateStringUUID().getBytes()); ClientMessage m1 = createTextMessage("m1", false); ClientMessage m2 = createTextMessage("m2", false); ClientMessage m3 = createTextMessage("m3", false); ClientMessage m4 = createTextMessage("m4", false); clientSession.start(xid, XAResource.TMNOFLAGS); clientProducer.send(m1); clientProducer.send(m2); clientProducer.send(m3); clientProducer.send(m4); clientSession.end(xid, XAResource.TMSUCCESS); clientSession.prepare(xid); stopAndRestartServer(); Xid[] xids = clientSession.recover(XAResource.TMSTARTRSCAN); Assert.assertEquals(xids.length, 1); Assert.assertEquals(xids[0].getFormatId(), xid.getFormatId()); ActiveMQTestBase.assertEqualsByteArrays(xids[0].getBranchQualifier(), xid.getBranchQualifier()); ActiveMQTestBase.assertEqualsByteArrays(xids[0].getGlobalTransactionId(), xid.getGlobalTransactionId()); xids = clientSession.recover(XAResource.TMENDRSCAN); Assert.assertEquals(xids.length, 0); if (commit) { clientSession.commit(xid, false); } else { clientSession.rollback(xid); } xids = clientSession.recover(XAResource.TMSTARTRSCAN); Assert.assertEquals(xids.length, 0); }
@Test public void testRestartWithTXPrepareDeletedQueue() throws Exception { ClientSession clientSession2 = sessionFactory.createSession(false, true, true); ClientProducer clientProducer = clientSession2.createProducer(atestq); ClientMessage m1 = createTextMessage(clientSession2, "m1"); clientProducer.send(m1); Xid xid = newXID(); clientSession.start(xid, XAResource.TMNOFLAGS); clientSession.start(); ClientConsumer clientConsumer = clientSession.createConsumer(atestq); ClientMessage message = clientConsumer.receive(5000); message.acknowledge(); clientSession.end(xid, XAResource.TMSUCCESS); clientSession.prepare(xid); clientSession.getSessionFactory().getConnection().destroy(); messagingService.destroyQueue(atestq); messagingService.stop(); messagingService.start(); messagingService.waitForActivation(10, TimeUnit.SECONDS); assertTrue(messagingService.isStarted()); }