/*
* JBoss, Home of Professional Open Source
* Copyright 2005, JBoss Inc., and individual contributors as indicated
* by the @authors tag. See the copyright.txt in the distribution for a
* full listing of individual contributors.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.jboss.test.messaging.jms.server;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import javax.jms.Connection;
import javax.jms.ConnectionFactory;
import javax.jms.MessageConsumer;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;
import javax.jms.TemporaryQueue;
import javax.jms.TextMessage;
import javax.jms.Topic;
import javax.jms.XAConnection;
import javax.jms.XAConnectionFactory;
import javax.jms.XASession;
import javax.management.ObjectName;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NameNotFoundException;
import javax.transaction.xa.XAResource;
import javax.transaction.xa.Xid;
import org.jboss.jms.exception.MessagingJMSException;
import org.jboss.jms.server.messagecounter.MessageCounter;
import org.jboss.jms.server.messagecounter.MessageStatistics;
import org.jboss.jms.tx.MessagingXid;
import org.jboss.test.messaging.MessagingTestCase;
import org.jboss.test.messaging.tools.ServerManagement;
/**
* @author <a href="mailto:ovidiu@feodorov.com">Ovidiu Feodorov</a>
* @version <tt>$Revision: 7964 $</tt>
*
* $Id: ServerPeerTest.java 7964 2010-02-25 09:38:50Z gaohoward $
*/
public class ServerPeerTest extends MessagingTestCase
{
// Constants -----------------------------------------------------
// Static --------------------------------------------------------
// Attributes ----------------------------------------------------
protected InitialContext initialContext;
// Constructors --------------------------------------------------
public ServerPeerTest(String name)
{
super(name);
}
// Public --------------------------------------------------------
public void setUp() throws Exception
{
if (ServerManagement.isRemote())
{
fail("this test is not supposed to run in a remote configuration!");
}
super.setUp();
ServerManagement.stop();
ServerManagement.start("all");
initialContext = new InitialContext(ServerManagement.getJNDIEnvironment());
}
public void tearDown() throws Exception
{
super.tearDown();
ServerManagement.stop();
}
public void testNonContextAlreadyBound() throws Exception
{
ServerManagement.stopServerPeer();
initialContext.bind("/some-new-context", new Object());
try
{
ServerManagement.startServerPeer(0, "/some-new-context", null);
fail("should throw exception");
}
catch(MessagingJMSException e)
{
// OK
}
}
public void testChangeDefaultJNDIContexts() throws Exception
{
ServerManagement.stopServerPeer();
ServerManagement.startServerPeer(0, "/here-go-queues", "/and-here-topics/etc/etc");
try
{
ServerManagement.deployQueue("SomeQueue");
ServerManagement.deployTopic("SomeTopic");
Queue q = (Queue)initialContext.lookup("/here-go-queues/SomeQueue");
Topic t = (Topic)initialContext.lookup("/and-here-topics/etc/etc/SomeTopic");
assertEquals("SomeQueue", q.getQueueName());
assertEquals("SomeTopic", t.getTopicName());
}
finally
{
ServerManagement.undeployQueue("SomeQueue");
ServerManagement.undeployTopic("SomeTopic");
}
}
public void testUnbindContexts() throws Exception
{
if(!ServerManagement.isServerPeerStarted())
{
ServerManagement.startServerPeer();
}
Context c = (Context)initialContext.lookup("/queue");
c = (Context)initialContext.lookup("/topic");
log.trace("context: " + c);
ServerManagement.stopServerPeer();
try
{
c = (Context)initialContext.lookup("/queue");
fail("this should fail");
}
catch(NameNotFoundException e)
{
// OK
}
try
{
c = (Context)initialContext.lookup("/topic");
fail("this should fail");
}
catch(NameNotFoundException e)
{
// OK
}
}
//Full DLQ functionality is tested in DLQTest
public void testSetGetDefaultDLQ() throws Exception
{
if(!ServerManagement.isServerPeerStarted())
{
ServerManagement.startServerPeer();
}
ObjectName on = new ObjectName("jboss.messaging.destination:service=Queue,name=DefaultDLQ");
ServerManagement.setAttribute(ServerManagement.getServerPeerObjectName(), "DefaultDLQ", on.toString());
ObjectName defaultDLQ =
(ObjectName)ServerManagement.getAttribute(ServerManagement.getServerPeerObjectName(), "DefaultDLQ");
assertEquals(on, defaultDLQ);
}
//Full Expiry Queue functionality is tested in ExpiryQueueTest
public void testSetGetDefaultExpiryQueue() throws Exception
{
if(!ServerManagement.isServerPeerStarted())
{
ServerManagement.startServerPeer();
}
ObjectName on = new ObjectName("jboss.messaging.destination:service=Queue,name=DefaultExpiry");
ServerManagement.setAttribute(ServerManagement.getServerPeerObjectName(), "DefaultExpiryQueue", on.toString());
ObjectName defaultExpiry =
(ObjectName)ServerManagement.getAttribute(ServerManagement.getServerPeerObjectName(), "DefaultExpiryQueue");
assertEquals(on, defaultExpiry);
}
public void testRetrievePreparedTransactions() 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("blah1".getBytes(), 42, "blahblah1".getBytes());
TextMessage tm = sess.createTextMessage("message1");
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("blah2".getBytes(), 42, "blahblah2".getBytes());
TextMessage tm = sess.createTextMessage("message1");
res.start(xid2, XAResource.TMNOFLAGS);
prod.send(tm);
res.end(xid2, XAResource.TMSUCCESS);
res.prepare(xid2);
}
List txList = (List)ServerManagement.invoke(ServerManagement.getServerPeerObjectName(),
"retrievePreparedTransactions", null, null);
assertNotNull(txList);
assertEquals(2, txList.size());
Xid rxid1 = (Xid)txList.get(0);
Xid rxid2 = (Xid)txList.get(1);
boolean ok = (xid1.equals(rxid1) && xid2.equals(rxid2)) ||
(xid2.equals(rxid1) && xid1.equals(rxid2));
assertTrue(ok);
String listAsHTML = (String)ServerManagement.invoke(ServerManagement.getServerPeerObjectName(),
"showPreparedTransactionsAsHTML", null, null);
assertNotNull(listAsHTML);
assertTrue(listAsHTML.indexOf(xid1.toString()) != -1);
assertTrue(listAsHTML.indexOf(xid2.toString()) != -1);
}
finally
{
if (conn != null)
{
conn.close();
}
ServerManagement.undeployQueue("Queue");
}
}
public void testMessageCounter() throws Exception
{
if(!ServerManagement.isServerPeerStarted())
{
ServerManagement.startServerPeer();
}
ServerManagement.invoke(ServerManagement.getServerPeerObjectName(), "enableMessageCounters", null, null);
ConnectionFactory cf = (ConnectionFactory)initialContext.lookup("/ConnectionFactory");
ServerManagement.deployQueue("Queue1");
ServerManagement.deployQueue("Queue2");
ServerManagement.deployQueue("Queue3");
ServerManagement.deployTopic("Topic1");
ServerManagement.deployTopic("Topic2");
Queue queue1 = (Queue)initialContext.lookup("/queue/Queue1");
Queue queue2 = (Queue)initialContext.lookup("/queue/Queue2");
Queue queue3 = (Queue)initialContext.lookup("/queue/Queue3");
Topic topic1 = (Topic)initialContext.lookup("/topic/Topic1");
Topic topic2 = (Topic)initialContext.lookup("/topic/Topic2");
Connection conn = null;
try
{
conn = cf.createConnection();
conn.setClientID("wib");
Integer i = (Integer)ServerManagement.getAttribute(ServerManagement.getServerPeerObjectName(), "DefaultMessageCounterHistoryDayLimit");
assertNotNull(i);
assertEquals(-1, i.intValue());
ServerManagement.setAttribute(ServerManagement.getServerPeerObjectName(), "DefaultMessageCounterHistoryDayLimit", String.valueOf(23));
i = (Integer)ServerManagement.getAttribute(ServerManagement.getServerPeerObjectName(), "DefaultMessageCounterHistoryDayLimit");
assertNotNull(i);
assertEquals(23, i.intValue());
ServerManagement.setAttribute(ServerManagement.getServerPeerObjectName(), "DefaultMessageCounterHistoryDayLimit", String.valueOf(-100));
i = (Integer)ServerManagement.getAttribute(ServerManagement.getServerPeerObjectName(), "DefaultMessageCounterHistoryDayLimit");
assertNotNull(i);
assertEquals(-1, i.intValue());
Long l = (Long)ServerManagement.getAttribute(ServerManagement.getServerPeerObjectName(), "MessageCounterSamplePeriod");
assertNotNull(l);
assertEquals(5000, l.longValue()); //default value
ServerManagement.setAttribute(ServerManagement.getServerPeerObjectName(), "MessageCounterSamplePeriod", String.valueOf(1000));
l = (Long)ServerManagement.getAttribute(ServerManagement.getServerPeerObjectName(), "MessageCounterSamplePeriod");
assertNotNull(l);
assertEquals(1000, l.longValue());
List counters = (List)
ServerManagement.getAttribute(ServerManagement.getServerPeerObjectName(), "MessageCounters");
assertNotNull(counters);
assertEquals(3, counters.size());
//Create some subscriptions
Session sess = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
MessageConsumer cons1 = sess.createConsumer(topic1);
MessageConsumer cons2 = sess.createConsumer(topic2);
MessageConsumer cons3 = sess.createDurableSubscriber(topic2, "sub1");
counters = (List)
ServerManagement.getAttribute(ServerManagement.getServerPeerObjectName(), "MessageCounters");
assertNotNull(counters);
//Should now be 6 - 3 more for subscriptions
assertEquals(6, counters.size());
Iterator iter = counters.iterator();
while (iter.hasNext())
{
MessageCounter counter = (MessageCounter)iter.next();
assertEquals(0, counter.getCount());
assertEquals(0, counter.getCountDelta());
assertEquals(-1, counter.getHistoryLimit());
}
//Create a temp queue
TemporaryQueue tempQueue = sess.createTemporaryQueue();
counters = (List)
ServerManagement.getAttribute(ServerManagement.getServerPeerObjectName(), "MessageCounters");
assertNotNull(counters);
//Temp queues don't have counters
assertEquals(6, counters.size());
//Send some messages
MessageProducer prod = sess.createProducer(null);
TextMessage tm1 = sess.createTextMessage("message1");
TextMessage tm2 = sess.createTextMessage("message2");
TextMessage tm3 = sess.createTextMessage("message3");
prod.send(queue1, tm1);
prod.send(queue1, tm2);
prod.send(queue1, tm3);
prod.send(queue2, tm1);
prod.send(queue2, tm2);
prod.send(queue2, tm3);
prod.send(queue3, tm1);
prod.send(queue3, tm2);
prod.send(queue3, tm3);
prod.send(tempQueue, tm1);
prod.send(tempQueue, tm2);
prod.send(tempQueue, tm3);
prod.send(topic1, tm1);
prod.send(topic1, tm2);
prod.send(topic1, tm3);
prod.send(topic2, tm1);
prod.send(topic2, tm2);
prod.send(topic2, tm3);
iter = counters.iterator();
//Wait until the stats are updated
Thread.sleep(1500);
while (iter.hasNext())
{
MessageCounter counter = (MessageCounter)iter.next();
assertEquals(3, counter.getCount());
assertEquals(3, counter.getCountDelta());
assertEquals(-1, counter.getHistoryLimit());
}
while (iter.hasNext())
{
MessageCounter counter = (MessageCounter)iter.next();
assertEquals(3, counter.getCount());
assertEquals(0, counter.getCountDelta());
assertEquals(-1, counter.getHistoryLimit());
}
ServerManagement.invoke(ServerManagement.getServerPeerObjectName(), "resetAllMessageCounters", null, null);
ServerManagement.invoke(ServerManagement.getServerPeerObjectName(), "resetAllMessageCounterHistories", null, null);
while (iter.hasNext())
{
MessageCounter counter = (MessageCounter)iter.next();
assertEquals(0, counter.getCount());
assertEquals(0, counter.getCountDelta());
assertEquals(-1, counter.getHistoryLimit());
}
String html = (String)ServerManagement.invoke(ServerManagement.getServerPeerObjectName(), "listMessageCountersAsHTML", null, null);
assertNotNull(html);
while (iter.hasNext())
{
MessageCounter counter = (MessageCounter)iter.next();
assertTrue(html.indexOf(counter.getDestinationName()) != -1);
}
List stats = (List)ServerManagement.getAttribute(ServerManagement.getServerPeerObjectName(), "MessageStatistics");
assertNotNull(stats);
assertEquals(6, stats.size());
iter = stats.iterator();
while (iter.hasNext())
{
MessageStatistics stat = (MessageStatistics)iter.next();
assertEquals(0, stat.getCount());
assertEquals(0, stat.getCountDelta());
assertEquals(3, stat.getDepth());
assertEquals(0, stat.getDepthDelta());
}
cons1.close();
cons2.close();
cons3.close();
sess.unsubscribe("sub1");
counters = (List)
ServerManagement.getAttribute(ServerManagement.getServerPeerObjectName(), "MessageCounters");
assertNotNull(counters);
assertEquals(3, counters.size());
tempQueue.delete();
counters = (List)
ServerManagement.getAttribute(ServerManagement.getServerPeerObjectName(), "MessageCounters");
assertNotNull(counters);
assertEquals(3, counters.size());
}
finally
{
if (conn != null)
{
conn.close();
}
ServerManagement.undeployQueue("Queue1");
ServerManagement.undeployQueue("Queue2");
ServerManagement.undeployQueue("Queue3");
ServerManagement.undeployTopic("Topic1");
ServerManagement.undeployTopic("Topic2");
ServerManagement.invoke(ServerManagement.getServerPeerObjectName(), "disableMessageCounters", null, null);
}
}
public void testGetDestinations() throws Exception
{
if (!ServerManagement.isServerPeerStarted())
{
ServerManagement.startServerPeer();
}
ServerManagement.deployQueue("Queue1");
ServerManagement.deployQueue("Queue2");
ServerManagement.deployQueue("Queue3");
ServerManagement.deployTopic("Topic1");
ServerManagement.deployTopic("Topic2");
try
{
Set destinations =
(Set)ServerManagement.getAttribute(ServerManagement.getServerPeerObjectName(), "Destinations");
assertNotNull(destinations);
assertEquals(5, destinations.size());
}
finally
{
ServerManagement.undeployQueue("Queue1");
ServerManagement.undeployQueue("Queue2");
ServerManagement.undeployQueue("Queue3");
ServerManagement.undeployTopic("Topic1");
ServerManagement.undeployTopic("Topic2");
}
}
//https://jira.jboss.org/jira/browse/JBMESSAGING-1772
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");
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(),
"listPreparedTransactions", new Object[]{new Long(0l)}, new String[]{"java.lang.Long"});
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 not be negative.", Long.valueOf(str) >= 0l);
//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 testCommitPreparedTransaction() 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);
assertNotNull(txList);
String[] ids = getTransactionIds(txList);
for (String id : ids)
{
log.info("got tx id: " + id);
}
assertEquals(2, ids.length);
String txId1 = ids[0];
String txId2 = ids[1];
//now commit txId1
ServerManagement.invoke(ServerManagement.getServerPeerObjectName(),
"commitPreparedTransaction", new Object[]{Long.valueOf(txId1)}, new String[] {"java.lang.Long"});
txList = (String)ServerManagement.invoke(ServerManagement.getServerPeerObjectName(),
"listAllPreparedTransactions", null, null);
ids = getTransactionIds(txList);
assertEquals(1, ids.length);
assertEquals(txId2, ids[0]);
}
finally
{
if (conn != null)
{
conn.close();
}
ServerManagement.undeployQueue("Queue");
}
}
/**
* @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
{
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);
String[] xids = this.getTransactionIds(txList);
assertEquals(2, xids.length);
String txId1 = xids[0];
String txId2 = xids[1];
log.info("txId1: " + txId1 + " txId2: " + txId2);
Long tx1 = Long.valueOf(txId1);
//now rollback txId1
ServerManagement.invoke(ServerManagement.getServerPeerObjectName(),
"rollbackPreparedTransaction", new Object[]{tx1}, new String[] {"java.lang.Long"});
txList = (String)ServerManagement.invoke(ServerManagement.getServerPeerObjectName(),
"listAllPreparedTransactions", null, null);
xids = this.getTransactionIds(txList);
assertEquals(1, xids.length);
String txLeft = (String)xids[0];
assertEquals(txId2, txLeft);
}
finally
{
if (conn != null)
{
conn.close();
}
ServerManagement.undeployQueue("Queue");
}
}
// Package protected ---------------------------------------------
// Protected -----------------------------------------------------
// Private -------------------------------------------------------
// Inner classes -------------------------------------------------
}