[jboss-cvs] JBoss Messaging SVN: r7962 - in branches/Branch_1_4: integration/AS5/etc/xmdesc and 8 other directories.

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Thu Feb 25 04:23:34 EST 2010


Author: gaohoward
Date: 2010-02-25 04:23:32 -0500 (Thu, 25 Feb 2010)
New Revision: 7962

Modified:
   branches/Branch_1_4/docs/userguide/en/modules/configuration.xml
   branches/Branch_1_4/integration/AS5/etc/xmdesc/ServerPeer-xmbean.xml
   branches/Branch_1_4/integration/EAP4/etc/server/default/deploy/db2-persistence-service.xml
   branches/Branch_1_4/integration/EAP4/etc/server/default/deploy/mssql-persistence-service.xml
   branches/Branch_1_4/integration/EAP4/etc/server/default/deploy/mysql-persistence-service.xml
   branches/Branch_1_4/integration/EAP4/etc/server/default/deploy/ndb-persistence-service.xml
   branches/Branch_1_4/integration/EAP4/etc/server/default/deploy/oracle-persistence-service.xml
   branches/Branch_1_4/integration/EAP4/etc/server/default/deploy/postgresql-persistence-service.xml
   branches/Branch_1_4/integration/EAP4/etc/server/default/deploy/sybase-persistence-service.xml
   branches/Branch_1_4/integration/EAP4/etc/xmdesc/ServerPeer-xmbean.xml
   branches/Branch_1_4/integration/EAP5/etc/xmdesc/ServerPeer-xmbean.xml
   branches/Branch_1_4/src/main/org/jboss/jms/server/ServerPeer.java
   branches/Branch_1_4/src/main/org/jboss/messaging/core/contract/PersistenceManager.java
   branches/Branch_1_4/src/main/org/jboss/messaging/core/impl/JDBCPersistenceManager.java
   branches/Branch_1_4/src/main/org/jboss/messaging/core/impl/NullPersistenceManager.java
   branches/Branch_1_4/src/main/org/jboss/messaging/core/impl/tx/PreparedTxInfo.java
   branches/Branch_1_4/src/main/org/jboss/messaging/core/impl/tx/Transaction.java
   branches/Branch_1_4/src/main/org/jboss/messaging/core/impl/tx/TransactionRepository.java
   branches/Branch_1_4/tests/src/org/jboss/test/messaging/jms/server/ServerPeerTest.java
Log:
JBMESSAGING-1772



Modified: branches/Branch_1_4/docs/userguide/en/modules/configuration.xml
===================================================================
--- branches/Branch_1_4/docs/userguide/en/modules/configuration.xml	2010-02-24 05:11:22 UTC (rev 7961)
+++ branches/Branch_1_4/docs/userguide/en/modules/configuration.xml	2010-02-25 09:23:32 UTC (rev 7962)
@@ -386,6 +386,14 @@
         clustering.</para>
       </section>
 
+      <section id="conf.serverpeer.attributes.supportstxage">
+        <title>SupportsTxAge</title>
+
+        <para>Control whether or not to store transaction creation time. If it is set to
+	true, transaction creation time will be stored in the transaction record. If it is set
+	to false, transaction creation time won't be recorded. Default is false.</para>
+      </section>
+
       <section id="conf.serverpeer.operations">
         <title>We now discuss the MBean operations of the ServerPeer
         MBean.</title>
@@ -554,7 +562,39 @@
           a prepared state on the node in an easy to display HTML
           format.</para>
         </section>
-      </section>
+
+        <section id="conf.serverpeer.operations.listallpreparedtransactions">
+          <title>ListAllPreparedTransactions</title>
+
+          <para>Display the details of all prepared transactions</para>
+        </section>
+
+        <section id="conf.serverpeer.operations.listpreparedtransactions">
+          <title>ListPreparedTransactions</title>
+
+          <para>Display the details of all prepared transactions whose ages 
+	  are equal to or older than a certain time.</para>
+        </section>
+
+        <section id="conf.serverpeer.operations.showmessagedetails">
+          <title>ShowMessageDetails</title>
+
+          <para>Display the details of a message. It takes message id as its parameter.</para>
+        </section>
+
+        <section id="conf.serverpeer.operations.commitpreparedtransaction">
+          <title>CommitPreparedTransaction</title>
+
+          <para>Manually commit a prepared transaction. It takes transaction id as its parameter.</para>
+        </section>
+
+        <section id="conf.serverpeer.operations.rollbackpreparedtransaction">
+          <title>RollbackPreparedTransaction</title>
+
+          <para>Manually roll back a prepared transaction. It takes transaction id as its parameter.</para>
+        </section>
+
+       </section>
     </section>
   </section>
 

Modified: branches/Branch_1_4/integration/AS5/etc/xmdesc/ServerPeer-xmbean.xml
===================================================================
--- branches/Branch_1_4/integration/AS5/etc/xmdesc/ServerPeer-xmbean.xml	2010-02-24 05:11:22 UTC (rev 7961)
+++ branches/Branch_1_4/integration/AS5/etc/xmdesc/ServerPeer-xmbean.xml	2010-02-25 09:23:32 UTC (rev 7962)
@@ -241,6 +241,12 @@
       <type>int</type>
    </attribute>
 
+   <attribute access="read-write" getMethod="isSupportsTxAge" setMethod="setSupportsTxAge">
+      <description>Whether or not to record transaction creation time</description>
+      <name>SupportsTxAge</name>
+      <type>boolean</type>
+   </attribute>
+
    <!-- Managed operations -->
 
    <operation>
@@ -442,13 +448,40 @@
       <name>retrievePreparedTransactions</name>
       <return-type>java.util.List</return-type>
    </operation>  
+
+   <operation>
+      <description>
+         display the information of all prepared transactions
+      </description>
+      <name>listAllPreparedTransactions</name>
+      <return-type>java.lang.String</return-type>
+   </operation>  
    
    <operation>
       <description>
-         list of all prepared transaction ids used for manual commit or rollback
+         display the information of all prepared transactions whose ages are equal to or older than a certain time
       </description>
       <name>listPreparedTransactions</name>
-      <return-type>java.util.List</return-type>
+      <parameter>
+         <name>elapsedTime</name>
+         <type>java.lang.Long</type>
+      </parameter>
+      <return-type>java.lang.String</return-type>
+   </operation>
+   
+   <operation>
+      <description>
+         display the details of a message
+      </description>
+      <name>showMessageDetails</name>
+      <parameter>
+      <description>
+         message id
+      </description>
+         <name>messageID</name>
+         <type>java.lang.Long</type>
+      </parameter>
+      <return-type>java.lang.String</return-type>
    </operation>  
    
    <operation>

Modified: branches/Branch_1_4/integration/EAP4/etc/server/default/deploy/db2-persistence-service.xml
===================================================================
--- branches/Branch_1_4/integration/EAP4/etc/server/default/deploy/db2-persistence-service.xml	2010-02-24 05:11:22 UTC (rev 7961)
+++ branches/Branch_1_4/integration/EAP4/etc/server/default/deploy/db2-persistence-service.xml	2010-02-25 09:23:32 UTC (rev 7962)
@@ -89,6 +89,10 @@
    LOAD_ID_CACHE=SELECT CNTR, JBM_ID FROM JBM_ID_CACHE WHERE NODE_ID = ?
    DELETE_CHANNEL_MESSAGE_REF=DELETE FROM JBM_MSG_REF WHERE CHANNEL_ID=?
    DELETE_CHANNEL_MESSAGE=DELETE FROM JBM_MSG WHERE MESSAGE_ID = ?
+   CREATE_TRANSACTION_EXTRA=CREATE TABLE JBM_TX_EX (TRANSACTION_ID DECIMAL(19, 0) NOT NULL, START_TIME DECIMAL(19, 0), PRIMARY KEY (TRANSACTION_ID))
+   SELECT_TRANSACTION_START_TIME_EXTRA=SELECT TRANSACTION_ID, START_TIME FROM JBM_TX_EX
+   INSERT_TRANSACTION_EXTRA=INSERT INTO JBM_TX_EX (TRANSACTION_ID, START_TIME) VALUES(?, ?)
+   DELETE_TRANSACTION_EXTRA=DELETE FROM JBM_TX_EX WHERE TRANSACTION_ID=?
       ]]></attribute>
 
       <!-- The maximum number of parameters to include in a prepared statement -->

Modified: branches/Branch_1_4/integration/EAP4/etc/server/default/deploy/mssql-persistence-service.xml
===================================================================
--- branches/Branch_1_4/integration/EAP4/etc/server/default/deploy/mssql-persistence-service.xml	2010-02-24 05:11:22 UTC (rev 7961)
+++ branches/Branch_1_4/integration/EAP4/etc/server/default/deploy/mssql-persistence-service.xml	2010-02-25 09:23:32 UTC (rev 7962)
@@ -85,6 +85,10 @@
    LOAD_ID_CACHE=SELECT CNTR, JBM_ID FROM JBM_ID_CACHE WHERE NODE_ID = ?
    DELETE_CHANNEL_MESSAGE_REF=DELETE FROM JBM_MSG_REF WHERE CHANNEL_ID=?
    DELETE_CHANNEL_MESSAGE=DELETE FROM JBM_MSG WHERE MESSAGE_ID = ?
+   CREATE_TRANSACTION_EXTRA=CREATE TABLE JBM_TX_EX (TRANSACTION_ID BIGINT, START_TIME BIGINT, PRIMARY KEY (TRANSACTION_ID))
+   SELECT_TRANSACTION_START_TIME_EXTRA=SELECT TRANSACTION_ID, START_TIME FROM JBM_TX_EX
+   INSERT_TRANSACTION_EXTRA=INSERT INTO JBM_TX_EX (TRANSACTION_ID, START_TIME) VALUES(?, ?)
+   DELETE_TRANSACTION_EXTRA=DELETE FROM JBM_TX_EX WHERE TRANSACTION_ID=?
       ]]></attribute>
 
       <!-- The maximum number of parameters to include in a prepared statement -->

Modified: branches/Branch_1_4/integration/EAP4/etc/server/default/deploy/mysql-persistence-service.xml
===================================================================
--- branches/Branch_1_4/integration/EAP4/etc/server/default/deploy/mysql-persistence-service.xml	2010-02-24 05:11:22 UTC (rev 7961)
+++ branches/Branch_1_4/integration/EAP4/etc/server/default/deploy/mysql-persistence-service.xml	2010-02-25 09:23:32 UTC (rev 7962)
@@ -85,7 +85,11 @@
    LOAD_ID_CACHE=SELECT CNTR, JBM_ID FROM JBM_ID_CACHE WHERE NODE_ID = ?
    DELETE_CHANNEL_MESSAGE_REF=DELETE FROM JBM_MSG_REF WHERE CHANNEL_ID=?
    DELETE_CHANNEL_MESSAGE=DELETE FROM JBM_MSG WHERE MESSAGE_ID = ?
-      ]]></attribute>
+   CREATE_TRANSACTION_EXTRA=CREATE TABLE JBM_TX_EX (TRANSACTION_ID BIGINT, START_TIME BIGINT, PRIMARY KEY (TRANSACTION_ID)) ENGINE = INNODB
+   SELECT_TRANSACTION_START_TIME_EXTRA=SELECT TRANSACTION_ID, START_TIME FROM JBM_TX_EX
+   INSERT_TRANSACTION_EXTRA=INSERT INTO JBM_TX_EX (TRANSACTION_ID, START_TIME) VALUES(?,?)
+   DELETE_TRANSACTION_EXTRA=DELETE FROM JBM_TX_EX WHERE TRANSACTION_ID=?
+   ]]></attribute>
 
       <!-- The maximum number of parameters to include in a prepared statement -->
 

Modified: branches/Branch_1_4/integration/EAP4/etc/server/default/deploy/ndb-persistence-service.xml
===================================================================
--- branches/Branch_1_4/integration/EAP4/etc/server/default/deploy/ndb-persistence-service.xml	2010-02-24 05:11:22 UTC (rev 7961)
+++ branches/Branch_1_4/integration/EAP4/etc/server/default/deploy/ndb-persistence-service.xml	2010-02-25 09:23:32 UTC (rev 7962)
@@ -85,6 +85,10 @@
    LOAD_ID_CACHE=SELECT CNTR, JBM_ID FROM JBM_ID_CACHE WHERE NODE_ID = ?
    DELETE_CHANNEL_MESSAGE_REF=DELETE FROM JBM_MSG_REF WHERE CHANNEL_ID=?
    DELETE_CHANNEL_MESSAGE=DELETE FROM JBM_MSG WHERE MESSAGE_ID = ?
+   CREATE_TRANSACTION_EXTRA=CREATE TABLE JBM_TX_EX (TRANSACTION_ID BIGINT, START_TIME BIGINT, PRIMARY KEY (TRANSACTION_ID)) ENGINE = NDBCLUSTER
+   SELECT_TRANSACTION_START_TIME_EXTRA=SELECT TRANSACTION_ID, START_TIME FROM JBM_TX_EX
+   INSERT_TRANSACTION_EXTRA=INSERT INTO JBM_TX_EX (TRANSACTION_ID, START_TIME) VALUES(?, ?)
+   DELETE_TRANSACTION_EXTRA=DELETE FROM JBM_TX_EX WHERE TRANSACTION_ID=?
       ]]></attribute>
 
       <!-- The maximum number of parameters to include in a prepared statement -->

Modified: branches/Branch_1_4/integration/EAP4/etc/server/default/deploy/oracle-persistence-service.xml
===================================================================
--- branches/Branch_1_4/integration/EAP4/etc/server/default/deploy/oracle-persistence-service.xml	2010-02-24 05:11:22 UTC (rev 7961)
+++ branches/Branch_1_4/integration/EAP4/etc/server/default/deploy/oracle-persistence-service.xml	2010-02-25 09:23:32 UTC (rev 7962)
@@ -89,6 +89,10 @@
    LOAD_ID_CACHE=SELECT CNTR, JBM_ID FROM JBM_ID_CACHE WHERE NODE_ID = ?
    DELETE_CHANNEL_MESSAGE_REF=DELETE FROM JBM_MSG_REF WHERE CHANNEL_ID=?
    DELETE_CHANNEL_MESSAGE=DELETE FROM JBM_MSG WHERE MESSAGE_ID = ?
+   CREATE_TRANSACTION_EXTRA=CREATE TABLE JBM_TX_EX (TRANSACTION_ID INTEGER, START_TIME INTEGER, PRIMARY KEY (TRANSACTION_ID))
+   SELECT_TRANSACTION_START_TIME_EXTRA=SELECT TRANSACTION_ID, START_TIME FROM JBM_TX_EX
+   INSERT_TRANSACTION_EXTRA=INSERT INTO JBM_TX_EX (TRANSACTION_ID, START_TIME) VALUES(?, ?)
+   DELETE_TRANSACTION_EXTRA=DELETE FROM JBM_TX_EX WHERE TRANSACTION_ID=?
       ]]></attribute>
 
       <!-- The maximum number of parameters to include in a prepared statement -->

Modified: branches/Branch_1_4/integration/EAP4/etc/server/default/deploy/postgresql-persistence-service.xml
===================================================================
--- branches/Branch_1_4/integration/EAP4/etc/server/default/deploy/postgresql-persistence-service.xml	2010-02-24 05:11:22 UTC (rev 7961)
+++ branches/Branch_1_4/integration/EAP4/etc/server/default/deploy/postgresql-persistence-service.xml	2010-02-25 09:23:32 UTC (rev 7962)
@@ -85,6 +85,10 @@
    LOAD_ID_CACHE=SELECT CNTR, JBM_ID FROM JBM_ID_CACHE WHERE NODE_ID = ?
    DELETE_CHANNEL_MESSAGE_REF=DELETE FROM JBM_MSG_REF WHERE CHANNEL_ID=?
    DELETE_CHANNEL_MESSAGE=DELETE FROM JBM_MSG WHERE MESSAGE_ID = ?
+   CREATE_TRANSACTION_EXTRA=CREATE TABLE JBM_TX_EX (TRANSACTION_ID BIGINT, START_TIME BIGINT, PRIMARY KEY (TRANSACTION_ID))
+   SELECT_TRANSACTION_START_TIME_EXTRA=SELECT TRANSACTION_ID, START_TIME FROM JBM_TX_EX
+   INSERT_TRANSACTION_EXTRA=INSERT INTO JBM_TX_EX (TRANSACTION_ID, START_TIME) VALUES(?, ?)
+   DELETE_TRANSACTION_EXTRA=DELETE FROM JBM_TX_EX WHERE TRANSACTION_ID=?
       ]]></attribute>
 
       <!-- The maximum number of parameters to include in a prepared statement -->

Modified: branches/Branch_1_4/integration/EAP4/etc/server/default/deploy/sybase-persistence-service.xml
===================================================================
--- branches/Branch_1_4/integration/EAP4/etc/server/default/deploy/sybase-persistence-service.xml	2010-02-24 05:11:22 UTC (rev 7961)
+++ branches/Branch_1_4/integration/EAP4/etc/server/default/deploy/sybase-persistence-service.xml	2010-02-25 09:23:32 UTC (rev 7962)
@@ -90,6 +90,10 @@
    LOAD_ID_CACHE=SELECT CNTR, JBM_ID FROM JBM_ID_CACHE WHERE NODE_ID = ?
    DELETE_CHANNEL_MESSAGE_REF=DELETE FROM JBM_MSG_REF WHERE CHANNEL_ID=?
    DELETE_CHANNEL_MESSAGE=DELETE FROM JBM_MSG WHERE MESSAGE_ID = ?
+   CREATE_TRANSACTION_EXTRA=CREATE TABLE JBM_TX_EX (TRANSACTION_ID DECIMAL(19, 0) NOT NULL, START_TIME DECIMAL(19, 0), PRIMARY KEY (TRANSACTION_ID))
+   SELECT_TRANSACTION_START_TIME_EXTRA=SELECT TRANSACTION_ID, START_TIME FROM JBM_TX_EX
+   INSERT_TRANSACTION_EXTRA=INSERT INTO JBM_TX_EX (TRANSACTION_ID, START_TIME) VALUES(?, ?)
+   DELETE_TRANSACTION_EXTRA=DELETE FROM JBM_TX_EX WHERE TRANSACTION_ID=?
       ]]></attribute>
 
       <!-- The maximum number of parameters to include in a prepared statement -->

Modified: branches/Branch_1_4/integration/EAP4/etc/xmdesc/ServerPeer-xmbean.xml
===================================================================
--- branches/Branch_1_4/integration/EAP4/etc/xmdesc/ServerPeer-xmbean.xml	2010-02-24 05:11:22 UTC (rev 7961)
+++ branches/Branch_1_4/integration/EAP4/etc/xmdesc/ServerPeer-xmbean.xml	2010-02-25 09:23:32 UTC (rev 7962)
@@ -236,6 +236,11 @@
       <type>int</type>
    </attribute>   
 
+   <attribute access="read-write" getMethod="isSupportsTxAge" setMethod="setSupportsTxAge">
+      <description>Whether or not to record transaction creation time</description>
+      <name>SupportsTxAge</name>
+      <type>boolean</type>
+   </attribute>
 
    <!-- Managed operations -->
 
@@ -443,12 +448,24 @@
       <description>
          display the information of all prepared transactions
       </description>
-      <name>listPreparedTransactions</name>
+      <name>listAllPreparedTransactions</name>
       <return-type>java.lang.String</return-type>
    </operation>  
    
    <operation>
       <description>
+         display the information of all prepared transactions whose ages are equal to or older than a certain time
+      </description>
+      <name>listPreparedTransactions</name>
+      <parameter>
+         <name>elapsedTime</name>
+         <type>java.lang.Long</type>
+      </parameter>
+      <return-type>java.lang.String</return-type>
+   </operation>
+   
+   <operation>
+      <description>
          display the details of a message
       </description>
       <name>showMessageDetails</name>

Modified: branches/Branch_1_4/integration/EAP5/etc/xmdesc/ServerPeer-xmbean.xml
===================================================================
--- branches/Branch_1_4/integration/EAP5/etc/xmdesc/ServerPeer-xmbean.xml	2010-02-24 05:11:22 UTC (rev 7961)
+++ branches/Branch_1_4/integration/EAP5/etc/xmdesc/ServerPeer-xmbean.xml	2010-02-25 09:23:32 UTC (rev 7962)
@@ -241,6 +241,12 @@
       <type>int</type>
    </attribute>
 
+   <attribute access="read-write" getMethod="isSupportsTxAge" setMethod="setSupportsTxAge">
+      <description>Whether or not to record transaction creation time</description>
+      <name>SupportsTxAge</name>
+      <type>boolean</type>
+   </attribute>
+
    <!-- Managed operations -->
 
    <operation>
@@ -445,10 +451,37 @@
    
    <operation>
       <description>
-         list of all prepared transaction ids used for manual commit or rollback
+         display the information of all prepared transactions
       </description>
+      <name>listAllPreparedTransactions</name>
+      <return-type>java.lang.String</return-type>
+   </operation>  
+   
+   <operation>
+      <description>
+         display the information of all prepared transactions whose ages are equal to or older than a certain time
+      </description>
       <name>listPreparedTransactions</name>
-      <return-type>java.util.List</return-type>
+      <parameter>
+         <name>elapsedTime</name>
+         <type>java.lang.Long</type>
+      </parameter>
+      <return-type>java.lang.String</return-type>
+   </operation>
+   
+   <operation>
+      <description>
+         display the details of a message
+      </description>
+      <name>showMessageDetails</name>
+      <parameter>
+      <description>
+         message id
+      </description>
+         <name>messageID</name>
+         <type>java.lang.Long</type>
+      </parameter>
+      <return-type>java.lang.String</return-type>
    </operation>  
    
    <operation>

Modified: branches/Branch_1_4/src/main/org/jboss/jms/server/ServerPeer.java
===================================================================
--- branches/Branch_1_4/src/main/org/jboss/jms/server/ServerPeer.java	2010-02-24 05:11:22 UTC (rev 7961)
+++ branches/Branch_1_4/src/main/org/jboss/jms/server/ServerPeer.java	2010-02-25 09:23:32 UTC (rev 7962)
@@ -177,7 +177,9 @@
    private int suckerConnectionRetryTimes = -1;
    
    private int suckerConnectionRetryInterval = 5000;
-   
+
+   private boolean supportsTxAge;
+
    // wired components
 
    private DestinationJNDIMapper destinationJNDIMapper;
@@ -265,6 +267,8 @@
          {
             ((NullPersistenceManager)persistenceManager).initCounter(serverPeerID, serverStartTime);
          }
+         
+         persistenceManager.setSupportsTxAge(supportsTxAge);
 
          jmsUserManager = (JMSUserManager)JMXAccessor.getJMXAttributeOverSecurity(mbeanServer, jmsUserManagerObjectName, "Instance");
 
@@ -1182,7 +1186,7 @@
       return buffer.toString();
    }
 
-   public String listPreparedTransactions() throws Exception
+   public String listAllPreparedTransactions() throws Exception
    {
       JBossStringBuilder buffer = new JBossStringBuilder();
       buffer.append("<table width=\"100%\" border=\"1\" cellpadding=\"1\" cellspacing=\"1\">");
@@ -1192,6 +1196,7 @@
       buffer.append("<th>branch_qual</th>");
       buffer.append("<th>format_id</th>");
       buffer.append("<th>global_txid</th>");
+      buffer.append("<th>elapsed_time</th>");
       buffer.append("<th>queue_name (channel_id)</th>");
       buffer.append("<th>message_id (state)</th>");
       buffer.append("</tr>");
@@ -1253,6 +1258,15 @@
          buffer.append("<td>" + hexBranchQual + "</td>");
          buffer.append("<td>" + hexFormatId + "</td>");
          buffer.append("<td>" + hexGlobalTxid + "</td>");
+         long age = tx.getAge();
+         if ((!this.supportsTxAge) || age == Long.MIN_VALUE)
+         {
+            buffer.append("<td>N/A</td>");
+         }
+         else
+         {
+            buffer.append("<td>" + tx.getAge() + "</td>");
+         }
          
          StringBuffer sbq = new StringBuffer();
          StringBuffer sbm = new StringBuffer();
@@ -1285,7 +1299,122 @@
       
       buffer.append("</table>");
       return buffer.toString();
+   }
 
+   public String listPreparedTransactions(Long elapsedTime) throws Exception
+   {
+      if (elapsedTime == null) elapsedTime = 0l;
+      JBossStringBuilder buffer = new JBossStringBuilder();
+      buffer.append("<table width=\"100%\" border=\"1\" cellpadding=\"1\" cellspacing=\"1\">");
+      
+      buffer.append("<tr>");
+      buffer.append("<th>transaction_id</th>");
+      buffer.append("<th>branch_qual</th>");
+      buffer.append("<th>format_id</th>");
+      buffer.append("<th>global_txid</th>");
+      buffer.append("<th>elapsed_time</th>");
+      buffer.append("<th>queue_name (channel_id)</th>");
+      buffer.append("<th>message_id (state)</th>");
+      buffer.append("</tr>");
+      
+      List txs = txRepository.listPreparedTransactions(elapsedTime);
+      Iterator ittx = txs.iterator();
+      
+      while (ittx.hasNext())
+      {
+         Transaction tx = (Transaction)ittx.next();
+         Xid xid = tx.getXid();
+         long tid = tx.getId();
+         String stid = String.valueOf(tid);
+         String hexGlobalTxid = new String(xid.getGlobalTransactionId());
+         String hexBranchQual = new String(xid.getBranchQualifier());
+         String hexFormatId = String.valueOf(xid.getFormatId());
+         
+         Map<String, List<String>> qInfo = new HashMap<String, List<String>>();
+         
+         List msgList1 = persistenceManager.getMessageChannelPairRefsForTx(tid);
+         List msgList2 = persistenceManager.getMessageChannelPairAcksForTx(tid);
+         
+         Iterator mIter1 = msgList1.iterator();
+         while (mIter1.hasNext())
+         {
+            MessageChannelPair pair = (MessageChannelPair)mIter1.next();
+            Binding binding = postOffice.getBindingForChannelID(pair.getChannelId());
+            String qname = binding.queue.getName();
+            Long chid = binding.queue.getChannelID();
+            String qkey = qname + " (" + chid + ")";
+            List<String> msgs = qInfo.get(qkey);
+            if (msgs == null)
+            {
+               msgs = new ArrayList<String>();
+               qInfo.put(qkey, msgs);
+            }
+            msgs.add(String.valueOf(pair.getMessage().getMessageID()) + " (+)");
+         }
+         
+         Iterator mIter2 = msgList2.iterator();
+         while (mIter2.hasNext())
+         {
+            MessageChannelPair pair = (MessageChannelPair)mIter2.next();
+            Binding binding = postOffice.getBindingForChannelID(pair.getChannelId());
+            String qname = binding.queue.getName();
+            Long chid = binding.queue.getChannelID();
+            String qkey = qname + " (" + chid + ")";
+            List<String> msgs = qInfo.get(qkey);
+            if (msgs == null)
+            {
+               msgs = new ArrayList<String>();
+               qInfo.put(qkey, msgs);
+            }
+            msgs.add(String.valueOf(pair.getMessage().getMessageID()) + " (-)");
+         }
+
+         buffer.append("<tr>");
+         buffer.append("<td>" + stid + "</td>");
+         buffer.append("<td>" + hexBranchQual + "</td>");
+         buffer.append("<td>" + hexFormatId + "</td>");
+         buffer.append("<td>" + hexGlobalTxid + "</td>");
+         long age = tx.getAge();
+         if (age == Long.MIN_VALUE)
+         {
+            buffer.append("<td>N/A</td>");
+         }
+         else
+         {
+            buffer.append("<td>" + tx.getAge() + "</td>");
+         }
+         
+         StringBuffer sbq = new StringBuffer();
+         StringBuffer sbm = new StringBuffer();
+         
+         Iterator<String> itqs = qInfo.keySet().iterator();
+         while (itqs.hasNext())
+         {
+            String qname = itqs.next();
+            sbq.append(qname);
+            
+            List<String> msgs = qInfo.get(qname);
+            for (String m : msgs)
+            {
+               sbq.append("<br/>");
+               sbm.append(m);
+               sbm.append("<br/>");
+            }
+         }
+         
+         buffer.append("<td>");
+         buffer.append(sbq.toString());
+         buffer.append("</td>");
+         
+         buffer.append("<td>");
+         buffer.append(sbm.toString());
+         buffer.append("</td>");
+         
+         buffer.append("</tr>");
+      }
+      
+      buffer.append("</table>");
+      return buffer.toString();
    }
    
    public boolean commitPreparedTransaction(Long transactionID)
@@ -1896,8 +2025,21 @@
    {
       return suckerConnectionRetryInterval;
    }
+   
+   public boolean isSupportsTxAge()
+   {
+      return supportsTxAge;
+   }
+   
+   public void setSupportsTxAge(boolean supportsTxAge)
+   {
+      this.supportsTxAge = supportsTxAge;
+      if (persistenceManager != null)
+      {
+         this.persistenceManager.setSupportsTxAge(supportsTxAge);
+      }
+   }
 
-
    // Inner classes --------------------------------------------------------------------------------
 
 

Modified: branches/Branch_1_4/src/main/org/jboss/messaging/core/contract/PersistenceManager.java
===================================================================
--- branches/Branch_1_4/src/main/org/jboss/messaging/core/contract/PersistenceManager.java	2010-02-24 05:11:22 UTC (rev 7961)
+++ branches/Branch_1_4/src/main/org/jboss/messaging/core/contract/PersistenceManager.java	2010-02-25 09:23:32 UTC (rev 7962)
@@ -93,7 +93,12 @@
    //merge messages from one channel to another.
    void mergeChannelMessage(long fromID, long toID) throws Exception;
 
+   //set if supporting storing transaction creation time.
+   void setSupportsTxAge(boolean supportsTxAge);
 
+   //if supports transaction creation time
+   boolean supportsTxAge();
+
    // Interface value classes ----------------------------------------------------------------------
 
    class MessageChannelPair

Modified: branches/Branch_1_4/src/main/org/jboss/messaging/core/impl/JDBCPersistenceManager.java
===================================================================
--- branches/Branch_1_4/src/main/org/jboss/messaging/core/impl/JDBCPersistenceManager.java	2010-02-24 05:11:22 UTC (rev 7961)
+++ branches/Branch_1_4/src/main/org/jboss/messaging/core/impl/JDBCPersistenceManager.java	2010-02-25 09:23:32 UTC (rev 7962)
@@ -101,8 +101,9 @@
    private int idCacheCounter = 0;
 
    private final int idCacheSize;
+   
+   private boolean supportsTxAge;
 
-
    // Constructors --------------------------------------------------
 
    public JDBCPersistenceManager(DataSource ds, TransactionManager tm,
@@ -321,6 +322,10 @@
       ResultSet rs = null;
       PreparedTxInfo txInfo = null;
       TransactionWrapper wrap = new TransactionWrapper();
+      
+      PreparedStatement exst = null;
+      ResultSet exrs = null;
+      Map<Long, Long> txTimes = new HashMap<Long, Long>();
 
       try
       {
@@ -328,6 +333,27 @@
 
          conn = ds.getConnection();
 
+         if (supportsTxAge)
+         {
+            try
+            {
+               exst = conn.prepareStatement(getSQLStatement("SELECT_TRANSACTION_START_TIME_EXTRA"));
+               exrs = exst.executeQuery();
+            
+               while (exrs.next())
+               {
+                  long txId = exrs.getLong(1);
+                  long txTime = exrs.getLong(2);
+                  txTimes.put(txId, txTime);
+               }
+            }
+            finally
+            {
+               closeResultSet(exrs);
+               closeStatement(exst);
+            }
+         }
+
          st = conn
                .prepareStatement(getSQLStatement("SELECT_PREPARED_TRANSACTIONS"));
 
@@ -349,7 +375,7 @@
             Xid xid = new MessagingXid(branchQual, formatId, globalTxId);
 
             // create a tx info object with the result set detailsdetails
-            txInfo = new PreparedTxInfo(txId, xid);
+            txInfo = new PreparedTxInfo(txId, xid, txTimes.get(txId));
 
             transactions.add(txInfo);
          }
@@ -2350,6 +2376,36 @@
          }
          closeStatement(ps);
       }
+      
+      if (supportsTxAge)
+      {
+         try
+         {
+            statement = getSQLStatement("INSERT_TRANSACTION_EXTRA");
+
+            ps = conn.prepareStatement(statement);
+
+            ps.setLong(1, tx.getId());
+
+            ps.setLong(2, tx.getCreationTime());
+
+            rows = ps.executeUpdate();
+         }
+         finally
+         {
+            if (trace)
+            {
+               String s = JDBCUtil.statementToString(statement,
+                                                     new Integer(nodeID),
+                                                     new Long(tx.getId()),
+                                                     "<byte-array>",
+                                                     new Integer(formatID),
+                                                     "<byte-array>");
+               log.trace(s + (rows == -1 ? " failed!" : " inserted " + rows + " row(s)"));
+            }
+            closeStatement(ps);
+         }
+      }
    }
 
    protected void removeTXRecord(Connection conn, Transaction tx)
@@ -2384,6 +2440,30 @@
       {
          closeStatement(ps);
       }
+      
+      if (supportsTxAge)
+      {
+         try
+         {
+            ps = conn.prepareStatement(getSQLStatement("DELETE_TRANSACTION_EXTRA"));
+
+            ps.setLong(1, tx.getId());
+
+            int rows = ps.executeUpdate();
+
+            if (trace)
+            {
+               log.trace(JDBCUtil.statementToString(
+                     getSQLStatement("DELETE_TRANSACTION_EXTRA"), new Integer(nodeID),
+                     new Long(tx.getId()))
+                     + " removed " + rows + " row(s)");
+            }
+         }
+         finally
+         {
+            closeStatement(ps);
+         }
+      }
    }
 
    protected void addReference(long channelID, MessageReference ref,
@@ -2758,6 +2838,11 @@
               "CREATE TABLE JBM_COUNTER (NAME VARCHAR(255), NEXT_ID BIGINT, PRIMARY KEY(NAME))");
       // Id cache
       map.put("CREATE_ID_CACHE", "CREATE TABLE JBM_ID_CACHE (NODE_ID INTEGER, CNTR INTEGER, JBM_ID VARCHAR(255), PRIMARY KEY(NODE_ID, CNTR))");
+
+      // Transaction Extra
+      //https://jira.jboss.org/jira/browse/JBMESSAGING-1772
+      map.put("CREATE_TRANSACTION_EXTRA", "CREATE TABLE JBM_TX_EX (TRANSACTION_ID BIGINT, START_TIME BIGINT, PRIMARY KEY (TRANSACTION_ID))");
+
       return map;
    }
 
@@ -2856,6 +2941,11 @@
       // Other
       map.put("SELECT_ALL_CHANNELS",
               "SELECT DISTINCT(CHANNEL_ID) FROM JBM_MSG_REF");
+      
+      //Transaction Extra
+      map.put("SELECT_TRANSACTION_START_TIME_EXTRA", "SELECT TRANSACTION_ID, START_TIME FROM JBM_TX_EX");
+      map.put("INSERT_TRANSACTION_EXTRA", "INSERT INTO JBM_TX_EX (TRANSACTION_ID, START_TIME) VALUES(?,?)");
+      map.put("DELETE_TRANSACTION_EXTRA", "DELETE FROM JBM_TX_EX WHERE TRANSACTION_ID=?");
 
       return map;
    }
@@ -3208,4 +3298,14 @@
       }
    }
 
+   public void setSupportsTxAge(boolean supportsTxAge)
+   {
+      this.supportsTxAge = supportsTxAge;
+   }
+   
+   public boolean supportsTxAge()
+   {
+      return supportsTxAge;
+   }
+
 }

Modified: branches/Branch_1_4/src/main/org/jboss/messaging/core/impl/NullPersistenceManager.java
===================================================================
--- branches/Branch_1_4/src/main/org/jboss/messaging/core/impl/NullPersistenceManager.java	2010-02-24 05:11:22 UTC (rev 7961)
+++ branches/Branch_1_4/src/main/org/jboss/messaging/core/impl/NullPersistenceManager.java	2010-02-25 09:23:32 UTC (rev 7962)
@@ -116,6 +116,15 @@
       // NOOP
    }
 
+   public void setSupportsTxAge(boolean supportsTxAge)
+   {
+   }
+
+   public boolean supportsTxAge()
+   {
+      return false;
+   }
+
    public void addTransaction(Transaction tx)
    {
       //To change body of implemented methods use File | Settings | File Templates.

Modified: branches/Branch_1_4/src/main/org/jboss/messaging/core/impl/tx/PreparedTxInfo.java
===================================================================
--- branches/Branch_1_4/src/main/org/jboss/messaging/core/impl/tx/PreparedTxInfo.java	2010-02-24 05:11:22 UTC (rev 7961)
+++ branches/Branch_1_4/src/main/org/jboss/messaging/core/impl/tx/PreparedTxInfo.java	2010-02-25 09:23:32 UTC (rev 7962)
@@ -36,6 +36,8 @@
 	private long txId;
 
 	private Xid xid = null;
+	
+	private long creationTime = Long.MIN_VALUE;
 
 
    // Constructors ------------------------------------------------------------
@@ -45,6 +47,14 @@
 		setXid(xid);
 	}
 
+   public PreparedTxInfo(long txId, Xid xid, Long ct) {
+      setTxId(txId);
+      setXid(xid);
+      if (ct != null)
+      {
+         creationTime = ct;
+      }
+   }
 
    // Public ------------------------------------------------------------------
 
@@ -63,6 +73,11 @@
 	public void setXid(Xid xid) {
 		this.xid = xid;
 	}
+	
+	public long getCreationTime()
+	{
+	   return creationTime;
+	}
 
 
    // Object overrides --------------------------------------------------------

Modified: branches/Branch_1_4/src/main/org/jboss/messaging/core/impl/tx/Transaction.java
===================================================================
--- branches/Branch_1_4/src/main/org/jboss/messaging/core/impl/tx/Transaction.java	2010-02-24 05:11:22 UTC (rev 7961)
+++ branches/Branch_1_4/src/main/org/jboss/messaging/core/impl/tx/Transaction.java	2010-02-25 09:23:32 UTC (rev 7962)
@@ -63,6 +63,8 @@
    private Map callbackMap;
    
    private boolean recoveredFromStorage;
+   
+   private long creationTime;
          
    /**
     * If this is a XA transaction, when a commit is executed the transaction has to be removed from the transaction repository.
@@ -122,6 +124,7 @@
       state = STATE_ACTIVE;
       callbacks = new ArrayList();
       callbackMap = new HashMap();
+      creationTime = System.currentTimeMillis();
    }
    
    Transaction(long id, Xid xid, TransactionRepository tr)
@@ -130,6 +133,12 @@
       this.xid = xid;
       this.repository = tr;
    }
+
+   Transaction(long id, Xid xid, TransactionRepository tr, long ct)
+   {
+      this(id, xid, tr);
+      creationTime = ct;
+   }
    
    // Public --------------------------------------------------------
    
@@ -385,6 +394,20 @@
    {
       this.state = state;
    }
+
+   public long getAge()
+   {
+      if (creationTime == Long.MIN_VALUE)
+      {
+         return creationTime;
+      }
+      return System.currentTimeMillis() - creationTime;
+   }
+
+   public long getCreationTime()
+   {
+      return creationTime;
+   }
       
    public String toString()
    {

Modified: branches/Branch_1_4/src/main/org/jboss/messaging/core/impl/tx/TransactionRepository.java
===================================================================
--- branches/Branch_1_4/src/main/org/jboss/messaging/core/impl/tx/TransactionRepository.java	2010-02-24 05:11:22 UTC (rev 7961)
+++ branches/Branch_1_4/src/main/org/jboss/messaging/core/impl/tx/TransactionRepository.java	2010-02-25 09:23:32 UTC (rev 7962)
@@ -25,7 +25,6 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 import javax.transaction.xa.Xid;
 
@@ -445,7 +444,7 @@
 		}
 
 		// Resurrected tx
-		Transaction tx = new Transaction(txInfo.getTxId(), txInfo.getXid(), this);
+		Transaction tx = new Transaction(txInfo.getTxId(), txInfo.getXid(), this, txInfo.getCreationTime());
 
 		if (trace) {
 			log.trace("created transaction " + tx);
@@ -580,4 +579,30 @@
       return list;
    }
 
+   public List<Transaction> listPreparedTransactions(Long age) throws Exception
+   {
+      return listPreparedTransactions(age, Long.MAX_VALUE);
+   }
+
+   private List<Transaction> listPreparedTransactions(Long lower, Long upper) throws Exception
+   {
+      if (!persistenceManager.supportsTxAge())
+      {
+         throw new Exception("PersistenceManage doesn't support transaction age attribute.");
+      }
+      ArrayList<Transaction> list = new ArrayList<Transaction>(map.size());
+      Iterator itk = map.keySet().iterator();
+      while (itk.hasNext())
+      {
+         Xid txid = (Xid)itk.next();
+         Transaction tx = (Transaction)map.get(txid);
+         long age = tx.getAge();
+         if ( (age >= lower) && (age <= upper) )
+         {
+            list.add(tx);
+         }
+      }
+      return list;
+   }
+
 }
\ No newline at end of file

Modified: branches/Branch_1_4/tests/src/org/jboss/test/messaging/jms/server/ServerPeerTest.java
===================================================================
--- branches/Branch_1_4/tests/src/org/jboss/test/messaging/jms/server/ServerPeerTest.java	2010-02-24 05:11:22 UTC (rev 7961)
+++ branches/Branch_1_4/tests/src/org/jboss/test/messaging/jms/server/ServerPeerTest.java	2010-02-25 09:23:32 UTC (rev 7962)
@@ -21,6 +21,7 @@
   */
 package org.jboss.test.messaging.jms.server;
 
+import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Set;
@@ -645,13 +646,148 @@
    }
 
    //https://jira.jboss.org/jira/browse/JBMESSAGING-1772
-   public void testListPreparedTransactions() throws Exception
+   public void testListPreparedTransactionsNoTxAge() throws Exception
    {
       if(!ServerManagement.isServerPeerStarted())
       {
          ServerManagement.startServerPeer();
       }
+
+      XAConnectionFactory cf = (XAConnectionFactory)initialContext.lookup("/ConnectionFactory");
       
+      ServerManagement.deployQueue("Queue");
+
+      Queue queue = (Queue)initialContext.lookup("/queue/Queue");
+      
+      XAConnection conn = null;
+      
+      try
+      {
+         conn = cf.createXAConnection();
+         
+         Xid xid1, xid2;
+         
+         {
+         
+            XASession sess = conn.createXASession();
+            
+            XAResource res = sess.getXAResource();
+            
+            MessageProducer prod = sess.createProducer(queue);
+            
+            xid1 = new MessagingXid("list-blah1".getBytes(), 43, "list-blahblah1".getBytes());
+                     
+            TextMessage tm = sess.createTextMessage("message-list");
+            
+            res.start(xid1, XAResource.TMNOFLAGS);
+            
+            prod.send(tm);
+            
+            res.end(xid1, XAResource.TMSUCCESS);
+            
+            res.prepare(xid1);
+         
+         }
+         
+         {
+            
+            XASession sess = conn.createXASession();
+            
+            XAResource res = sess.getXAResource();
+            
+            MessageProducer prod = sess.createProducer(queue);
+            
+            xid2 = new MessagingXid("list-blah2".getBytes(), 43, "list-blahblah2".getBytes());
+                     
+            TextMessage tm = sess.createTextMessage("message1-list");
+            
+            res.start(xid2, XAResource.TMNOFLAGS);
+            
+            prod.send(tm);
+            
+            res.end(xid2, XAResource.TMSUCCESS);
+            
+            res.prepare(xid2);
+         
+         }
+         
+         String txList = (String)ServerManagement.invoke(ServerManagement.getServerPeerObjectName(), 
+                  "listAllPreparedTransactions", null, null);
+         
+         log.info("got tx list: " + txList);
+         
+         assertNotNull(txList);
+         
+         boolean checkResult = txList.startsWith("<table width=\"100%\" border=\"1\" cellpadding=\"1\" cellspacing=\"1\">" + 
+                           "<tr><th>transaction_id</th><th>branch_qual</th><th>format_id</th><th>global_txid</th>" +
+                           "<th>elapsed_time</th><th>queue_name (channel_id)</th><th>message_id (state)</th></tr>");
+         
+         assertTrue("table header has changed.", checkResult);
+         
+         //check xid fields
+         log.info("formatId: " + xid1.getFormatId());
+         int index = txList.indexOf(String.valueOf(xid1.getFormatId()));
+         assertTrue(index > 0);
+         
+         index = txList.indexOf(String.valueOf(xid2.getFormatId()));
+         assertTrue(index > 0);
+         
+         //txAge
+         index = txList.indexOf("Queue ");
+         assertTrue(index > 0);
+         String str = txList.substring(0, index - 9);
+         int tdIndex = str.lastIndexOf("<td>");
+         str = str.substring(tdIndex + 4);
+         log.info("Tx age: " + str);
+         
+         assertTrue("Tx age should be N/A.", "N/A".equals(str));
+         
+         //check the first message id
+         int plusIndex = txList.indexOf("+");
+         str = txList.substring(0, plusIndex - 1);
+         tdIndex = str.lastIndexOf("<td>");
+         str = str.substring(tdIndex + 4).trim();
+         log.info("message id str: " + str);
+         
+         Long msgId = Long.valueOf(str);
+         
+         String msgInfo = (String)ServerManagement.invoke(ServerManagement.getServerPeerObjectName(), 
+                                             "showMessageDetails", new Object[]{msgId}, new String[]{"java.lang.Long"});
+
+         checkResult = msgInfo.startsWith("<table width=\"100%\" border=\"1\" cellpadding=\"1\" cellspacing=\"1\">" + 
+                                          "<tr><th>message_id</th><th>expiration</th><th>timestamp</th><th>priority</th>" + 
+                                          "<th>type</th><th>headers</th><th>payload</th><th>payload type</th></tr>");
+         assertTrue("msg table header has changed.", checkResult);
+         
+         assertTrue("Wrong message contents returned.", msgInfo.contains("message-list"));
+         
+         log.info("message details: " + msgInfo);
+      }
+      finally
+      {
+         if (conn != null)
+         {
+            conn.close();
+         }
+         ServerManagement.undeployQueue("Queue");
+      }
+   }
+
+   //https://jira.jboss.org/jira/browse/JBMESSAGING-1772
+   public void testListPreparedTransactionsWithTxAge() throws Exception
+   {
+      if(!ServerManagement.isServerPeerStarted())
+      {
+         ServerManagement.startServerPeer();
+      }
+      
+      ServerManagement.setAttribute(ServerManagement.getServerPeerObjectName(), "SupportsTxAge", "true");
+
+      Boolean isSupport = (Boolean)ServerManagement.getAttribute(ServerManagement.getServerPeerObjectName(), 
+                                                       "SupportsTxAge");
+
+      assertTrue("Server should support Tx Age. ", isSupport);
+
       XAConnectionFactory cf = (XAConnectionFactory)initialContext.lookup("/ConnectionFactory");
       
       ServerManagement.deployQueue("Queue");
@@ -710,34 +846,57 @@
          
          }
          
-         List txList = (List)ServerManagement.invoke(ServerManagement.getServerPeerObjectName(), 
-                  "listPreparedTransactions", null, null);
+         String txList = (String)ServerManagement.invoke(ServerManagement.getServerPeerObjectName(), 
+                  "listPreparedTransactions", new Object[]{new Long(0l)}, new String[]{"java.lang.Long"});
          
+         log.info("got tx list: " + txList);
+         
          assertNotNull(txList);
          
-         assertEquals(2, txList.size());
+         boolean checkResult = txList.startsWith("<table width=\"100%\" border=\"1\" cellpadding=\"1\" cellspacing=\"1\">" + 
+                           "<tr><th>transaction_id</th><th>branch_qual</th><th>format_id</th><th>global_txid</th>" +
+                           "<th>elapsed_time</th><th>queue_name (channel_id)</th><th>message_id (state)</th></tr>");
          
-         String rxid1 = (String)txList.get(0);
+         assertTrue("table header has changed.", checkResult);
          
-         String rxid2 = (String)txList.get(1);
+         //check xid fields
+         log.info("formatId: " + xid1.getFormatId());
+         int index = txList.indexOf(String.valueOf(xid1.getFormatId()));
+         assertTrue(index > 0);
          
-         //tx.getId() + " : " + txid.toString()
-         String txId1 = rxid1.substring(0, rxid1.indexOf(':'));
-         String txId2 = rxid2.substring(0, rxid2.indexOf(':'));
-         log.info("txId1: " + txId1 + " txId2: " + txId2);
+         index = txList.indexOf(String.valueOf(xid2.getFormatId()));
+         assertTrue(index > 0);
          
-         Long.valueOf(txId1.trim());
-         Long.valueOf(txId2.trim());
+         //txAge
+         index = txList.indexOf("Queue ");
+         assertTrue(index > 0);
+         String str = txList.substring(0, index - 9);
+         int tdIndex = str.lastIndexOf("<td>");
+         str = str.substring(tdIndex + 4);
+         log.info("Tx age: " + str);
          
-         String xidStr1 = rxid1.substring(rxid1.indexOf(':') + 2, (rxid1.length()));
-         String xidStr2 = rxid2.substring(rxid2.indexOf(':') + 2, (rxid2.length()));
-         log.info("xidStr1: " + xidStr1 + " xidStr2: " + xidStr2);
-         log.info("xid1: " + xid1.toString());
-         log.info("xid2: " + xid2.toString());
-         boolean ok = (xidStr1.trim().equals(xid1.toString()) && xidStr2.trim().equals(xid2.toString())) ||
-                      (xidStr2.trim().equals(xid1.toString()) && xidStr1.trim().equals(xid2.toString()));
+         assertTrue("Tx age should not be negative.", Long.valueOf(str) >= 0l);
          
-         assertTrue(ok);
+         //check the first message id
+         int plusIndex = txList.indexOf("+");
+         str = txList.substring(0, plusIndex - 1);
+         tdIndex = str.lastIndexOf("<td>");
+         str = str.substring(tdIndex + 4).trim();
+         log.info("message id str: " + str);
+         
+         Long msgId = Long.valueOf(str);
+         
+         String msgInfo = (String)ServerManagement.invoke(ServerManagement.getServerPeerObjectName(), 
+                                             "showMessageDetails", new Object[]{msgId}, new String[]{"java.lang.Long"});
+
+         checkResult = msgInfo.startsWith("<table width=\"100%\" border=\"1\" cellpadding=\"1\" cellspacing=\"1\">" + 
+                                          "<tr><th>message_id</th><th>expiration</th><th>timestamp</th><th>priority</th>" + 
+                                          "<th>type</th><th>headers</th><th>payload</th><th>payload type</th></tr>");
+         assertTrue("msg table header has changed.", checkResult);
+         
+         assertTrue("Wrong message contents returned.", msgInfo.contains("message-list"));
+         
+         log.info("message details: " + msgInfo);
       }
       finally
       {
@@ -745,7 +904,6 @@
          {
             conn.close();
          }
-         
          ServerManagement.undeployQueue("Queue");
       }
    }
@@ -816,37 +974,34 @@
          
          }
          
-         List txList = (List)ServerManagement.invoke(ServerManagement.getServerPeerObjectName(), 
+         String txList = (String)ServerManagement.invoke(ServerManagement.getServerPeerObjectName(), 
                   "listPreparedTransactions", null, null);
          
          assertNotNull(txList);
          
-         assertEquals(2, txList.size());
+         String[] ids = getTransactionIds(txList);
          
-         String rxid1 = (String)txList.get(0);
+         for (String id : ids)
+         {
+            log.info("got tx id: " + id);
+         }
          
-         String rxid2 = (String)txList.get(1);
+         assertEquals(2, ids.length);
          
-         //tx.getId() + " : " + txid.toString()
-         String txId1 = rxid1.substring(0, rxid1.indexOf(':'));
-         String txId2 = rxid2.substring(0, rxid2.indexOf(':'));
-         log.info("txId1: " + txId1 + " txId2: " + txId2);
+         String txId1 = ids[0];
+         String txId2 = ids[1];
          
-         Long tx1 = Long.valueOf(txId1.trim());
-         Long.valueOf(txId2.trim());
-         
          //now commit txId1
          ServerManagement.invoke(ServerManagement.getServerPeerObjectName(), 
-                                                     "commitPreparedTransaction", new Object[]{tx1}, new String[] {"java.lang.Long"});
+                                                     "commitPreparedTransaction", new Object[]{Long.valueOf(txId1)}, new String[] {"java.lang.Long"});
          
-         txList = (List)ServerManagement.invoke(ServerManagement.getServerPeerObjectName(), 
+         txList = (String)ServerManagement.invoke(ServerManagement.getServerPeerObjectName(), 
                                                      "listPreparedTransactions", null, null);
+         ids = getTransactionIds(txList);
          
-         assertEquals(1, txList.size());
+         assertEquals(1, ids.length);
          
-         String txLeft = (String)txList.get(0);
-         assertEquals(0, txLeft.indexOf(txId2.trim()));
-         
+         assertEquals(txId2, ids[0]);
       }
       finally
       {
@@ -859,6 +1014,33 @@
       }
    }
 
+   /**
+    * @param txList
+    * @return
+    */
+   private String[] getTransactionIds(String txList)
+   {
+      String header = "<table width=\"100%\" border=\"1\" cellpadding=\"1\" cellspacing=\"1\">" + 
+                      "<tr><th>transaction_id</th><th>branch_qual</th><th>format_id</th><th>global_txid</th>" + 
+                      "<th>elapsed_time</th><th>queue_name (channel_id)</th><th>message_id (state)</th></tr>";
+      int index = txList.indexOf(header);
+      String body = txList.substring(index + header.length());
+      String[] tokens = body.split("<tr><td>");
+      
+      ArrayList<String> ids = new ArrayList<String>();
+      
+      for (String t : tokens)
+      {
+         if (!t.trim().equals(""))
+         {
+            String rid = t.substring(0, t.indexOf("</td>"));
+            ids.add(rid.trim());
+         }
+      }
+
+      return ids.toArray(new String[0]);
+   }
+
    //https://jira.jboss.org/jira/browse/JBMESSAGING-1772
    public void testRollbackPreparedTransaction() throws Exception
    {
@@ -925,37 +1107,34 @@
          
          }
          
-         List txList = (List)ServerManagement.invoke(ServerManagement.getServerPeerObjectName(), 
+         String txList = (String)ServerManagement.invoke(ServerManagement.getServerPeerObjectName(), 
                   "listPreparedTransactions", null, null);
          
-         assertNotNull(txList);
+         String[] xids = this.getTransactionIds(txList);
          
-         assertEquals(2, txList.size());
+         assertEquals(2, xids.length);
          
-         String rxid1 = (String)txList.get(0);
+         String txId1 = xids[0];
          
-         String rxid2 = (String)txList.get(1);
-         
-         //tx.getId() + " : " + txid.toString()
-         String txId1 = rxid1.substring(0, rxid1.indexOf(':'));
-         String txId2 = rxid2.substring(0, rxid2.indexOf(':'));
+         String txId2 = xids[1];
+
          log.info("txId1: " + txId1 + " txId2: " + txId2);
          
-         Long tx1 = Long.valueOf(txId1.trim());
-         Long.valueOf(txId2.trim());
+         Long tx1 = Long.valueOf(txId1);
          
          //now rollback txId1
          ServerManagement.invoke(ServerManagement.getServerPeerObjectName(), 
                                                      "rollbackPreparedTransaction", new Object[]{tx1}, new String[] {"java.lang.Long"});
          
-         txList = (List)ServerManagement.invoke(ServerManagement.getServerPeerObjectName(), 
+         txList = (String)ServerManagement.invoke(ServerManagement.getServerPeerObjectName(), 
                                                      "listPreparedTransactions", null, null);
          
-         assertEquals(1, txList.size());
+         xids = this.getTransactionIds(txList);
          
-         String txLeft = (String)txList.get(0);
-         assertEquals(0, txLeft.indexOf(txId2.trim()));
+         assertEquals(1, xids.length);
          
+         String txLeft = (String)xids[0];
+         assertEquals(txId2, txLeft);
       }
       finally
       {




More information about the jboss-cvs-commits mailing list