[jboss-svn-commits] JBL Code SVN: r37818 - in labs/jbosstm/branches/JBOSSTS_4_16: ArjunaJTA and 2 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Fri Dec 16 11:27:53 EST 2011


Author: mmusgrov
Date: 2011-12-16 11:27:53 -0500 (Fri, 16 Dec 2011)
New Revision: 37818

Modified:
   labs/jbosstm/branches/JBOSSTS_4_16/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/tools/osb/mbean/ObjStoreBrowser.java
   labs/jbosstm/branches/JBOSSTS_4_16/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/tools/osb/mbean/ObjStoreBrowserMBean.java
   labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/INSTALL
   labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/subordinate/jca/SubordinateAtomicAction.java
   labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTS/INSTALL
Log:
JBTM-1000 Add an MBean operation to enable viewing of Subordinate Atomic Actions

Modified: labs/jbosstm/branches/JBOSSTS_4_16/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/tools/osb/mbean/ObjStoreBrowser.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/tools/osb/mbean/ObjStoreBrowser.java	2011-12-16 13:22:23 UTC (rev 37817)
+++ labs/jbosstm/branches/JBOSSTS_4_16/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/tools/osb/mbean/ObjStoreBrowser.java	2011-12-16 16:27:53 UTC (rev 37818)
@@ -20,44 +20,46 @@
  */
 public class ObjStoreBrowser implements ObjStoreBrowserMBean {
     public static final String OBJ_STORE_BROWSER_HANDLERS = "com.arjuna.ats.arjuna.tools.osb.mbean.ObjStoreBrowserHandlers";
-	private static final String STORE_MBEAN_NAME = "jboss.jta:type=ObjectStore";
+    private static final String STORE_MBEAN_NAME = "jboss.jta:type=ObjectStore";
 
     // defines a (default) map of object store types to the corresponding MBean for instrumentation.
     // The format is OSType1=BeanType1,OSType2=BeanType2,etc
     // Can be over-ridden by setting a system property called com.arjuna.ats.arjuna.tools.osb.mbean.ObjStoreBrowserHandlers
+    private static final String saaStateType = "com.arjuna.ats.internal.jta.transaction.arjunacore.subordinate.jca.SubordinateAtomicAction";
+    private static final String saaBeanType = "com.arjuna.ats.internal.jta.tools.osb.mbean.jta.SubordinateActionBean";
     private static final String defaultStateHandlers =
             "com.arjuna.ats.arjuna.AtomicAction=com.arjuna.ats.internal.jta.tools.osb.mbean.jta.JTAActionBean"
 //            + ",com.arjuna.ats.internal.jta.transaction.arjunacore.subordinate.jca.SubordinateAtomicAction=com.arjuna.ats.internal.jta.tools.osb.mbean.jta.SubordinateActionBean"
-            + ",com.arjuna.ats.internal.jta.tools.osb.mbean.jts.ArjunaTransactionImpleWrapper=com.arjuna.ats.arjuna.tools.osb.mbean.ActionBean";
+                    + ",com.arjuna.ats.internal.jta.tools.osb.mbean.jts.ArjunaTransactionImpleWrapper=com.arjuna.ats.arjuna.tools.osb.mbean.ActionBean";
 
     private Map<String, String> stateTypes = null; // defines which object store types will be instrumented
     private Map<String, String> beanTypes = null;  // defines which bean types are used to represent object store types
-	private Map<String, List<UidWrapper>> allUids;
+    private Map<String, List<UidWrapper>> allUids;
 
     /**
      * Initialise the MBean
      */
-	public void start()
-	{
-		JMXServer.getAgent().registerMBean(STORE_MBEAN_NAME, this);
-	}
+    public void start()
+    {
+        JMXServer.getAgent().registerMBean(STORE_MBEAN_NAME, this);
+    }
 
     /**
      * Unregister all MBeans representing objects in the ObjectStore
      * represented by this MBean
      */
-	public void stop()
-	{
-		for (List<UidWrapper> uids : allUids.values()) {
-			for (Iterator<UidWrapper> i = uids.iterator(); i.hasNext(); ) {
-				UidWrapper w = i.next();
-				i.remove();
-				w.unregister();
-			}
-		}
+    public void stop()
+    {
+        for (List<UidWrapper> uids : allUids.values()) {
+            for (Iterator<UidWrapper> i = uids.iterator(); i.hasNext(); ) {
+                UidWrapper w = i.next();
+                i.remove();
+                w.unregister();
+            }
+        }
 
-		JMXServer.getAgent().unregisterMBean(STORE_MBEAN_NAME);
-	}
+        JMXServer.getAgent().unregisterMBean(STORE_MBEAN_NAME);
+    }
 
     /**
      * This method is deprecated in favour of @setType
@@ -69,8 +71,8 @@
      * as MBeans
      */
     @Deprecated
-	public void setTypes(Map<String, String> types) {
-	}
+    public void setTypes(Map<String, String> types) {
+    }
 
     /**
      * Tell the browser which beans to use for particular Object Store Action type
@@ -114,39 +116,39 @@
         }
     }
 
-	private void init(String logDir) {
-		if (logDir != null)
-			arjPropertyManager.getObjectStoreEnvironmentBean().setObjectStoreDir(logDir);
+    private void init(String logDir) {
+        if (logDir != null)
+            arjPropertyManager.getObjectStoreEnvironmentBean().setObjectStoreDir(logDir);
 
-		if (tsLogger.logger.isTraceEnabled())
-			tsLogger.logger.trace("ObjectStoreDir: " + arjPropertyManager.getObjectStoreEnvironmentBean().getObjectStoreDir());
+        if (tsLogger.logger.isTraceEnabled())
+            tsLogger.logger.trace("ObjectStoreDir: " + arjPropertyManager.getObjectStoreEnvironmentBean().getObjectStoreDir());
 
-		allUids = new HashMap<String, List<UidWrapper>> ();
+        allUids = new HashMap<String, List<UidWrapper>> ();
         stateTypes = new HashMap<String, String>();
         beanTypes = new HashMap<String, String>();
 
         initTypeHandlers(defaultStateHandlers);
         initTypeHandlers(System.getProperty(OBJ_STORE_BROWSER_HANDLERS, ""));
-	}
+    }
 
-	public ObjStoreBrowser() {
-		init(null);
-	}
+    public ObjStoreBrowser() {
+        init(null);
+    }
 
-	public ObjStoreBrowser(String logDir) {
-		init(logDir);
-	}
+    public ObjStoreBrowser(String logDir) {
+        init(logDir);
+    }
 
-	public StringBuilder dump(StringBuilder sb) {
-		for (Map.Entry<String, List<UidWrapper>> typeEntry : allUids.entrySet()) {
-			sb.append(typeEntry.getKey()).append('\n');
+    public StringBuilder dump(StringBuilder sb) {
+        for (Map.Entry<String, List<UidWrapper>> typeEntry : allUids.entrySet()) {
+            sb.append(typeEntry.getKey()).append('\n');
 
-			for (UidWrapper uid : typeEntry.getValue())
-				uid.toString("\t", sb);
-		}
+            for (UidWrapper uid : typeEntry.getValue())
+                uid.toString("\t", sb);
+        }
 
-		return sb;
-	}
+        return sb;
+    }
 
     /**
      * See if the given uid has previously been registered as an MBean
@@ -154,19 +156,19 @@
      * @return the MBean wrapper corresponding to the requested Uid (or null
      * if it hasn't been registered)
      */
-	public UidWrapper findUid(Uid uid) {
-		return findUid(uid.stringForm());
-	}
+    public UidWrapper findUid(Uid uid) {
+        return findUid(uid.stringForm());
+    }
 
-	public UidWrapper findUid(String uid) {
-		for (Map.Entry<String, List<UidWrapper>> typeEntry : allUids.entrySet())
-			for (UidWrapper w : typeEntry.getValue())
-				if (w.getUid().stringForm().equals(uid))
-					return w;
+    public UidWrapper findUid(String uid) {
+        for (Map.Entry<String, List<UidWrapper>> typeEntry : allUids.entrySet())
+            for (UidWrapper w : typeEntry.getValue())
+                if (w.getUid().stringForm().equals(uid))
+                    return w;
 
-		return null;
-	}
-;
+        return null;
+    }
+    ;
     private String getOSType(String classType) {
         try {
             Class cls = Class.forName(classType);
@@ -184,39 +186,66 @@
      * See if any new MBeans need to be registered or if any existing MBeans no longer exist
      * as ObjectStore entries.
      */
-	public void probe() {
-		InputObjectState types = new InputObjectState();
+    public void probe() {
+        InputObjectState types = new InputObjectState();
 
-		try {
-			if (StoreManager.getRecoveryStore().allTypes(types)) {
-				String tname;
+        try {
+            if (StoreManager.getRecoveryStore().allTypes(types)) {
+                String tname;
 
-				do {
-					try {
-						tname = types.unpackString();
+                do {
+                    try {
+                        tname = types.unpackString();
 
-						if (tname.length() != 0) {
-							List<UidWrapper> uids = allUids.get(tname);
+                        if (tname.length() != 0) {
+                            List<UidWrapper> uids = allUids.get(tname);
 
-							if (uids == null) {
-								uids = new ArrayList<UidWrapper> ();
-								allUids.put(tname, uids);
-							}
+                            if (uids == null) {
+                                uids = new ArrayList<UidWrapper> ();
+                                allUids.put(tname, uids);
+                            }
 
                             if (beanTypes.containsKey(tname))
-								updateMBeans(uids, System.currentTimeMillis(), true, tname);
-						}
-					} catch (IOException e1) {
-						tname = "";
-					}
-				} while (tname.length() != 0);
-			}
-		} catch (ObjectStoreException e2) {
-			if (tsLogger.logger.isTraceEnabled())
-				tsLogger.logger.trace(e2.toString());
-		}
-	}
+                                updateMBeans(uids, System.currentTimeMillis(), true, tname);
+                        }
+                    } catch (IOException e1) {
+                        tname = "";
+                    }
+                } while (tname.length() != 0);
+            }
+        } catch (ObjectStoreException e2) {
+            if (tsLogger.logger.isTraceEnabled())
+                tsLogger.logger.trace(e2.toString());
+        }
+    }
 
+    public void viewSubordinateAtomicActions(boolean enable) {
+        if (enable) {
+            setType(saaStateType, saaBeanType);
+        } else {
+            String typeName = getOSType(saaStateType);
+
+            if (typeName != null) {
+
+                if (typeName.startsWith("/"))
+                    typeName = typeName.substring(1);
+
+                stateTypes.remove(typeName);
+                beanTypes.remove(typeName);
+
+                for (List<UidWrapper> uids : allUids.values()) {
+                    for (Iterator<UidWrapper> i = uids.iterator(); i.hasNext(); ) {
+                        UidWrapper w = i.next();
+                        if (saaStateType.equals(w.getClassName())) {
+                            i.remove();
+                            w.unregister();
+                        }
+                    }
+                }
+            }
+        }
+    }
+
     /**
      * Register new MBeans of the requested type (or unregister ones whose
      * corresponding ObjectStore entry has been removed)
@@ -225,48 +254,48 @@
      * the request type
      * @return the list of MBeans representing the requested ObjectStore type
      */
-	public List<UidWrapper> probe(String type, String beantype) {
-		if (!allUids.containsKey(type))
-			return null;
+    public List<UidWrapper> probe(String type, String beantype) {
+        if (!allUids.containsKey(type))
+            return null;
 
-		List<UidWrapper> uids = allUids.get(type);
+        List<UidWrapper> uids = allUids.get(type);
 
-		updateMBeans(uids, System.currentTimeMillis(), false, type);
+        updateMBeans(uids, System.currentTimeMillis(), false, type);
 
-		return uids;
-	}
+        return uids;
+    }
 
-	private void updateMBeans(List<UidWrapper> uids, long tstamp, boolean register, String type) {
-		ObjectStoreIterator iter = new ObjectStoreIterator(StoreManager.getRecoveryStore(), type);
+    private void updateMBeans(List<UidWrapper> uids, long tstamp, boolean register, String type) {
+        ObjectStoreIterator iter = new ObjectStoreIterator(StoreManager.getRecoveryStore(), type);
 
-		while (true) {
-			Uid u = iter.iterate();
-			if (u == null || Uid.nullUid().equals(u))
-				break;
+        while (true) {
+            Uid u = iter.iterate();
+            if (u == null || Uid.nullUid().equals(u))
+                break;
 
 
-			UidWrapper w = new UidWrapper(this, beanTypes.get(type), type, stateTypes.get(type), u);
-			int i = uids.indexOf(w);
+            UidWrapper w = new UidWrapper(this, beanTypes.get(type), type, stateTypes.get(type), u);
+            int i = uids.indexOf(w);
 
-			if (i == -1) {
-				w.setTimestamp(tstamp);
-				uids.add(w);
-				w.createMBean();
-				if (register)
-					w.register();
-			} else {
-				uids.get(i).setTimestamp(tstamp);
-			}
-		}
+            if (i == -1) {
+                w.setTimestamp(tstamp);
+                uids.add(w);
+                w.createMBean();
+                if (register)
+                    w.register();
+            } else {
+                uids.get(i).setTimestamp(tstamp);
+            }
+        }
 
-		for (Iterator<UidWrapper> i = uids.iterator(); i.hasNext(); ) {
-			UidWrapper w = i.next();
+        for (Iterator<UidWrapper> i = uids.iterator(); i.hasNext(); ) {
+            UidWrapper w = i.next();
 
-			if (w.getTimestamp() != tstamp) {
-				if (register)
-					w.unregister();
-				i.remove();
-			}
-		}
-	}
+            if (w.getTimestamp() != tstamp) {
+                if (register)
+                    w.unregister();
+                i.remove();
+            }
+        }
+    }
 }

Modified: labs/jbosstm/branches/JBOSSTS_4_16/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/tools/osb/mbean/ObjStoreBrowserMBean.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/tools/osb/mbean/ObjStoreBrowserMBean.java	2011-12-16 13:22:23 UTC (rev 37817)
+++ labs/jbosstm/branches/JBOSSTS_4_16/ArjunaCore/arjuna/classes/com/arjuna/ats/arjuna/tools/osb/mbean/ObjStoreBrowserMBean.java	2011-12-16 16:27:53 UTC (rev 37818)
@@ -7,4 +7,7 @@
 public interface ObjStoreBrowserMBean extends ObjStoreItemMBean {
 	@MXBeanPropertyDescription("See if any new transactions have been created or completed")
 	void probe();
+	@MXBeanPropertyDescription("Enable/disable viewing of Subordinate Atomic Actions (afterwards use the probe operation to rescan the store):"
+            + " WARNING THIS OPERATION WILL TRIGGER A RECOVERY ATTEMPT (recovery is normally performed by the Recovery Manager). Use the text \"true\" to enable")
+	void viewSubordinateAtomicActions(boolean enable);
 }

Modified: labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/INSTALL
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/INSTALL	2011-12-16 13:22:23 UTC (rev 37817)
+++ labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/INSTALL	2011-12-16 16:27:53 UTC (rev 37818)
@@ -10,12 +10,14 @@
 JMX Instrumentation
 -------------------
 
-With this release it is now possible to monitor the transaction Object
-Store using JMX. Monitoring the Object Store is useful for trouble
+It is possible to monitor the transaction Object Store using JMX.
+Monitoring the Object Store is useful for trouble
 shooting problems that occur when transactions are committed (it does
 not expose transactions prior to commit). The JMX instrumentation
-(of the ObjectStore) is a new feature and is not necessarily suitable
-for monitoring production systems.
+(of the ObjectStore) is a not fully integrated with the AS console and
+is therefore not necessarily suitable for monitoring production systems
+but can provide useful diagnostic information that is otherwise not
+available.
 
 In any compliant JMX browser (such as jconsole) there should appear an
 MBean with the name
@@ -24,29 +26,53 @@
 for other MBeans (for example in a JMX client such as jconsole the MBeans
 will be displayed in the form of a tree control). The various MBeans
 corresponding to this ObjectStore will have names prefixed by this
-'top level' MBean.
+'top level' MBean. The bean has two operations:
 
-Simply instantiate an object of type com.hp.mwtests.ts.arjuna.tools.ObjStoreBrowser
-and initialise it with a valid set of types for handling ObjectStore records. These types
-can be set using a setTypes() method via a properties file on the classpath.
+probe - searches for Object Store records and creates corresponding MBeans
+	or unregisters any beans that no longer have a corresponding record;
+viewSubordinateAtomicActions - toggles the ability to view Subordinate Atomic Actions.
+        Set the boolean parameter to the text "true"/"false" to enable/disable viewing
+        of these record types.
+        WARNING: Viewing a Subordinate Atomic Action will trigger a recovery scan
+	independently of the Transaction Recovery Service so please use with care
+	(for example if you know that the distributed transaction is not recovering
+	automatically).
+
+Each MBean corresponding to an transaction contains an operation for removing the
+record from the object store. After this operation the system will no longer have
+any knowledge of the transaction.
+
+Transactions contain participants such datasources. These have MBean representations in
+the JMX viewer. It sometimes happens that a particpant made a different transaction
+completion decision from the one the Transaction Manager expected - such a state is
+called a heuristic. Heuristics will never be completed automatically so the MBean
+contains an operation (called clearHeuristic) for moving the participant back into
+the "prepared" state. Once back in the prepared state the Recovery system will
+attempt to replay completion.
+
+[For embedded use simply instantiate an object of type
+com.hp.mwtests.ts.arjuna.tools.ObjStoreBrowser.
+If the default set of types is not adequate other types for handling ObjectStore records
+can be added either by setting a System property called
+ObjStoreBrowser.OBJ_STORE_BROWSER_HANDLERS or by calling the method setType() on the
+ObjStoreBrowser object.]
+
 Please refer to the unit tests in the src distribution for more details.
 
 Tools Deployment
 ----------------
 
-Transaction management is integrated into the admin console in the form of a JOPR plugin
-which is located in the install bin directory (jbossts-jopr-plugin.jar). Install it by copying
-to the admin console plugin directory ($JBOSS_HOME/common/deploy/admin-console.war/plugins).
-
 There is also a transaction statistics graphing tool which can run standalone or inside a
-jconsole tab (jconsole, a tool for managing JVMs, is distributed with the reference JDK):
+jconsole tab (jconsole, a tool for managing JVMs, is distributed with the reference JDK).
+Various transaction statistics are graphed in real time with each graph updated during each
+poll interval (4 seconds unless the interval is overridden on the jconsole command line).
 
-The tool depends on the JFree graphing library. Download and upack orson from http://www.jfree.org/orson
-Set the env variable ORSON_HOME to the directory where you plan to unpack the downloaded zip.
+The tool depends on the JFree graphing library. Download and upack Orson from http://www.jfree.org/orson
+and set the env variable ORSON_HOME to the directory where you plan to unpack the downloaded zip.
 If you intend to use the tool with jconsole you will also need to put the JDK tools and jconsole jars on
 the classpath:
 
-export CLASSPATH="$JDK_HOME/lib/tools.jar:$JDK_HOME/lib/jconsole.jar:$ORSON_HOME/orson-0.5.0.jar:$ORSON_HOME/lib/jfreechart-1.0.6.jar:$ORSON_HOME/lib/jcommon-1.0.10.jar:$TS_INSTALL_DIR/lib/jbossjta.jar>"
+export CLASSPATH="$JDK_HOME/lib/tools.jar:$JDK_HOME/lib/jconsole.jar:$ORSON_HOME/orson-0.5.0.jar:$ORSON_HOME/lib/jfreechart-1.0.6.jar:$ORSON_HOME/lib/jcommon-1.0.10.jar:$TS_INSTALL_DIR/lib/jbossjts.jar>"
 
 Standalone Usage:
 
@@ -56,4 +82,6 @@
 
 Usage with jconsole:
 
-jconsole -J-Djava.class.path="$CLASSPATH" -pluginpath $TS_INSTALL_DIR/lib/jbossjta.jar
\ No newline at end of file
+jconsole -J-Djava.class.path="$CLASSPATH" -pluginpath $TS_INSTALL_DIR/lib/jbossjts.jar
+
+The tool will automatically enable statistics gathering on startup. It is recommended that you disable statistics gathering prior to exit on the Settings tab in the GUI.

Modified: labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/subordinate/jca/SubordinateAtomicAction.java
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/subordinate/jca/SubordinateAtomicAction.java	2011-12-16 13:22:23 UTC (rev 37817)
+++ labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTA/jta/classes/com/arjuna/ats/internal/jta/transaction/arjunacore/subordinate/jca/SubordinateAtomicAction.java	2011-12-16 16:27:53 UTC (rev 37818)
@@ -38,6 +38,8 @@
 import com.arjuna.ats.arjuna.objectstore.StoreManager;
 import com.arjuna.ats.arjuna.state.InputObjectState;
 import com.arjuna.ats.arjuna.state.OutputObjectState;
+import com.arjuna.ats.arjuna.utils.Utility;
+import com.arjuna.ats.internal.arjuna.Header;
 import com.arjuna.ats.internal.jta.xa.XID;
 import com.arjuna.ats.jta.xa.XATxConverter;
 import com.arjuna.ats.jta.xa.XidImple;
@@ -77,6 +79,7 @@
 		super(actId);
 		if (peekXidOnly) {
 			InputObjectState os = StoreManager.getParticipantStore().read_committed(objectUid, type());
+			unpackHeader(os, new Header());
 			boolean haveXid = os.unpackBoolean();
 
 			if (haveXid) {
@@ -145,6 +148,9 @@
 	{
 	    try
 	    {
+	        // pack the header first for the benefit of the tooling
+	        packHeader(os, new Header(get_uid(), Utility.getProcessUid()));
+
 	        if (_theXid != null)
 	        {
 	            os.packBoolean(true);
@@ -169,6 +175,8 @@
 	    
 		try
 		{
+			unpackHeader(os, new Header());
+
 			boolean haveXid = os.unpackBoolean();
 			
 			if (haveXid)

Modified: labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTS/INSTALL
===================================================================
--- labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTS/INSTALL	2011-12-16 13:22:23 UTC (rev 37817)
+++ labs/jbosstm/branches/JBOSSTS_4_16/ArjunaJTS/INSTALL	2011-12-16 16:27:53 UTC (rev 37818)
@@ -10,12 +10,14 @@
 JMX Instrumentation
 -------------------
 
-With this release it is now possible to monitor the transaction Object
-Store using JMX. Monitoring the Object Store is useful for trouble
+It is possible to monitor the transaction Object Store using JMX.
+Monitoring the Object Store is useful for trouble
 shooting problems that occur when transactions are committed (it does
 not expose transactions prior to commit). The JMX instrumentation
-(of the ObjectStore) is a new feature and is not necessarily suitable
-for monitoring production systems.
+(of the ObjectStore) is a not fully integrated with the AS console and
+is therefore not necessarily suitable for monitoring production systems
+but can provide useful diagnostic information that is otherwise not
+available.
 
 In any compliant JMX browser (such as jconsole) there should appear an
 MBean with the name
@@ -24,20 +26,42 @@
 for other MBeans (for example in a JMX client such as jconsole the MBeans
 will be displayed in the form of a tree control). The various MBeans
 corresponding to this ObjectStore will have names prefixed by this
-'top level' MBean.
+'top level' MBean. The bean has two operations:
 
-Simply instantiate an object of type com.hp.mwtests.ts.arjuna.tools.ObjStoreBrowser
-and initialise it with a valid set of types for handling ObjectStore records. These types
-can be set using a setTypes() method via a properties file on the classpath.
+probe - searches for Object Store records and creates corresponding MBeans
+	or unregisters any beans that no longer have a corresponding record;
+viewSubordinateAtomicActions - toggles the ability to view Subordinate Atomic Actions.
+        Set the boolean parameter to the text "true"/"false" to enable/disable viewing
+        of these record types.
+        WARNING: Viewing a Subordinate Atomic Action will trigger a recovery scan
+	independently of the Transaction Recovery Service so please use with care
+	(for example if you know that the distributed transaction is not recovering
+	automatically).
+
+Each MBean corresponding to an transaction contains an operation for removing the
+record from the object store. After this operation the system will no longer have
+any knowledge of the transaction.
+
+Transactions contain participants such datasources. These have MBean representations in
+the JMX viewer. It sometimes happens that a particpant made a different transaction
+completion decision from the one the Transaction Manager expected - such a state is
+called a heuristic. Heuristics will never be completed automatically so the MBean
+contains an operation (called clearHeuristic) for moving the participant back into
+the "prepared" state. Once back in the prepared state the Recovery system will
+attempt to replay completion.
+
+[For embedded use simply instantiate an object of type
+com.hp.mwtests.ts.arjuna.tools.ObjStoreBrowser.
+If the default set of types is not adequate other types for handling ObjectStore records
+can be added either by setting a System property called
+ObjStoreBrowser.OBJ_STORE_BROWSER_HANDLERS or by calling the method setType() on the
+ObjStoreBrowser object.]
+
 Please refer to the unit tests in the src distribution for more details.
 
 Tools Deployment
 ----------------
 
-Transaction management is integrated into the admin console in the form of a JOPR plugin
-which is located in the install bin directory (jbossts-jopr-plugin.jar). Install it by copying
-to the admin console plugin directory ($JBOSS_HOME/common/deploy/admin-console.war/plugins).
-
 There is also a transaction statistics graphing tool which can run standalone or inside a
 jconsole tab (jconsole, a tool for managing JVMs, is distributed with the reference JDK).
 Various transaction statistics are graphed in real time with each graph updated during each



More information about the jboss-svn-commits mailing list