[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