[jboss-svn-commits] JBL Code SVN: r37787 - in labs/jbosstm/branches/JBOSSTS_4_16: ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/resources/arjunacore and 8 other directories.
jboss-svn-commits at lists.jboss.org
jboss-svn-commits at lists.jboss.org
Thu Dec 8 11:17:15 EST 2011
Author: tomjenkinson
Date: 2011-12-08 11:17:15 -0500 (Thu, 08 Dec 2011)
New Revision: 37787
Added:
labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/classes/com/arjuna/ats/jta/recovery/SerializableXAResourceDeserializer.java
labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/server/impl/ProxyXAResourceDeserializer.java
labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxyXAResourceDeserializer.java
Modified:
labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/recovery/arjunacore/XARecoveryModule.java
labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/resources/arjunacore/XAResourceRecord.java
labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/classes/com/arjuna/ats/jbossatx/jta/RecoveryManagerService.java
labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/ExampleDistributedJTATestCase.java
labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/server/IsolatableServersClassLoader.java
labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/server/LocalServer.java
labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/server/impl/ServerImpl.java
labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/SimpleIsolatedServers.java
labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/IsolatableServersClassLoader.java
labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/LocalServer.java
labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ServerImpl.java
Log:
JBTM-996 updated to allow a helper class to be registered to assist with deserializing XAResources that are not part of the transaction manager
Modified: labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/recovery/arjunacore/XARecoveryModule.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/recovery/arjunacore/XARecoveryModule.java 2011-12-08 15:14:36 UTC (rev 37786)
+++ labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/recovery/arjunacore/XARecoveryModule.java 2011-12-08 16:17:15 UTC (rev 37787)
@@ -31,37 +31,46 @@
package com.arjuna.ats.internal.jta.recovery.arjunacore;
-import com.arjuna.ats.arjuna.common.*;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.Hashtable;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import java.util.Vector;
+
+import javax.transaction.xa.XAException;
+import javax.transaction.xa.XAResource;
+import javax.transaction.xa.Xid;
+
+import com.arjuna.ats.arjuna.common.Uid;
+import com.arjuna.ats.arjuna.exceptions.ObjectStoreException;
import com.arjuna.ats.arjuna.objectstore.RecoveryStore;
+import com.arjuna.ats.arjuna.objectstore.StateStatus;
import com.arjuna.ats.arjuna.objectstore.StoreManager;
-import com.arjuna.ats.arjuna.state.*;
-import com.arjuna.ats.arjuna.objectstore.StateStatus;
import com.arjuna.ats.arjuna.recovery.RecoveryModule;
-
-
+import com.arjuna.ats.arjuna.state.InputObjectState;
import com.arjuna.ats.internal.arjuna.common.UidHelper;
-
import com.arjuna.ats.internal.jta.resources.arjunacore.XAResourceRecord;
+import com.arjuna.ats.jta.common.jtaPropertyManager;
import com.arjuna.ats.jta.logging.jtaLogger;
-import com.arjuna.ats.jta.common.jtaPropertyManager;
-import com.arjuna.ats.jta.recovery.*;
+import com.arjuna.ats.jta.recovery.SerializableXAResourceDeserializer;
+import com.arjuna.ats.jta.recovery.XARecoveryResource;
+import com.arjuna.ats.jta.recovery.XARecoveryResourceManager;
+import com.arjuna.ats.jta.recovery.XAResourceOrphanFilter;
+import com.arjuna.ats.jta.recovery.XAResourceRecovery;
+import com.arjuna.ats.jta.recovery.XAResourceRecoveryHelper;
import com.arjuna.ats.jta.utils.XAHelper;
-import java.util.*;
-import javax.transaction.xa.*;
-
-import com.arjuna.ats.arjuna.exceptions.ObjectStoreException;
-
-import java.io.IOException;
-import javax.transaction.xa.XAException;
-
/**
* Designed to be able to recover any XAResource.
*/
public class XARecoveryModule implements RecoveryModule
{
- public XARecoveryModule()
+ public XARecoveryModule()
{
this(new com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryResourceManagerImple(),
"Local XARecoveryModule");
@@ -97,6 +106,14 @@
_xaResourceOrphanFilters.remove(xaResourceOrphanFilter);
}
}
+
+ public void addSerializableXAResourceDeserializer(SerializableXAResourceDeserializer serializableXAResourceDeserializer) {
+ _seriablizableXAResourceDeserializers.add(serializableXAResourceDeserializer);
+ }
+
+ public List<SerializableXAResourceDeserializer> getSeriablizableXAResourceDeserializers() {
+ return _seriablizableXAResourceDeserializers;
+ }
public void periodicWorkFirstPass()
@@ -850,4 +867,6 @@
private String _logName = null;
+ private List<SerializableXAResourceDeserializer> _seriablizableXAResourceDeserializers = new ArrayList<SerializableXAResourceDeserializer>();
+
}
Modified: labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/resources/arjunacore/XAResourceRecord.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/resources/arjunacore/XAResourceRecord.java 2011-12-08 15:14:36 UTC (rev 37786)
+++ labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/resources/arjunacore/XAResourceRecord.java 2011-12-08 16:17:15 UTC (rev 37787)
@@ -31,43 +31,47 @@
package com.arjuna.ats.internal.jta.resources.arjunacore;
-import com.arjuna.ats.internal.arjuna.common.ClassloadingUtility;
-import com.arjuna.ats.jta.recovery.*;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.NotSerializableException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Vector;
-import com.arjuna.ats.jta.common.jtaPropertyManager;
+import javax.transaction.xa.XAException;
+import javax.transaction.xa.XAResource;
+import javax.transaction.xa.Xid;
-import com.arjuna.ats.jta.xa.RecoverableXAConnection;
-import com.arjuna.ats.jta.xa.XidImple;
-import com.arjuna.ats.jta.utils.XAHelper;
-import com.arjuna.ats.jta.logging.*;
-import com.arjuna.ats.jta.resources.StartXAResource;
-import com.arjuna.ats.jta.resources.EndXAResource;
-
-import com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple;
-import com.arjuna.ats.internal.jta.xa.TxInfo;
-import com.arjuna.ats.internal.jta.resources.XAResourceErrorHandler;
-import com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule;
-
import com.arjuna.ats.arjuna.ObjectType;
+import com.arjuna.ats.arjuna.common.Uid;
import com.arjuna.ats.arjuna.coordinator.AbstractRecord;
+import com.arjuna.ats.arjuna.coordinator.RecordType;
import com.arjuna.ats.arjuna.coordinator.TwoPhaseOutcome;
-import com.arjuna.ats.arjuna.coordinator.RecordType;
import com.arjuna.ats.arjuna.coordinator.TxControl;
-import com.arjuna.ats.arjuna.common.*;
-import com.arjuna.ats.arjuna.state.*;
+import com.arjuna.ats.arjuna.recovery.RecoveryManager;
import com.arjuna.ats.arjuna.recovery.RecoveryModule;
-import com.arjuna.ats.arjuna.recovery.RecoveryManager;
+import com.arjuna.ats.arjuna.state.InputObjectState;
+import com.arjuna.ats.arjuna.state.OutputObjectState;
+import com.arjuna.ats.internal.arjuna.common.ClassloadingUtility;
+import com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule;
+import com.arjuna.ats.internal.jta.resources.XAResourceErrorHandler;
+import com.arjuna.ats.internal.jta.transaction.arjunacore.TransactionImple;
+import com.arjuna.ats.internal.jta.xa.TxInfo;
+import com.arjuna.ats.jta.common.jtaPropertyManager;
+import com.arjuna.ats.jta.logging.jtaLogger;
+import com.arjuna.ats.jta.recovery.SerializableXAResourceDeserializer;
+import com.arjuna.ats.jta.recovery.XARecoveryResource;
+import com.arjuna.ats.jta.resources.EndXAResource;
+import com.arjuna.ats.jta.resources.StartXAResource;
+import com.arjuna.ats.jta.utils.XAHelper;
+import com.arjuna.ats.jta.xa.RecoverableXAConnection;
+import com.arjuna.ats.jta.xa.XidImple;
-import java.util.Vector;
-import java.util.Enumeration;
-
-import java.io.*;
-
-import javax.transaction.xa.Xid;
-import javax.transaction.xa.XAResource;
-
-import javax.transaction.xa.XAException;
-
/**
* @author Mark Little (mark_little at hp.com)
* @version $Id: XAResourceRecord.java 2342 2006-03-30 13:06:17Z $
@@ -826,6 +830,8 @@
o.close();
os.packBoolean(true);
+ String name = _theXAResource.getClass().getName();
+ os.packString(name);
os.packBytes(s.toByteArray());
}
@@ -892,12 +898,29 @@
{
try
{
+ // Read the classname of the serialized XAResource
+ String className = os.unpackString();
+
byte[] b = os.unpackBytes();
ByteArrayInputStream s = new ByteArrayInputStream(b);
ObjectInputStream o = new ObjectInputStream(s);
+
+ // Give the list of deserializers a chance to deserialize the record
+ boolean deserialized = false;
+ Iterator<SerializableXAResourceDeserializer> iterator = seriablizableXAResourceDeserializers.iterator();
+ while (iterator.hasNext()) {
+ SerializableXAResourceDeserializer proxyXAResourceDeserializer = iterator.next();
+ if (proxyXAResourceDeserializer.canDeserialze(className)) {
+ _theXAResource = proxyXAResourceDeserializer.deserialze(o);
+ deserialized = true;
+ }
+ }
- _theXAResource = (XAResource) o.readObject();
+ // Give it a go ourselves
+ if (!deserialized) {
+ _theXAResource = (XAResource) o.readObject();
+ }
o.close();
if (jtaLogger.logger.isTraceEnabled()) {
@@ -1079,6 +1102,14 @@
_valid = true;
_theTransaction = null;
_recovered = true;
+
+ for (RecoveryModule recoveryModule : RecoveryManager.manager().getModules()) {
+ if (recoveryModule instanceof XARecoveryModule) {
+ XARecoveryModule xaRecoveryModule = (XARecoveryModule) recoveryModule;
+ seriablizableXAResourceDeserializers.addAll(xaRecoveryModule.getSeriablizableXAResourceDeserializers());
+ break;
+ }
+ }
}
public XAResourceRecord(Uid u)
@@ -1207,6 +1238,8 @@
private static boolean _rollbackOptimization = false;
private static boolean _assumedComplete = false;
+
+ private List<SerializableXAResourceDeserializer> seriablizableXAResourceDeserializers = new ArrayList<SerializableXAResourceDeserializer>();
static
{
Added: labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/classes/com/arjuna/ats/jta/recovery/SerializableXAResourceDeserializer.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/classes/com/arjuna/ats/jta/recovery/SerializableXAResourceDeserializer.java (rev 0)
+++ labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/classes/com/arjuna/ats/jta/recovery/SerializableXAResourceDeserializer.java 2011-12-08 16:17:15 UTC (rev 37787)
@@ -0,0 +1,61 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2009, Red Hat Middleware LLC, and individual contributors
+ * 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 com.arjuna.ats.jta.recovery;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+
+import javax.transaction.xa.XAResource;
+
+/**
+ * This is an additional recovery helper that allows clients of the transaction
+ * manager to provide a deserializer for their Serializable XAResources. We need
+ * this as otherwise the transaction manager may not be able to see the
+ * transports classes, for instance in an application server environment.
+ */
+public interface SerializableXAResourceDeserializer {
+
+ /**
+ * Can this {@link SerializableXAResourceDeserializer} handle the specified
+ * classname.
+ *
+ * @param className
+ * The name of the class to deserialize.
+ *
+ * @return A flag to indicate where the deserializer is aware of the
+ * Serializable XAResource.
+ */
+ public boolean canDeserialze(String className);
+
+ /**
+ * Deserialize the XAResource.
+ *
+ * @param ois
+ * The input stream to read from.
+ * @return An {@link XAResource}
+ * @throws IOException
+ * If the {@link ObjectInputStream.readObject()} fails.
+ * @throws ClassNotFoundException
+ * If the {@link ObjectInputStream.readObject()} fails.
+ */
+ public XAResource deserialze(ObjectInputStream ois) throws IOException, ClassNotFoundException;
+}
Modified: labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/classes/com/arjuna/ats/jbossatx/jta/RecoveryManagerService.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/classes/com/arjuna/ats/jbossatx/jta/RecoveryManagerService.java 2011-12-08 15:14:36 UTC (rev 37786)
+++ labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/classes/com/arjuna/ats/jbossatx/jta/RecoveryManagerService.java 2011-12-08 16:17:15 UTC (rev 37787)
@@ -20,18 +20,19 @@
*/
package com.arjuna.ats.jbossatx.jta;
+import java.util.Vector;
+
+import org.jboss.tm.XAResourceRecovery;
+import org.jboss.tm.XAResourceRecoveryRegistry;
+
import com.arjuna.ats.arjuna.recovery.RecoveryManager;
import com.arjuna.ats.arjuna.recovery.RecoveryModule;
+import com.arjuna.ats.internal.jbossatx.jta.XAResourceRecoveryHelperWrapper;
import com.arjuna.ats.internal.jta.recovery.arjunacore.XARecoveryModule;
-import com.arjuna.ats.internal.jbossatx.jta.XAResourceRecoveryHelperWrapper;
import com.arjuna.ats.jbossatx.logging.jbossatxLogger;
+import com.arjuna.ats.jta.recovery.SerializableXAResourceDeserializer;
import com.arjuna.common.util.ConfigurationInfo;
-import org.jboss.tm.XAResourceRecovery;
-import org.jboss.tm.XAResourceRecoveryRegistry;
-
-import java.util.Vector;
-
/**
* JBoss Transaction Recovery Service.
*
@@ -115,4 +116,22 @@
xaRecoveryModule.removeXAResourceRecoveryHelper(new XAResourceRecoveryHelperWrapper(xaResourceRecovery));
}
+
+ public void addSerializableXAResourceDeserializer(SerializableXAResourceDeserializer serializableXAResourceDeserializer) {
+
+ XARecoveryModule xaRecoveryModule = null;
+ for(RecoveryModule recoveryModule : ((Vector<RecoveryModule>)_recoveryManager.getModules())) {
+ if(recoveryModule instanceof XARecoveryModule) {
+ xaRecoveryModule = (XARecoveryModule)recoveryModule;
+ break;
+ }
+ }
+
+ if(xaRecoveryModule == null) {
+ throw new IllegalStateException(jbossatxLogger.i18NLogger.get_jta_RecoveryManagerService_norecoverymodule());
+ }
+
+ xaRecoveryModule.addSerializableXAResourceDeserializer(serializableXAResourceDeserializer);
+
+ }
}
Modified: labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/ExampleDistributedJTATestCase.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/ExampleDistributedJTATestCase.java 2011-12-08 15:14:36 UTC (rev 37786)
+++ labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/ExampleDistributedJTATestCase.java 2011-12-08 16:17:15 UTC (rev 37787)
@@ -121,10 +121,13 @@
// done within the scope of this classloader, this is to simulate a
// transports different address space
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
- IsolatableServersClassLoader classLoader = new IsolatableServersClassLoader("com.arjuna.jta.distributed.example.server", contextClassLoader);
+ IsolatableServersClassLoader classLoaderForTransactionManager = new IsolatableServersClassLoader(null, ExampleDistributedJTATestCase.class
+ .getPackage().getName(), contextClassLoader);
+ IsolatableServersClassLoader classLoader = new IsolatableServersClassLoader(ExampleDistributedJTATestCase.class.getPackage().getName(), null,
+ classLoaderForTransactionManager);
localServers[i] = (LocalServer) classLoader.loadClass("com.arjuna.jta.distributed.example.server.impl.ServerImpl").newInstance();
- Thread.currentThread().setContextClassLoader(localServers[i].getClass().getClassLoader());
- localServers[i].initialise(lookupProvider, serverNodeNames[i], serverPortOffsets[i], clusterBuddies[i]);
+ Thread.currentThread().setContextClassLoader(localServers[i].getClassLoader());
+ localServers[i].initialise(lookupProvider, serverNodeNames[i], serverPortOffsets[i], clusterBuddies[i], classLoaderForTransactionManager);
// This is a short cut, normally remote servers would not be the
// same as the local servers and would be a tranport layer
// abstraction
@@ -171,7 +174,7 @@
// Access to this local server must be done by its own classloader to
// ensure the servers remain separate
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
- Thread.currentThread().setContextClassLoader(originalServer.getClass().getClassLoader());
+ Thread.currentThread().setContextClassLoader(originalServer.getClassLoader());
// THIS SIMULATES NORMAL BUSINESS LOGIC IN BMT/CMT (interceptors?)
{
@@ -296,7 +299,7 @@
int index = (Integer.valueOf(currentServerName) / 1000) - 1;
LocalServer currentServer = localServers[index];
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
- Thread.currentThread().setContextClassLoader(currentServer.getClass().getClassLoader());
+ Thread.currentThread().setContextClassLoader(currentServer.getClassLoader());
// Check if this server has seen this transaction before - this is
// crucial to ensure that calling servers will only lay down a proxy if
Modified: labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/server/IsolatableServersClassLoader.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/server/IsolatableServersClassLoader.java 2011-12-08 15:14:36 UTC (rev 37786)
+++ labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/server/IsolatableServersClassLoader.java 2011-12-08 16:17:15 UTC (rev 37787)
@@ -36,10 +36,11 @@
* basically).
*/
public class IsolatableServersClassLoader extends ClassLoader {
-
private Map<String, Class<?>> clazzMap = new HashMap<String, Class<?>>();
private URLClassPath ucp;
private String ignoredPackage;
+ private String includedPackage;
+ private String otherIgnoredPackage;
/**
* Create the classloader.
@@ -53,9 +54,13 @@
* @throws NoSuchMethodException
* @throws MalformedURLException
*/
- public IsolatableServersClassLoader(String ignoredPackage, ClassLoader parent) throws SecurityException, NoSuchMethodException, MalformedURLException {
+
+ public IsolatableServersClassLoader(String includedPackage, String ignoredPackage, ClassLoader parent) throws SecurityException, NoSuchMethodException,
+ MalformedURLException {
super(parent);
- this.ignoredPackage = ignoredPackage;
+ this.includedPackage = includedPackage;
+ this.otherIgnoredPackage = ignoredPackage;
+ this.ignoredPackage = IsolatableServersClassLoader.class.getPackage().getName();
String property = System.getProperty("java.class.path");
String[] split = property.split(System.getProperty("path.separator"));
URL[] urls = new URL[split.length];
@@ -79,6 +84,9 @@
}
public Class<?> loadClass(String name) throws ClassNotFoundException {
+ if (!name.matches(ignoredPackage + ".[A-Za-z0-9]*") && otherIgnoredPackage != null && name.startsWith(otherIgnoredPackage)) {
+ throw new ClassNotFoundException(name);
+ }
Class<?> clazz = null;
if (clazzMap.containsKey(name)) {
clazz = clazzMap.get(name);
@@ -87,8 +95,9 @@
if (clazz != null) {
System.err.println("Already loaded: " + name);
} else {
- if (!name.startsWith("com.arjuna") || (ignoredPackage != null && name.matches(ignoredPackage + ".[A-Za-z0-9]*"))) {
- clazz = super.loadClass(name);
+ if (!name.startsWith("com.arjuna") || name.matches(ignoredPackage + ".[A-Za-z0-9]*")
+ || (includedPackage != null && !name.startsWith(includedPackage))) {
+ clazz = getParent().loadClass(name);
} else {
String path = name.replace('.', '/').concat(".class");
Modified: labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/server/LocalServer.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/server/LocalServer.java 2011-12-08 15:14:36 UTC (rev 37786)
+++ labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/server/LocalServer.java 2011-12-08 16:17:15 UTC (rev 37787)
@@ -46,8 +46,10 @@
* Initialize this server, this will create a transaction manager service
* and a recovery manager service.
*
- * @param lookupProvider
- * @param nodeName
+ * @param classLoaderForTransactionManager
+ * This is the classloader that the transaction manager would
+ * normally have access to.
+ *
* @throws CoreEnvironmentBeanException
* @throws IOException
* @throws SecurityException
@@ -55,8 +57,9 @@
* @throws IllegalArgumentException
* @throws IllegalAccessException
*/
- public void initialise(LookupProvider lookupProvider, String nodeName, int portOffset, String[] clusterCompatriots) throws CoreEnvironmentBeanException,
- IOException, SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException;
+ public void initialise(LookupProvider lookupProvider, String nodeName, int portOffset, String[] clusterCompatriots,
+ ClassLoader classLoaderForTransactionManager) throws CoreEnvironmentBeanException, IOException, SecurityException, NoSuchFieldException,
+ IllegalArgumentException, IllegalAccessException;
/**
* Get the local transaction managers node name.
@@ -163,4 +166,12 @@
* @return
*/
public RemoteServer connectTo();
+
+ /**
+ * This is used by the test to ensure that the servers classloader is set on
+ * a thread.
+ *
+ * @return
+ */
+ public ClassLoader getClassLoader();
}
Added: labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/server/impl/ProxyXAResourceDeserializer.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/server/impl/ProxyXAResourceDeserializer.java (rev 0)
+++ labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/server/impl/ProxyXAResourceDeserializer.java 2011-12-08 16:17:15 UTC (rev 37787)
@@ -0,0 +1,32 @@
+package com.arjuna.jta.distributed.example.server.impl;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+
+import javax.transaction.xa.XAResource;
+
+import com.arjuna.ats.jta.recovery.SerializableXAResourceDeserializer;
+
+/**
+ * This is an additional recovery helper that allows a transport to provide a
+ * deserializer for its ProxyXAResource. We need this as otherwise the
+ * transaction manager would not be able to see the transports classes. Check
+ * out the Javadocs on {@link SerializableXAResourceDeserializer}
+ */
+public class ProxyXAResourceDeserializer implements SerializableXAResourceDeserializer {
+
+ @Override
+ public boolean canDeserialze(String className) {
+ if (className.equals(ProxyXAResource.class.getName())) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public XAResource deserialze(ObjectInputStream ois) throws IOException, ClassNotFoundException {
+ return (XAResource) ois.readObject();
+ }
+
+}
Modified: labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/server/impl/ServerImpl.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/server/impl/ServerImpl.java 2011-12-08 15:14:36 UTC (rev 37786)
+++ labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/examples/classes/com/arjuna/jta/distributed/example/server/impl/ServerImpl.java 2011-12-08 16:17:15 UTC (rev 37787)
@@ -76,13 +76,18 @@
private TransactionManagerService transactionManagerService;
private Map<SubordinateXidImple, TransactionImple> rootTransactionsAsSubordinate = new HashMap<SubordinateXidImple, TransactionImple>();
private RecoveryManager _recoveryManager;
+ private ClassLoader classLoaderForTransactionManager;
/**
* This is typically done by the application server.
+ *
+ * The addition required for the distributed JTA code is:
+ * RecoveryManagerService::addSerializableXAResourceDeserializer()
*/
- public void initialise(LookupProvider lookupProvider, String nodeName, int portOffset, String[] clusterBuddies) throws CoreEnvironmentBeanException,
- IOException, SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
+ public void initialise(LookupProvider lookupProvider, String nodeName, int portOffset, String[] clusterBuddies, ClassLoader classLoaderForTransactionManager)
+ throws CoreEnvironmentBeanException, IOException, SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
this.nodeName = nodeName;
+ this.classLoaderForTransactionManager = classLoaderForTransactionManager;
RecoveryEnvironmentBean recoveryEnvironmentBean = com.arjuna.ats.arjuna.common.recoveryPropertyManager.getRecoveryEnvironmentBean();
recoveryEnvironmentBean.setRecoveryBackoffPeriod(1);
@@ -154,6 +159,7 @@
recoveryManagerService.create();
recoveryManagerService.addXAResourceRecovery(new ProxyXAResourceRecovery(nodeName, clusterBuddies));
recoveryManagerService.addXAResourceRecovery(new TestResourceRecovery(nodeName));
+ recoveryManagerService.addSerializableXAResourceDeserializer(new ProxyXAResourceDeserializer());
// recoveryManagerService.start();
_recoveryManager = RecoveryManager.manager();
@@ -168,6 +174,11 @@
}
@Override
+ public ClassLoader getClassLoader() {
+ return classLoaderForTransactionManager;
+ }
+
+ @Override
public RemoteServer connectTo() {
return new RemoteServerImpl();
}
Modified: labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/SimpleIsolatedServers.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/SimpleIsolatedServers.java 2011-12-08 15:14:36 UTC (rev 37786)
+++ labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/SimpleIsolatedServers.java 2011-12-08 16:17:15 UTC (rev 37787)
@@ -25,7 +25,6 @@
import static org.junit.Assert.fail;
import java.io.IOException;
-import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Iterator;
@@ -80,7 +79,7 @@
public static void tearDown() throws Exception {
for (int i = 0; i < localServers.length; i++) {
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
- Thread.currentThread().setContextClassLoader(localServers[i].getClass().getClassLoader());
+ Thread.currentThread().setContextClassLoader(localServers[i].getClassLoader());
localServers[i].shutdown();
Thread.currentThread().setContextClassLoader(contextClassLoader);
}
@@ -91,7 +90,7 @@
for (int i = 0; i < localServers.length; i++) {
if (localServers[i].getNodeName().equals(serverName)) {
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
- Thread.currentThread().setContextClassLoader(localServers[i].getClass().getClassLoader());
+ Thread.currentThread().setContextClassLoader(localServers[i].getClassLoader());
localServers[i].shutdown();
Thread.currentThread().setContextClassLoader(contextClassLoader);
@@ -102,12 +101,17 @@
}
- private static void boot(int index) throws SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException, ClassNotFoundException, IllegalArgumentException, CoreEnvironmentBeanException, IOException, NoSuchFieldException {
+ private static void boot(int index) throws SecurityException, NoSuchMethodException, InstantiationException, IllegalAccessException,
+ ClassNotFoundException, IllegalArgumentException, CoreEnvironmentBeanException, IOException, NoSuchFieldException {
ClassLoader contextClassLoader = Thread.currentThread().getContextClassLoader();
- IsolatableServersClassLoader classLoader = new IsolatableServersClassLoader("com.arjuna.ats.jta.distributed.server", contextClassLoader);
+ IsolatableServersClassLoader classLoaderForTransactionManager = new IsolatableServersClassLoader(null, SimpleIsolatedServers.class.getPackage()
+ .getName(), contextClassLoader);
+ IsolatableServersClassLoader classLoader = new IsolatableServersClassLoader(SimpleIsolatedServers.class.getPackage().getName(), null,
+ classLoaderForTransactionManager);
localServers[index] = (LocalServer) classLoader.loadClass("com.arjuna.ats.jta.distributed.server.impl.ServerImpl").newInstance();
- Thread.currentThread().setContextClassLoader(localServers[index].getClass().getClassLoader());
- localServers[index].initialise(lookupProvider, serverNodeNames[index], serverPortOffsets[index], clusterBuddies[index]);
+ Thread.currentThread().setContextClassLoader(localServers[index].getClassLoader());
+ localServers[index].initialise(lookupProvider, serverNodeNames[index], serverPortOffsets[index], clusterBuddies[index],
+ classLoaderForTransactionManager);
lookupProvider.bind(index, localServers[index].connectTo());
Thread.currentThread().setContextClassLoader(contextClassLoader);
}
@@ -139,7 +143,7 @@
try {
LocalServer originalServer = getLocalServer("1000");
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
- Thread.currentThread().setContextClassLoader(originalServer.getClass().getClassLoader());
+ Thread.currentThread().setContextClassLoader(originalServer.getClassLoader());
TransactionManager transactionManager = originalServer.getTransactionManager();
transactionManager.setTransactionTimeout(startingTimeout);
transactionManager.begin();
@@ -187,7 +191,7 @@
try {
LocalServer originalServer = getLocalServer("2000");
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
- Thread.currentThread().setContextClassLoader(originalServer.getClass().getClassLoader());
+ Thread.currentThread().setContextClassLoader(originalServer.getClassLoader());
TransactionManager transactionManager = originalServer.getTransactionManager();
transactionManager.setTransactionTimeout(startingTimeout);
transactionManager.begin();
@@ -278,7 +282,7 @@
try {
LocalServer originalServer = getLocalServer("1000");
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
- Thread.currentThread().setContextClassLoader(originalServer.getClass().getClassLoader());
+ Thread.currentThread().setContextClassLoader(originalServer.getClassLoader());
TransactionManager transactionManager = originalServer.getTransactionManager();
transactionManager.setTransactionTimeout(startingTimeout);
transactionManager.begin();
@@ -361,7 +365,7 @@
try {
LocalServer originalServer = getLocalServer("1000");
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
- Thread.currentThread().setContextClassLoader(originalServer.getClass().getClassLoader());
+ Thread.currentThread().setContextClassLoader(originalServer.getClassLoader());
TransactionManager transactionManager = originalServer.getTransactionManager();
transactionManager.setTransactionTimeout(startingTimeout);
transactionManager.begin();
@@ -444,7 +448,7 @@
try {
LocalServer originalServer = getLocalServer("1000");
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
- Thread.currentThread().setContextClassLoader(originalServer.getClass().getClassLoader());
+ Thread.currentThread().setContextClassLoader(originalServer.getClassLoader());
TransactionManager transactionManager = originalServer.getTransactionManager();
transactionManager.setTransactionTimeout(startingTimeout);
transactionManager.begin();
@@ -532,7 +536,7 @@
try {
LocalServer originalServer = getLocalServer("1000");
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
- Thread.currentThread().setContextClassLoader(originalServer.getClass().getClassLoader());
+ Thread.currentThread().setContextClassLoader(originalServer.getClassLoader());
TransactionManager transactionManager = originalServer.getTransactionManager();
transactionManager.setTransactionTimeout(startingTimeout);
transactionManager.begin();
@@ -648,7 +652,7 @@
setup();
LocalServer originalServer = getLocalServer("1000");
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
- Thread.currentThread().setContextClassLoader(originalServer.getClass().getClassLoader());
+ Thread.currentThread().setContextClassLoader(originalServer.getClassLoader());
TransactionManager transactionManager = originalServer.getTransactionManager();
transactionManager.setTransactionTimeout(0);
transactionManager.begin();
@@ -679,7 +683,7 @@
setup();
LocalServer originalServer = getLocalServer("1000");
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
- Thread.currentThread().setContextClassLoader(originalServer.getClass().getClassLoader());
+ Thread.currentThread().setContextClassLoader(originalServer.getClassLoader());
TransactionManager transactionManager = originalServer.getTransactionManager();
transactionManager.setTransactionTimeout(0);
transactionManager.begin();
@@ -766,7 +770,7 @@
int subordinateTimeout = 1;
LocalServer originalServer = getLocalServer("1000");
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
- Thread.currentThread().setContextClassLoader(originalServer.getClass().getClassLoader());
+ Thread.currentThread().setContextClassLoader(originalServer.getClassLoader());
TransactionManager transactionManager = originalServer.getTransactionManager();
transactionManager.setTransactionTimeout(rootTimeout);
transactionManager.begin();
@@ -779,7 +783,7 @@
// Migrate a transaction
LocalServer currentServer = getLocalServer("2000");
ClassLoader parentsClassLoader = Thread.currentThread().getContextClassLoader();
- Thread.currentThread().setContextClassLoader(currentServer.getClass().getClassLoader());
+ Thread.currentThread().setContextClassLoader(currentServer.getClassLoader());
Xid migratedXid = currentServer.locateOrImportTransactionThenResumeIt(subordinateTimeout, currentXid);
currentServer.getTransactionManager().getTransaction().enlistResource(new TestResource(currentServer.getNodeName(), false));
currentServer.getTransactionManager().suspend();
@@ -811,7 +815,7 @@
int rootTimeout = 5;
LocalServer originalServer = getLocalServer("1000");
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
- Thread.currentThread().setContextClassLoader(originalServer.getClass().getClassLoader());
+ Thread.currentThread().setContextClassLoader(originalServer.getClassLoader());
TransactionManager transactionManager = originalServer.getTransactionManager();
transactionManager.setTransactionTimeout(rootTimeout);
transactionManager.begin();
@@ -825,7 +829,7 @@
// Migrate a transaction
LocalServer currentServer = getLocalServer("2000");
ClassLoader parentsClassLoader = Thread.currentThread().getContextClassLoader();
- Thread.currentThread().setContextClassLoader(currentServer.getClass().getClassLoader());
+ Thread.currentThread().setContextClassLoader(currentServer.getClassLoader());
Xid migratedXid = currentServer.locateOrImportTransactionThenResumeIt(subordinateTimeout, currentXid);
currentServer.getTransactionManager().getTransaction().enlistResource(new TestResource(currentServer.getNodeName(), false));
currentServer.getTransactionManager().suspend();
@@ -863,7 +867,7 @@
String startingServer = nodesToFlowTo.get(0);
LocalServer originalServer = getLocalServer(startingServer);
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
- Thread.currentThread().setContextClassLoader(originalServer.getClass().getClassLoader());
+ Thread.currentThread().setContextClassLoader(originalServer.getClassLoader());
TransactionManager transactionManager = originalServer.getTransactionManager();
transactionManager.setTransactionTimeout(startingTimeout);
transactionManager.begin();
@@ -919,7 +923,7 @@
System.out.println("Flowed to " + currentServerName);
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
- Thread.currentThread().setContextClassLoader(currentServer.getClass().getClassLoader());
+ Thread.currentThread().setContextClassLoader(currentServer.getClassLoader());
Xid requiresProxyAtPreviousServer = currentServer.locateOrImportTransactionThenResumeIt(remainingTimeout, toMigrate);
Modified: labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/IsolatableServersClassLoader.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/IsolatableServersClassLoader.java 2011-12-08 15:14:36 UTC (rev 37786)
+++ labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/IsolatableServersClassLoader.java 2011-12-08 16:17:15 UTC (rev 37787)
@@ -35,10 +35,15 @@
private Map<String, Class<?>> clazzMap = new HashMap<String, Class<?>>();
private URLClassPath ucp;
private String ignoredPackage;
+ private String includedPackage;
+ private String otherIgnoredPackage;
- public IsolatableServersClassLoader(String ignoredPackage, ClassLoader parent) throws SecurityException, NoSuchMethodException, MalformedURLException {
+ public IsolatableServersClassLoader(String includedPackage, String ignoredPackage, ClassLoader parent) throws SecurityException, NoSuchMethodException,
+ MalformedURLException {
super(parent);
- this.ignoredPackage = ignoredPackage;
+ this.includedPackage = includedPackage;
+ this.otherIgnoredPackage = ignoredPackage;
+ this.ignoredPackage = IsolatableServersClassLoader.class.getPackage().getName();
String property = System.getProperty("java.class.path");
String[] split = property.split(System.getProperty("path.separator"));
URL[] urls = new URL[split.length];
@@ -62,6 +67,9 @@
}
public Class<?> loadClass(String name) throws ClassNotFoundException {
+ if (!name.matches(ignoredPackage + ".[A-Za-z0-9]*") && otherIgnoredPackage != null && name.startsWith(otherIgnoredPackage)) {
+ throw new ClassNotFoundException(name);
+ }
Class<?> clazz = null;
if (clazzMap.containsKey(name)) {
clazz = clazzMap.get(name);
@@ -70,8 +78,9 @@
if (clazz != null) {
System.err.println("Already loaded: " + name);
} else {
- if (!name.startsWith("com.arjuna") || (ignoredPackage != null && name.matches(ignoredPackage + ".[A-Za-z0-9]*"))) {
- clazz = super.loadClass(name);
+ if (!name.startsWith("com.arjuna") || name.matches(ignoredPackage + ".[A-Za-z0-9]*")
+ || (includedPackage != null && !name.startsWith(includedPackage))) {
+ clazz = getParent().loadClass(name);
} else {
String path = name.replace('.', '/').concat(".class");
Modified: labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/LocalServer.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/LocalServer.java 2011-12-08 15:14:36 UTC (rev 37786)
+++ labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/LocalServer.java 2011-12-08 16:17:15 UTC (rev 37787)
@@ -37,9 +37,11 @@
public interface LocalServer {
- public void initialise(LookupProvider lookupProvider, String nodeName, int portOffset, String[] clusterBuddies) throws CoreEnvironmentBeanException,
- IOException, SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException;
+ public void initialise(LookupProvider lookupProvider, String nodeName, int portOffset, String[] clusterBuddies, ClassLoader classLoaderForTransactionManager)
+ throws CoreEnvironmentBeanException, IOException, SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException;
+ public ClassLoader getClassLoader();
+
public String getNodeName();
public TransactionManager getTransactionManager() throws NotSupportedException, SystemException;
Added: labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxyXAResourceDeserializer.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxyXAResourceDeserializer.java (rev 0)
+++ labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ProxyXAResourceDeserializer.java 2011-12-08 16:17:15 UTC (rev 37787)
@@ -0,0 +1,26 @@
+package com.arjuna.ats.jta.distributed.server.impl;
+
+import java.io.IOException;
+import java.io.ObjectInputStream;
+
+import javax.transaction.xa.XAResource;
+
+import com.arjuna.ats.jta.recovery.SerializableXAResourceDeserializer;
+
+public class ProxyXAResourceDeserializer implements SerializableXAResourceDeserializer {
+
+ @Override
+ public boolean canDeserialze(String className) {
+ if (className.equals(ProxyXAResource.class.getName())) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ @Override
+ public XAResource deserialze(ObjectInputStream ois) throws IOException, ClassNotFoundException {
+ return (XAResource) ois.readObject();
+ }
+
+}
Modified: labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ServerImpl.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ServerImpl.java 2011-12-08 15:14:36 UTC (rev 37786)
+++ labs/jbosstm/branches/JBOSSTS_4_16/atsintegration/tests/classes/com/arjuna/ats/jta/distributed/server/impl/ServerImpl.java 2011-12-08 16:17:15 UTC (rev 37787)
@@ -69,10 +69,12 @@
private TransactionManagerService transactionManagerService;
private Map<SubordinateXidImple, TransactionImple> rootTransactionsAsSubordinate = new HashMap<SubordinateXidImple, TransactionImple>();
private RecoveryManager _recoveryManager;
+ private ClassLoader classLoaderForTransactionManager;
- public void initialise(LookupProvider lookupProvider, String nodeName, int portOffset, String[] clusterBuddies) throws CoreEnvironmentBeanException,
- IOException, SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
+ public void initialise(LookupProvider lookupProvider, String nodeName, int portOffset, String[] clusterBuddies, ClassLoader classLoaderForTransactionManager)
+ throws CoreEnvironmentBeanException, IOException, SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
this.nodeName = nodeName;
+ this.classLoaderForTransactionManager = classLoaderForTransactionManager;
RecoveryEnvironmentBean recoveryEnvironmentBean = com.arjuna.ats.arjuna.common.recoveryPropertyManager.getRecoveryEnvironmentBean();
recoveryEnvironmentBean.setRecoveryBackoffPeriod(1);
@@ -144,6 +146,7 @@
recoveryManagerService.create();
recoveryManagerService.addXAResourceRecovery(new ProxyXAResourceRecovery(nodeName, clusterBuddies));
recoveryManagerService.addXAResourceRecovery(new TestResourceRecovery(nodeName));
+ recoveryManagerService.addSerializableXAResourceDeserializer(new ProxyXAResourceDeserializer());
// recoveryManagerService.start();
_recoveryManager = RecoveryManager.manager();
@@ -158,6 +161,11 @@
}
@Override
+ public ClassLoader getClassLoader() {
+ return classLoaderForTransactionManager;
+ }
+
+ @Override
public void shutdown() throws Exception {
recoveryManagerService.stop();
TransactionReaper.transactionReaper().terminate(false);
@@ -166,8 +174,7 @@
@Override
public void doRecoveryManagerScan(boolean hackSafetyInterval) {
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
- ClassLoader serversClassLoader = this.getClass().getClassLoader();
- Thread.currentThread().setContextClassLoader(serversClassLoader);
+ Thread.currentThread().setContextClassLoader(getClassLoader());
int originalSafetyInterval = -1;
if (hackSafetyInterval) {
More information about the jboss-svn-commits
mailing list