[jboss-cvs] JBoss Messaging SVN: r7898 - in branches/Branch_1_4: integration/AS5/tests-src/org/jboss/test/messaging/jms and 5 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Tue Nov 10 02:31:24 EST 2009


Author: gaohoward
Date: 2009-11-10 02:31:23 -0500 (Tue, 10 Nov 2009)
New Revision: 7898

Added:
   branches/Branch_1_4/integration/AS5/tests-src/org/jboss/test/messaging/jms/
   branches/Branch_1_4/integration/AS5/tests-src/org/jboss/test/messaging/jms/XAResourceRecoveryTest.java
   branches/Branch_1_4/integration/EAP4/tests-src/org/jboss/test/messaging/jms/
   branches/Branch_1_4/integration/EAP4/tests-src/org/jboss/test/messaging/jms/XAResourceRecoveryTest.java
   branches/Branch_1_4/integration/EAP5/tests-src/org/jboss/test/messaging/jms/
   branches/Branch_1_4/integration/EAP5/tests-src/org/jboss/test/messaging/jms/XAResourceRecoveryTest.java
Removed:
   branches/Branch_1_4/tests/src/org/jboss/test/messaging/jms/XAResourceRecoveryTest.java
Log:
JBMESSAGING-1745
move XAResourceRecoveryTest to version specific locations


Added: branches/Branch_1_4/integration/AS5/tests-src/org/jboss/test/messaging/jms/XAResourceRecoveryTest.java
===================================================================
--- branches/Branch_1_4/integration/AS5/tests-src/org/jboss/test/messaging/jms/XAResourceRecoveryTest.java	                        (rev 0)
+++ branches/Branch_1_4/integration/AS5/tests-src/org/jboss/test/messaging/jms/XAResourceRecoveryTest.java	2009-11-10 07:31:23 UTC (rev 7898)
@@ -0,0 +1,354 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.test.messaging.jms;
+
+import java.util.Hashtable;
+import java.util.Properties;
+
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageProducer;
+import javax.jms.Queue;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+import javax.jms.XAConnection;
+import javax.jms.XASession;
+import javax.management.ObjectName;
+import javax.naming.InitialContext;
+import javax.transaction.Transaction;
+import javax.transaction.TransactionManager;
+import javax.transaction.xa.XAResource;
+
+import org.jboss.jms.client.JBossConnectionFactory;
+import org.jboss.jms.jndi.JMSProviderAdapter;
+import org.jboss.jms.tx.ResourceManagerFactory;
+import org.jboss.test.messaging.tools.ServerManagement;
+import org.jboss.test.messaging.tools.TestJMSProviderAdaptor;
+import org.jboss.test.messaging.tools.aop.PoisonInterceptor;
+import org.jboss.test.messaging.tools.container.InVMInitialContextFactory;
+import org.jboss.test.messaging.tools.container.ServiceContainer;
+import org.jboss.tm.TxUtils;
+
+import com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionManagerImple;
+
+/**
+ * 
+ * A XAResourceRecoveryTest
+ * 
+ * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
+ * @version <tt>$Revision: 1.1 $</tt>
+ * 
+ * $Id$
+ * 
+ */
+public class XAResourceRecoveryTest extends JMSTestCase
+{
+	protected ServiceContainer sc;
+
+	protected JBossConnectionFactory cf1;
+
+	protected TransactionManager tm;
+
+	protected Transaction suspendedTx;
+
+	protected static Queue otherQueue;
+
+	public XAResourceRecoveryTest(String name)
+	{
+		super(name);
+	}
+
+	protected void setUp() throws Exception
+	{
+		super.setUp();
+
+		// Now start another remote server
+		ServerManagement.start(1, "all", false);
+
+		ResourceManagerFactory.instance.clear();
+
+		// We need a local transaction and recovery manager
+		// We must start this after the remote servers have been created or it
+		// won't
+		// have deleted the database and the recovery manager may attempt to
+		// recover transactions
+		sc = new ServiceContainer("all");
+
+		// Don't drop the tables again!
+
+		sc.start(false);
+
+		InitialContext localIc = new InitialContext(InVMInitialContextFactory
+				.getJNDIEnvironment());
+
+		tm = (TransactionManager) localIc
+				.lookup(ServiceContainer.TRANSACTION_MANAGER_JNDI_NAME);
+
+		assertTrue(tm instanceof TransactionManagerImple);
+
+		ServerManagement.deployQueue("OtherQueue", 1);
+
+		Hashtable props1 = ServerManagement.getJNDIEnvironment(1);
+
+		InitialContext ic1 = new InitialContext(props1);
+
+		cf1 = (JBossConnectionFactory) ic1.lookup("/XAConnectionFactory");
+
+		otherQueue = (Queue) ic1.lookup("/queue/OtherQueue");
+
+		checkOtherQueueEmpty();
+
+		// Now install local JMSProviderAdaptor classes
+
+		Properties p1 = new Properties();
+		p1.putAll(ServerManagement.getJNDIEnvironment(1));
+
+		JMSProviderAdapter targetAdaptor = new TestJMSProviderAdaptor(p1,
+				"/XAConnectionFactory", "adaptor1");
+
+		sc.installJMSProviderAdaptor("adaptor1", targetAdaptor);
+
+		sc.startRecoveryManager();
+
+		suspendedTx = tm.suspend();
+	}
+
+	public void tearDown() throws Exception
+	{
+		try
+		{
+			ServerManagement.undeployQueue("OtherQueue", 1);
+		} catch (Exception ignore)
+		{
+		}
+
+		if (TxUtils.isUncommitted(tm))
+		{
+			// roll it back
+			try
+			{
+				tm.rollback();
+			} catch (Throwable ignore)
+			{
+				// The connection will probably be closed so this may well throw an
+				// exception
+			}
+		}
+		if (tm.getTransaction() != null)
+		{
+			Transaction tx = tm.suspend();
+			if (tx != null)
+				log.warn("Transaction still associated with thread " + tx
+						+ " at status " + TxUtils.getStatusAsString(tx.getStatus()));
+		}
+
+		if (suspendedTx != null)
+		{
+			tm.resume(suspendedTx);
+		}
+
+		sc.uninstallJMSProviderAdaptor("adaptor1");
+
+		sc.stopRecoveryManager();
+
+		sc.stop();
+
+		// We explicitly clear the resource manager factory since the recovery
+		// manager will keep a connection open, and
+		// otherewise it will fail
+
+		ResourceManagerFactory.instance.clear();
+
+		super.tearDown();
+	}
+
+	public void testRecoveryOnAck() throws Exception
+	{
+		XAConnection conn0 = null;
+
+		XAConnection conn1 = null;
+
+		Connection conn2 = null;
+
+		Connection conn3 = null;
+
+		try
+		{
+			conn0 = cf.createXAConnection();
+
+			XASession sess0 = conn0.createXASession();
+
+			MessageProducer prod0 = sess0.createProducer(queue1);
+
+			XAResource res0 = sess0.getXAResource();
+
+			conn1 = cf1.createXAConnection();
+
+			XASession sess1 = conn1.createXASession();
+
+			MessageConsumer cons1 = sess1.createConsumer(otherQueue);
+
+			XAResource res1 = sess1.getXAResource();
+
+			conn1.start();
+
+			// first send a few messages to server 1
+
+			conn2 = cf1.createConnection();
+
+			Session sess2 = conn2.createSession(false, Session.AUTO_ACKNOWLEDGE);
+
+			MessageProducer prod2 = sess2.createProducer(otherQueue);
+
+			TextMessage tm1 = sess1.createTextMessage("message1");
+
+			prod2.send(tm1);
+
+			TextMessage tm2 = sess1.createTextMessage("message2");
+
+			prod2.send(tm2);
+
+			conn2.close();
+
+			tm.begin();
+
+			Transaction tx = tm.getTransaction();
+
+			tx.enlistResource(res0);
+
+			tx.enlistResource(res1);
+
+			TextMessage tm0 = sess0.createTextMessage("message0");
+
+			prod0.send(tm0);
+
+			// Consume one of the messages on dest
+
+			TextMessage rm1 = (TextMessage) cons1.receive(1000);
+
+			assertNotNull(rm1);
+
+			assertEquals(tm1.getText(), rm1.getText());
+
+			// Poison server 1 so it crashes on commit of dest but after prepare
+
+			// This means the transaction branch on source will get commmitted
+			// but the branch on dest won't be - it will remain prepared
+			// This corresponds to a HeuristicMixedException
+
+			ServerManagement.poisonTheServer(1, PoisonInterceptor.TYPE_2PC_COMMIT);
+
+			tx.delistResource(res0, XAResource.TMSUCCESS);
+
+			tx.delistResource(res1, XAResource.TMSUCCESS);
+
+			tx.commit();
+
+			conn0.close();
+
+			conn1.close();
+
+			// Now restart the server
+
+			ServerManagement.start(1, "all", false);
+
+			ServerManagement.deployQueue("OtherQueue", 1);
+
+			Hashtable props1 = ServerManagement.getJNDIEnvironment(1);
+
+			InitialContext ic1 = new InitialContext(props1);
+
+			cf1 = (JBossConnectionFactory) ic1.lookup("/XAConnectionFactory");
+
+			otherQueue = (Queue) ic1.lookup("/queue/OtherQueue");
+
+			conn2 = cf.createConnection();
+
+			sess2 = conn2.createSession(false, Session.AUTO_ACKNOWLEDGE);
+
+			MessageConsumer cons2 = sess2.createConsumer(queue1);
+
+			conn2.start();
+
+			TextMessage rm0 = (TextMessage) cons2.receive(2000);
+
+			assertNotNull(rm0);
+
+			assertEquals(tm0.getText(), rm0.getText());
+
+			checkEmpty(queue1);
+
+			// Now even though the commit on the second server failed since the
+			// server was dead, the recovery manager should kick in
+			// eventually and recover it.
+
+			conn3 = ((ConnectionFactory) cf1).createConnection();
+
+			Session sess3 = conn3.createSession(false, Session.AUTO_ACKNOWLEDGE);
+
+			MessageConsumer cons3 = sess3.createConsumer(otherQueue);
+
+			conn3.start();
+
+			TextMessage rm2 = (TextMessage) cons3.receive(60000);
+
+			assertNotNull(rm2);
+
+			// tm1 should have been acked on recovery
+
+			assertEquals(tm2.getText(), rm2.getText());
+
+			checkOtherQueueEmpty();
+		}
+		finally
+		{
+			if (conn0 != null)
+			{
+				conn0.close();
+			}
+			if (conn1 != null)
+			{
+				conn1.close();
+			}
+			if (conn2 != null)
+			{
+				conn2.close();
+			}
+			if (conn3 != null)
+			{
+				conn3.close();
+			}
+		}
+	}
+
+	private void checkOtherQueueEmpty() throws Exception
+	{
+		ObjectName destObjectName = new ObjectName(
+				"jboss.messaging.destination:service=Queue,name=OtherQueue");
+
+		Integer messageCount = (Integer) ServerManagement.getServer(1)
+				.getAttribute(destObjectName, "MessageCount");
+
+		assertEquals(0, messageCount.intValue());
+	}
+}

Added: branches/Branch_1_4/integration/EAP4/tests-src/org/jboss/test/messaging/jms/XAResourceRecoveryTest.java
===================================================================
--- branches/Branch_1_4/integration/EAP4/tests-src/org/jboss/test/messaging/jms/XAResourceRecoveryTest.java	                        (rev 0)
+++ branches/Branch_1_4/integration/EAP4/tests-src/org/jboss/test/messaging/jms/XAResourceRecoveryTest.java	2009-11-10 07:31:23 UTC (rev 7898)
@@ -0,0 +1,487 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.test.messaging.jms;
+
+import java.util.Hashtable;
+import java.util.Properties;
+
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageProducer;
+import javax.jms.Queue;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+import javax.jms.XAConnection;
+import javax.jms.XASession;
+import javax.management.ObjectName;
+import javax.naming.InitialContext;
+import javax.transaction.Transaction;
+import javax.transaction.TransactionManager;
+import javax.transaction.xa.XAResource;
+
+import org.jboss.jms.client.JBossConnectionFactory;
+import org.jboss.jms.jndi.JMSProviderAdapter;
+import org.jboss.jms.tx.ResourceManagerFactory;
+import org.jboss.test.messaging.tools.ServerManagement;
+import org.jboss.test.messaging.tools.TestJMSProviderAdaptor;
+import org.jboss.test.messaging.tools.aop.PoisonInterceptor;
+import org.jboss.test.messaging.tools.container.InVMInitialContextFactory;
+import org.jboss.test.messaging.tools.container.ServiceContainer;
+import org.jboss.tm.TxUtils;
+
+import com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionManagerImple;
+
+/**
+ * 
+ * A XAResourceRecoveryTest
+ * 
+ * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
+ * @version <tt>$Revision: 1.1 $</tt>
+ * 
+ * $Id$
+ * 
+ */
+public class XAResourceRecoveryTest extends JMSTestCase
+{
+	protected ServiceContainer sc;
+
+	protected JBossConnectionFactory cf1;
+
+	protected TransactionManager tm;
+
+	protected Transaction suspendedTx;
+
+	protected static Queue otherQueue;
+
+	public XAResourceRecoveryTest(String name)
+	{
+		super(name);
+	}
+
+	protected void setUp() throws Exception
+	{
+		super.setUp();
+
+		// Now start another remote server
+		ServerManagement.start(1, "all", false);
+
+		ResourceManagerFactory.instance.clear();
+
+		// We need a local transaction and recovery manager
+		// We must start this after the remote servers have been created or it
+		// won't
+		// have deleted the database and the recovery manager may attempt to
+		// recover transactions
+		sc = new ServiceContainer("all");
+
+		// Don't drop the tables again!
+
+		sc.start(false);
+
+		InitialContext localIc = new InitialContext(InVMInitialContextFactory
+				.getJNDIEnvironment());
+
+		tm = (TransactionManager) localIc
+				.lookup(ServiceContainer.TRANSACTION_MANAGER_JNDI_NAME);
+
+		assertTrue(tm instanceof TransactionManagerImple);
+
+		ServerManagement.deployQueue("OtherQueue", 1);
+
+		Hashtable props1 = ServerManagement.getJNDIEnvironment(1);
+
+		InitialContext ic1 = new InitialContext(props1);
+
+		cf1 = (JBossConnectionFactory) ic1.lookup("/XAConnectionFactory");
+
+		otherQueue = (Queue) ic1.lookup("/queue/OtherQueue");
+
+		checkOtherQueueEmpty();
+
+		// Now install local JMSProviderAdaptor classes
+
+		Properties p1 = new Properties();
+		p1.putAll(ServerManagement.getJNDIEnvironment(1));
+
+		JMSProviderAdapter targetAdaptor = new TestJMSProviderAdaptor(p1,
+				"/XAConnectionFactory", "adaptor1");
+
+		sc.installJMSProviderAdaptor("adaptor1", targetAdaptor);
+
+		sc.startRecoveryManager();
+
+		suspendedTx = tm.suspend();
+	}
+
+	public void tearDown() throws Exception
+	{
+		try
+		{
+			ServerManagement.undeployQueue("OtherQueue", 1);
+		} catch (Exception ignore)
+		{
+		}
+
+		if (TxUtils.isUncommitted(tm))
+		{
+			// roll it back
+			try
+			{
+				tm.rollback();
+			} catch (Throwable ignore)
+			{
+				// The connection will probably be closed so this may well throw an
+				// exception
+			}
+		}
+		if (tm.getTransaction() != null)
+		{
+			Transaction tx = tm.suspend();
+			if (tx != null)
+				log.warn("Transaction still associated with thread " + tx
+						+ " at status " + TxUtils.getStatusAsString(tx.getStatus()));
+		}
+
+		if (suspendedTx != null)
+		{
+			tm.resume(suspendedTx);
+		}
+
+		sc.uninstallJMSProviderAdaptor("adaptor1");
+
+		sc.stopRecoveryManager();
+
+		sc.stop();
+
+		// We explicitly clear the resource manager factory since the recovery
+		// manager will keep a connection open, and
+		// otherewise it will fail
+
+		ResourceManagerFactory.instance.clear();
+
+		super.tearDown();
+	}
+
+	public void testRecoveryOnSend() throws Exception
+	{
+		XAConnection conn0 = null;
+
+		XAConnection conn1 = null;
+
+		Connection conn2 = null;
+
+		Connection conn3 = null;
+
+		try
+		{
+			conn0 = cf.createXAConnection();
+
+			XASession sess0 = conn0.createXASession();
+
+			MessageProducer prod0 = sess0.createProducer(queue1);
+
+			XAResource res0 = sess0.getXAResource();
+
+			conn1 = cf1.createXAConnection();
+
+			XASession sess1 = conn1.createXASession();
+
+			MessageProducer prod1 = sess1.createProducer(otherQueue);
+
+			XAResource res1 = sess1.getXAResource();
+
+			tm.begin();
+
+			Transaction tx = tm.getTransaction();
+
+			tx.enlistResource(res0);
+
+			tx.enlistResource(res1);
+
+			TextMessage tm0 = sess0.createTextMessage("message0");
+
+			prod0.send(tm0);
+
+			TextMessage tm1 = sess1.createTextMessage("message1");
+
+			prod1.send(tm1);
+
+			// Poison server 1 so it crashes on commit of dest but after prepare
+
+			// This means the transaction branch on source will get commmitted
+			// but the branch on dest won't be - it will remain prepared
+			// This corresponds to a HeuristicMixedException
+
+			ServerManagement.poisonTheServer(1, PoisonInterceptor.TYPE_2PC_COMMIT);
+
+			tx.delistResource(res0, XAResource.TMSUCCESS);
+
+			tx.delistResource(res1, XAResource.TMSUCCESS);
+
+			tx.commit();
+
+			conn0.close();
+
+			conn1.close();
+
+			// Now restart the server
+
+			ServerManagement.start(1, "all", false);
+
+			ServerManagement.deployQueue("OtherQueue", 1);
+
+			Hashtable props1 = ServerManagement.getJNDIEnvironment(1);
+
+			InitialContext ic1 = new InitialContext(props1);
+
+			cf1 = (JBossConnectionFactory) ic1.lookup("/XAConnectionFactory");
+
+			otherQueue = (Queue) ic1.lookup("/queue/OtherQueue");
+
+			conn2 = cf.createConnection();
+
+			Session sess2 = conn2.createSession(false, Session.AUTO_ACKNOWLEDGE);
+
+			MessageConsumer cons2 = sess2.createConsumer(queue1);
+
+			conn2.start();
+
+			TextMessage rm0 = (TextMessage) cons2.receive(2000);
+
+			assertNotNull(rm0);
+
+			assertEquals(tm0.getText(), rm0.getText());
+
+			checkEmpty(queue1);
+
+			// Now even though the commit on the second server failed since the
+			// server was dead, the recovery manager should kick in
+			// eventually and recover it.
+
+			conn3 = cf1.createConnection();
+
+			Session sess3 = conn3.createSession(false, Session.AUTO_ACKNOWLEDGE);
+
+			MessageConsumer cons3 = sess3.createConsumer(otherQueue);
+
+			conn3.start();
+
+			TextMessage rm1 = (TextMessage) cons3.receive(60000);
+
+			assertNotNull(rm1);
+
+			assertEquals(tm1.getText(), rm1.getText());
+
+			checkOtherQueueEmpty();
+		}
+		finally
+		{
+			if (conn0 != null)
+			{
+				conn0.close();
+			}
+			if (conn1 != null)
+			{
+				conn1.close();
+			}
+			if (conn2 != null)
+			{
+				conn2.close();
+			}
+			if (conn3 != null)
+			{
+				conn3.close();
+			}
+		}
+	}
+
+	public void testRecoveryOnAck() throws Exception
+	{
+		XAConnection conn0 = null;
+
+		XAConnection conn1 = null;
+
+		Connection conn2 = null;
+
+		Connection conn3 = null;
+
+		try
+		{
+			conn0 = cf.createXAConnection();
+
+			XASession sess0 = conn0.createXASession();
+
+			MessageProducer prod0 = sess0.createProducer(queue1);
+
+			XAResource res0 = sess0.getXAResource();
+
+			conn1 = cf1.createXAConnection();
+
+			XASession sess1 = conn1.createXASession();
+
+			MessageConsumer cons1 = sess1.createConsumer(otherQueue);
+
+			XAResource res1 = sess1.getXAResource();
+
+			conn1.start();
+
+			// first send a few messages to server 1
+
+			conn2 = cf1.createConnection();
+
+			Session sess2 = conn2.createSession(false, Session.AUTO_ACKNOWLEDGE);
+
+			MessageProducer prod2 = sess2.createProducer(otherQueue);
+
+			TextMessage tm1 = sess1.createTextMessage("message1");
+
+			prod2.send(tm1);
+
+			TextMessage tm2 = sess1.createTextMessage("message2");
+
+			prod2.send(tm2);
+
+			conn2.close();
+
+			tm.begin();
+
+			Transaction tx = tm.getTransaction();
+
+			tx.enlistResource(res0);
+
+			tx.enlistResource(res1);
+
+			TextMessage tm0 = sess0.createTextMessage("message0");
+
+			prod0.send(tm0);
+
+			// Consume one of the messages on dest
+
+			TextMessage rm1 = (TextMessage) cons1.receive(1000);
+
+			assertNotNull(rm1);
+
+			assertEquals(tm1.getText(), rm1.getText());
+
+			// Poison server 1 so it crashes on commit of dest but after prepare
+
+			// This means the transaction branch on source will get commmitted
+			// but the branch on dest won't be - it will remain prepared
+			// This corresponds to a HeuristicMixedException
+
+			ServerManagement.poisonTheServer(1, PoisonInterceptor.TYPE_2PC_COMMIT);
+
+			tx.delistResource(res0, XAResource.TMSUCCESS);
+
+			tx.delistResource(res1, XAResource.TMSUCCESS);
+
+			tx.commit();
+
+			conn0.close();
+
+			conn1.close();
+
+			// Now restart the server
+
+			ServerManagement.start(1, "all", false);
+
+			ServerManagement.deployQueue("OtherQueue", 1);
+
+			Hashtable props1 = ServerManagement.getJNDIEnvironment(1);
+
+			InitialContext ic1 = new InitialContext(props1);
+
+			cf1 = (JBossConnectionFactory) ic1.lookup("/XAConnectionFactory");
+
+			otherQueue = (Queue) ic1.lookup("/queue/OtherQueue");
+
+			conn2 = cf.createConnection();
+
+			sess2 = conn2.createSession(false, Session.AUTO_ACKNOWLEDGE);
+
+			MessageConsumer cons2 = sess2.createConsumer(queue1);
+
+			conn2.start();
+
+			TextMessage rm0 = (TextMessage) cons2.receive(2000);
+
+			assertNotNull(rm0);
+
+			assertEquals(tm0.getText(), rm0.getText());
+
+			checkEmpty(queue1);
+
+			// Now even though the commit on the second server failed since the
+			// server was dead, the recovery manager should kick in
+			// eventually and recover it.
+
+			conn3 = ((ConnectionFactory) cf1).createConnection();
+
+			Session sess3 = conn3.createSession(false, Session.AUTO_ACKNOWLEDGE);
+
+			MessageConsumer cons3 = sess3.createConsumer(otherQueue);
+
+			conn3.start();
+
+			TextMessage rm2 = (TextMessage) cons3.receive(60000);
+
+			assertNotNull(rm2);
+
+			// tm1 should have been acked on recovery
+
+			assertEquals(tm2.getText(), rm2.getText());
+
+			checkOtherQueueEmpty();
+		}
+		finally
+		{
+			if (conn0 != null)
+			{
+				conn0.close();
+			}
+			if (conn1 != null)
+			{
+				conn1.close();
+			}
+			if (conn2 != null)
+			{
+				conn2.close();
+			}
+			if (conn3 != null)
+			{
+				conn3.close();
+			}
+		}
+	}
+
+	private void checkOtherQueueEmpty() throws Exception
+	{
+		ObjectName destObjectName = new ObjectName(
+				"jboss.messaging.destination:service=Queue,name=OtherQueue");
+
+		Integer messageCount = (Integer) ServerManagement.getServer(1)
+				.getAttribute(destObjectName, "MessageCount");
+
+		assertEquals(0, messageCount.intValue());
+	}
+}

Added: branches/Branch_1_4/integration/EAP5/tests-src/org/jboss/test/messaging/jms/XAResourceRecoveryTest.java
===================================================================
--- branches/Branch_1_4/integration/EAP5/tests-src/org/jboss/test/messaging/jms/XAResourceRecoveryTest.java	                        (rev 0)
+++ branches/Branch_1_4/integration/EAP5/tests-src/org/jboss/test/messaging/jms/XAResourceRecoveryTest.java	2009-11-10 07:31:23 UTC (rev 7898)
@@ -0,0 +1,354 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2005, JBoss Inc., and individual contributors as indicated
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
+ */
+package org.jboss.test.messaging.jms;
+
+import java.util.Hashtable;
+import java.util.Properties;
+
+import javax.jms.Connection;
+import javax.jms.ConnectionFactory;
+import javax.jms.MessageConsumer;
+import javax.jms.MessageProducer;
+import javax.jms.Queue;
+import javax.jms.Session;
+import javax.jms.TextMessage;
+import javax.jms.XAConnection;
+import javax.jms.XASession;
+import javax.management.ObjectName;
+import javax.naming.InitialContext;
+import javax.transaction.Transaction;
+import javax.transaction.TransactionManager;
+import javax.transaction.xa.XAResource;
+
+import org.jboss.jms.client.JBossConnectionFactory;
+import org.jboss.jms.jndi.JMSProviderAdapter;
+import org.jboss.jms.tx.ResourceManagerFactory;
+import org.jboss.test.messaging.tools.ServerManagement;
+import org.jboss.test.messaging.tools.TestJMSProviderAdaptor;
+import org.jboss.test.messaging.tools.aop.PoisonInterceptor;
+import org.jboss.test.messaging.tools.container.InVMInitialContextFactory;
+import org.jboss.test.messaging.tools.container.ServiceContainer;
+import org.jboss.tm.TxUtils;
+
+import com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionManagerImple;
+
+/**
+ * 
+ * A XAResourceRecoveryTest
+ * 
+ * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
+ * @version <tt>$Revision: 1.1 $</tt>
+ * 
+ * $Id$
+ * 
+ */
+public class XAResourceRecoveryTest extends JMSTestCase
+{
+	protected ServiceContainer sc;
+
+	protected JBossConnectionFactory cf1;
+
+	protected TransactionManager tm;
+
+	protected Transaction suspendedTx;
+
+	protected static Queue otherQueue;
+
+	public XAResourceRecoveryTest(String name)
+	{
+		super(name);
+	}
+
+	protected void setUp() throws Exception
+	{
+		super.setUp();
+
+		// Now start another remote server
+		ServerManagement.start(1, "all", false);
+
+		ResourceManagerFactory.instance.clear();
+
+		// We need a local transaction and recovery manager
+		// We must start this after the remote servers have been created or it
+		// won't
+		// have deleted the database and the recovery manager may attempt to
+		// recover transactions
+		sc = new ServiceContainer("all");
+
+		// Don't drop the tables again!
+
+		sc.start(false);
+
+		InitialContext localIc = new InitialContext(InVMInitialContextFactory
+				.getJNDIEnvironment());
+
+		tm = (TransactionManager) localIc
+				.lookup(ServiceContainer.TRANSACTION_MANAGER_JNDI_NAME);
+
+		assertTrue(tm instanceof TransactionManagerImple);
+
+		ServerManagement.deployQueue("OtherQueue", 1);
+
+		Hashtable props1 = ServerManagement.getJNDIEnvironment(1);
+
+		InitialContext ic1 = new InitialContext(props1);
+
+		cf1 = (JBossConnectionFactory) ic1.lookup("/XAConnectionFactory");
+
+		otherQueue = (Queue) ic1.lookup("/queue/OtherQueue");
+
+		checkOtherQueueEmpty();
+
+		// Now install local JMSProviderAdaptor classes
+
+		Properties p1 = new Properties();
+		p1.putAll(ServerManagement.getJNDIEnvironment(1));
+
+		JMSProviderAdapter targetAdaptor = new TestJMSProviderAdaptor(p1,
+				"/XAConnectionFactory", "adaptor1");
+
+		sc.installJMSProviderAdaptor("adaptor1", targetAdaptor);
+
+		sc.startRecoveryManager();
+
+		suspendedTx = tm.suspend();
+	}
+
+	public void tearDown() throws Exception
+	{
+		try
+		{
+			ServerManagement.undeployQueue("OtherQueue", 1);
+		} catch (Exception ignore)
+		{
+		}
+
+		if (TxUtils.isUncommitted(tm))
+		{
+			// roll it back
+			try
+			{
+				tm.rollback();
+			} catch (Throwable ignore)
+			{
+				// The connection will probably be closed so this may well throw an
+				// exception
+			}
+		}
+		if (tm.getTransaction() != null)
+		{
+			Transaction tx = tm.suspend();
+			if (tx != null)
+				log.warn("Transaction still associated with thread " + tx
+						+ " at status " + TxUtils.getStatusAsString(tx.getStatus()));
+		}
+
+		if (suspendedTx != null)
+		{
+			tm.resume(suspendedTx);
+		}
+
+		sc.uninstallJMSProviderAdaptor("adaptor1");
+
+		sc.stopRecoveryManager();
+
+		sc.stop();
+
+		// We explicitly clear the resource manager factory since the recovery
+		// manager will keep a connection open, and
+		// otherewise it will fail
+
+		ResourceManagerFactory.instance.clear();
+
+		super.tearDown();
+	}
+
+	public void testRecoveryOnAck() throws Exception
+	{
+		XAConnection conn0 = null;
+
+		XAConnection conn1 = null;
+
+		Connection conn2 = null;
+
+		Connection conn3 = null;
+
+		try
+		{
+			conn0 = cf.createXAConnection();
+
+			XASession sess0 = conn0.createXASession();
+
+			MessageProducer prod0 = sess0.createProducer(queue1);
+
+			XAResource res0 = sess0.getXAResource();
+
+			conn1 = cf1.createXAConnection();
+
+			XASession sess1 = conn1.createXASession();
+
+			MessageConsumer cons1 = sess1.createConsumer(otherQueue);
+
+			XAResource res1 = sess1.getXAResource();
+
+			conn1.start();
+
+			// first send a few messages to server 1
+
+			conn2 = cf1.createConnection();
+
+			Session sess2 = conn2.createSession(false, Session.AUTO_ACKNOWLEDGE);
+
+			MessageProducer prod2 = sess2.createProducer(otherQueue);
+
+			TextMessage tm1 = sess1.createTextMessage("message1");
+
+			prod2.send(tm1);
+
+			TextMessage tm2 = sess1.createTextMessage("message2");
+
+			prod2.send(tm2);
+
+			conn2.close();
+
+			tm.begin();
+
+			Transaction tx = tm.getTransaction();
+
+			tx.enlistResource(res0);
+
+			tx.enlistResource(res1);
+
+			TextMessage tm0 = sess0.createTextMessage("message0");
+
+			prod0.send(tm0);
+
+			// Consume one of the messages on dest
+
+			TextMessage rm1 = (TextMessage) cons1.receive(1000);
+
+			assertNotNull(rm1);
+
+			assertEquals(tm1.getText(), rm1.getText());
+
+			// Poison server 1 so it crashes on commit of dest but after prepare
+
+			// This means the transaction branch on source will get commmitted
+			// but the branch on dest won't be - it will remain prepared
+			// This corresponds to a HeuristicMixedException
+
+			ServerManagement.poisonTheServer(1, PoisonInterceptor.TYPE_2PC_COMMIT);
+
+			tx.delistResource(res0, XAResource.TMSUCCESS);
+
+			tx.delistResource(res1, XAResource.TMSUCCESS);
+
+			tx.commit();
+
+			conn0.close();
+
+			conn1.close();
+
+			// Now restart the server
+
+			ServerManagement.start(1, "all", false);
+
+			ServerManagement.deployQueue("OtherQueue", 1);
+
+			Hashtable props1 = ServerManagement.getJNDIEnvironment(1);
+
+			InitialContext ic1 = new InitialContext(props1);
+
+			cf1 = (JBossConnectionFactory) ic1.lookup("/XAConnectionFactory");
+
+			otherQueue = (Queue) ic1.lookup("/queue/OtherQueue");
+
+			conn2 = cf.createConnection();
+
+			sess2 = conn2.createSession(false, Session.AUTO_ACKNOWLEDGE);
+
+			MessageConsumer cons2 = sess2.createConsumer(queue1);
+
+			conn2.start();
+
+			TextMessage rm0 = (TextMessage) cons2.receive(2000);
+
+			assertNotNull(rm0);
+
+			assertEquals(tm0.getText(), rm0.getText());
+
+			checkEmpty(queue1);
+
+			// Now even though the commit on the second server failed since the
+			// server was dead, the recovery manager should kick in
+			// eventually and recover it.
+
+			conn3 = ((ConnectionFactory) cf1).createConnection();
+
+			Session sess3 = conn3.createSession(false, Session.AUTO_ACKNOWLEDGE);
+
+			MessageConsumer cons3 = sess3.createConsumer(otherQueue);
+
+			conn3.start();
+
+			TextMessage rm2 = (TextMessage) cons3.receive(60000);
+
+			assertNotNull(rm2);
+
+			// tm1 should have been acked on recovery
+
+			assertEquals(tm2.getText(), rm2.getText());
+
+			checkOtherQueueEmpty();
+		}
+		finally
+		{
+			if (conn0 != null)
+			{
+				conn0.close();
+			}
+			if (conn1 != null)
+			{
+				conn1.close();
+			}
+			if (conn2 != null)
+			{
+				conn2.close();
+			}
+			if (conn3 != null)
+			{
+				conn3.close();
+			}
+		}
+	}
+
+	private void checkOtherQueueEmpty() throws Exception
+	{
+		ObjectName destObjectName = new ObjectName(
+				"jboss.messaging.destination:service=Queue,name=OtherQueue");
+
+		Integer messageCount = (Integer) ServerManagement.getServer(1)
+				.getAttribute(destObjectName, "MessageCount");
+
+		assertEquals(0, messageCount.intValue());
+	}
+}

Deleted: branches/Branch_1_4/tests/src/org/jboss/test/messaging/jms/XAResourceRecoveryTest.java
===================================================================
--- branches/Branch_1_4/tests/src/org/jboss/test/messaging/jms/XAResourceRecoveryTest.java	2009-11-09 05:39:23 UTC (rev 7897)
+++ branches/Branch_1_4/tests/src/org/jboss/test/messaging/jms/XAResourceRecoveryTest.java	2009-11-10 07:31:23 UTC (rev 7898)
@@ -1,487 +0,0 @@
-/*
- * JBoss, Home of Professional Open Source
- * Copyright 2005, JBoss Inc., and individual contributors as indicated
- * by the @authors tag. See the copyright.txt in the distribution for a
- * full listing of individual contributors.
- *
- * This is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as
- * published by the Free Software Foundation; either version 2.1 of
- * the License, or (at your option) any later version.
- *
- * This software is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this software; if not, write to the Free
- * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
- * 02110-1301 USA, or see the FSF site: http://www.fsf.org.
- */
-package org.jboss.test.messaging.jms;
-
-import java.util.Hashtable;
-import java.util.Properties;
-
-import javax.jms.Connection;
-import javax.jms.ConnectionFactory;
-import javax.jms.MessageConsumer;
-import javax.jms.MessageProducer;
-import javax.jms.Queue;
-import javax.jms.Session;
-import javax.jms.TextMessage;
-import javax.jms.XAConnection;
-import javax.jms.XASession;
-import javax.management.ObjectName;
-import javax.naming.InitialContext;
-import javax.transaction.Transaction;
-import javax.transaction.TransactionManager;
-import javax.transaction.xa.XAResource;
-
-import org.jboss.jms.client.JBossConnectionFactory;
-import org.jboss.jms.jndi.JMSProviderAdapter;
-import org.jboss.jms.tx.ResourceManagerFactory;
-import org.jboss.test.messaging.tools.ServerManagement;
-import org.jboss.test.messaging.tools.TestJMSProviderAdaptor;
-import org.jboss.test.messaging.tools.aop.PoisonInterceptor;
-import org.jboss.test.messaging.tools.container.InVMInitialContextFactory;
-import org.jboss.test.messaging.tools.container.ServiceContainer;
-import org.jboss.tm.TxUtils;
-
-import com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionManagerImple;
-
-/**
- * 
- * A XAResourceRecoveryTest
- * 
- * @author <a href="mailto:tim.fox at jboss.com">Tim Fox</a>
- * @version <tt>$Revision: 1.1 $</tt>
- * 
- * $Id$
- * 
- */
-public class XAResourceRecoveryTest extends JMSTestCase
-{
-	protected ServiceContainer sc;
-
-	protected JBossConnectionFactory cf1;
-
-	protected TransactionManager tm;
-
-	protected Transaction suspendedTx;
-
-	protected static Queue otherQueue;
-
-	public XAResourceRecoveryTest(String name)
-	{
-		super(name);
-	}
-
-	protected void setUp() throws Exception
-	{
-		super.setUp();
-
-		// Now start another remote server
-		ServerManagement.start(1, "all", false);
-
-		ResourceManagerFactory.instance.clear();
-
-		// We need a local transaction and recovery manager
-		// We must start this after the remote servers have been created or it
-		// won't
-		// have deleted the database and the recovery manager may attempt to
-		// recover transactions
-		sc = new ServiceContainer("all");
-
-		// Don't drop the tables again!
-
-		sc.start(false);
-
-		InitialContext localIc = new InitialContext(InVMInitialContextFactory
-				.getJNDIEnvironment());
-
-		tm = (TransactionManager) localIc
-				.lookup(ServiceContainer.TRANSACTION_MANAGER_JNDI_NAME);
-
-		assertTrue(tm instanceof TransactionManagerImple);
-
-		ServerManagement.deployQueue("OtherQueue", 1);
-
-		Hashtable props1 = ServerManagement.getJNDIEnvironment(1);
-
-		InitialContext ic1 = new InitialContext(props1);
-
-		cf1 = (JBossConnectionFactory) ic1.lookup("/XAConnectionFactory");
-
-		otherQueue = (Queue) ic1.lookup("/queue/OtherQueue");
-
-		checkOtherQueueEmpty();
-
-		// Now install local JMSProviderAdaptor classes
-
-		Properties p1 = new Properties();
-		p1.putAll(ServerManagement.getJNDIEnvironment(1));
-
-		JMSProviderAdapter targetAdaptor = new TestJMSProviderAdaptor(p1,
-				"/XAConnectionFactory", "adaptor1");
-
-		sc.installJMSProviderAdaptor("adaptor1", targetAdaptor);
-
-		sc.startRecoveryManager();
-
-		suspendedTx = tm.suspend();
-	}
-
-	public void tearDown() throws Exception
-	{
-		try
-		{
-			ServerManagement.undeployQueue("OtherQueue", 1);
-		} catch (Exception ignore)
-		{
-		}
-
-		if (TxUtils.isUncommitted(tm))
-		{
-			// roll it back
-			try
-			{
-				tm.rollback();
-			} catch (Throwable ignore)
-			{
-				// The connection will probably be closed so this may well throw an
-				// exception
-			}
-		}
-		if (tm.getTransaction() != null)
-		{
-			Transaction tx = tm.suspend();
-			if (tx != null)
-				log.warn("Transaction still associated with thread " + tx
-						+ " at status " + TxUtils.getStatusAsString(tx.getStatus()));
-		}
-
-		if (suspendedTx != null)
-		{
-			tm.resume(suspendedTx);
-		}
-
-		sc.uninstallJMSProviderAdaptor("adaptor1");
-
-		sc.stopRecoveryManager();
-
-		sc.stop();
-
-		// We explicitly clear the resource manager factory since the recovery
-		// manager will keep a connection open, and
-		// otherewise it will fail
-
-		ResourceManagerFactory.instance.clear();
-
-		super.tearDown();
-	}
-
-	public void testRecoveryOnSend() throws Exception
-	{
-		XAConnection conn0 = null;
-
-		XAConnection conn1 = null;
-
-		Connection conn2 = null;
-
-		Connection conn3 = null;
-
-		try
-		{
-			conn0 = cf.createXAConnection();
-
-			XASession sess0 = conn0.createXASession();
-
-			MessageProducer prod0 = sess0.createProducer(queue1);
-
-			XAResource res0 = sess0.getXAResource();
-
-			conn1 = cf1.createXAConnection();
-
-			XASession sess1 = conn1.createXASession();
-
-			MessageProducer prod1 = sess1.createProducer(otherQueue);
-
-			XAResource res1 = sess1.getXAResource();
-
-			tm.begin();
-
-			Transaction tx = tm.getTransaction();
-
-			tx.enlistResource(res0);
-
-			tx.enlistResource(res1);
-
-			TextMessage tm0 = sess0.createTextMessage("message0");
-
-			prod0.send(tm0);
-
-			TextMessage tm1 = sess1.createTextMessage("message1");
-
-			prod1.send(tm1);
-
-			// Poison server 1 so it crashes on commit of dest but after prepare
-
-			// This means the transaction branch on source will get commmitted
-			// but the branch on dest won't be - it will remain prepared
-			// This corresponds to a HeuristicMixedException
-
-			ServerManagement.poisonTheServer(1, PoisonInterceptor.TYPE_2PC_COMMIT);
-
-			tx.delistResource(res0, XAResource.TMSUCCESS);
-
-			tx.delistResource(res1, XAResource.TMSUCCESS);
-
-			tx.commit();
-
-			conn0.close();
-
-			conn1.close();
-
-			// Now restart the server
-
-			ServerManagement.start(1, "all", false);
-
-			ServerManagement.deployQueue("OtherQueue", 1);
-
-			Hashtable props1 = ServerManagement.getJNDIEnvironment(1);
-
-			InitialContext ic1 = new InitialContext(props1);
-
-			cf1 = (JBossConnectionFactory) ic1.lookup("/XAConnectionFactory");
-
-			otherQueue = (Queue) ic1.lookup("/queue/OtherQueue");
-
-			conn2 = cf.createConnection();
-
-			Session sess2 = conn2.createSession(false, Session.AUTO_ACKNOWLEDGE);
-
-			MessageConsumer cons2 = sess2.createConsumer(queue1);
-
-			conn2.start();
-
-			TextMessage rm0 = (TextMessage) cons2.receive(2000);
-
-			assertNotNull(rm0);
-
-			assertEquals(tm0.getText(), rm0.getText());
-
-			checkEmpty(queue1);
-
-			// Now even though the commit on the second server failed since the
-			// server was dead, the recovery manager should kick in
-			// eventually and recover it.
-
-			conn3 = cf1.createConnection();
-
-			Session sess3 = conn3.createSession(false, Session.AUTO_ACKNOWLEDGE);
-
-			MessageConsumer cons3 = sess3.createConsumer(otherQueue);
-
-			conn3.start();
-
-			TextMessage rm1 = (TextMessage) cons3.receive(60000);
-
-			assertNotNull(rm1);
-
-			assertEquals(tm1.getText(), rm1.getText());
-
-			checkOtherQueueEmpty();
-		}
-		finally
-		{
-			if (conn0 != null)
-			{
-				conn0.close();
-			}
-			if (conn1 != null)
-			{
-				conn1.close();
-			}
-			if (conn2 != null)
-			{
-				conn2.close();
-			}
-			if (conn3 != null)
-			{
-				conn3.close();
-			}
-		}
-	}
-
-	public void testRecoveryOnAck() throws Exception
-	{
-		XAConnection conn0 = null;
-
-		XAConnection conn1 = null;
-
-		Connection conn2 = null;
-
-		Connection conn3 = null;
-
-		try
-		{
-			conn0 = cf.createXAConnection();
-
-			XASession sess0 = conn0.createXASession();
-
-			MessageProducer prod0 = sess0.createProducer(queue1);
-
-			XAResource res0 = sess0.getXAResource();
-
-			conn1 = cf1.createXAConnection();
-
-			XASession sess1 = conn1.createXASession();
-
-			MessageConsumer cons1 = sess1.createConsumer(otherQueue);
-
-			XAResource res1 = sess1.getXAResource();
-
-			conn1.start();
-
-			// first send a few messages to server 1
-
-			conn2 = cf1.createConnection();
-
-			Session sess2 = conn2.createSession(false, Session.AUTO_ACKNOWLEDGE);
-
-			MessageProducer prod2 = sess2.createProducer(otherQueue);
-
-			TextMessage tm1 = sess1.createTextMessage("message1");
-
-			prod2.send(tm1);
-
-			TextMessage tm2 = sess1.createTextMessage("message2");
-
-			prod2.send(tm2);
-
-			conn2.close();
-
-			tm.begin();
-
-			Transaction tx = tm.getTransaction();
-
-			tx.enlistResource(res0);
-
-			tx.enlistResource(res1);
-
-			TextMessage tm0 = sess0.createTextMessage("message0");
-
-			prod0.send(tm0);
-
-			// Consume one of the messages on dest
-
-			TextMessage rm1 = (TextMessage) cons1.receive(1000);
-
-			assertNotNull(rm1);
-
-			assertEquals(tm1.getText(), rm1.getText());
-
-			// Poison server 1 so it crashes on commit of dest but after prepare
-
-			// This means the transaction branch on source will get commmitted
-			// but the branch on dest won't be - it will remain prepared
-			// This corresponds to a HeuristicMixedException
-
-			ServerManagement.poisonTheServer(1, PoisonInterceptor.TYPE_2PC_COMMIT);
-
-			tx.delistResource(res0, XAResource.TMSUCCESS);
-
-			tx.delistResource(res1, XAResource.TMSUCCESS);
-
-			tx.commit();
-
-			conn0.close();
-
-			conn1.close();
-
-			// Now restart the server
-
-			ServerManagement.start(1, "all", false);
-
-			ServerManagement.deployQueue("OtherQueue", 1);
-
-			Hashtable props1 = ServerManagement.getJNDIEnvironment(1);
-
-			InitialContext ic1 = new InitialContext(props1);
-
-			cf1 = (JBossConnectionFactory) ic1.lookup("/XAConnectionFactory");
-
-			otherQueue = (Queue) ic1.lookup("/queue/OtherQueue");
-
-			conn2 = cf.createConnection();
-
-			sess2 = conn2.createSession(false, Session.AUTO_ACKNOWLEDGE);
-
-			MessageConsumer cons2 = sess2.createConsumer(queue1);
-
-			conn2.start();
-
-			TextMessage rm0 = (TextMessage) cons2.receive(2000);
-
-			assertNotNull(rm0);
-
-			assertEquals(tm0.getText(), rm0.getText());
-
-			checkEmpty(queue1);
-
-			// Now even though the commit on the second server failed since the
-			// server was dead, the recovery manager should kick in
-			// eventually and recover it.
-
-			conn3 = ((ConnectionFactory) cf1).createConnection();
-
-			Session sess3 = conn3.createSession(false, Session.AUTO_ACKNOWLEDGE);
-
-			MessageConsumer cons3 = sess3.createConsumer(otherQueue);
-
-			conn3.start();
-
-			TextMessage rm2 = (TextMessage) cons3.receive(60000);
-
-			assertNotNull(rm2);
-
-			// tm1 should have been acked on recovery
-
-			assertEquals(tm2.getText(), rm2.getText());
-
-			checkOtherQueueEmpty();
-		}
-		finally
-		{
-			if (conn0 != null)
-			{
-				conn0.close();
-			}
-			if (conn1 != null)
-			{
-				conn1.close();
-			}
-			if (conn2 != null)
-			{
-				conn2.close();
-			}
-			if (conn3 != null)
-			{
-				conn3.close();
-			}
-		}
-	}
-
-	private void checkOtherQueueEmpty() throws Exception
-	{
-		ObjectName destObjectName = new ObjectName(
-				"jboss.messaging.destination:service=Queue,name=OtherQueue");
-
-		Integer messageCount = (Integer) ServerManagement.getServer(1)
-				.getAttribute(destObjectName, "MessageCount");
-
-		assertEquals(0, messageCount.intValue());
-	}
-}




More information about the jboss-cvs-commits mailing list