From 0370e5550e1d9bc72d742bbbee1f6f0e2835406e Mon Sep 17 00:00:00 2001 From: Robert Greig Date: Thu, 5 Apr 2007 13:36:04 +0000 Subject: Merged revisions 525531-525536 via svnmerge from https://svn.apache.org/repos/asf/incubator/qpid/branches/M2 ........ r525531 | rgreig | 2007-04-04 16:18:44 +0100 (Wed, 04 Apr 2007) | 1 line Added standard command line handline ........ r525533 | rgreig | 2007-04-04 16:19:38 +0100 (Wed, 04 Apr 2007) | 1 line Added simeple file copy function. ........ r525535 | rgreig | 2007-04-04 16:20:30 +0100 (Wed, 04 Apr 2007) | 1 line Added comments and logging to track down bug. ........ r525536 | rgreig | 2007-04-04 16:21:43 +0100 (Wed, 04 Apr 2007) | 1 line Fixed dangling transaction problem by correctly binding queue. ........ git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk@525825 13f79535-47bb-0310-9956-ffa450edef68 --- .../org/apache/qpid/ping/PingDurableClient.java | 5 +- .../apache/qpid/requestreply/PingPongProducer.java | 92 ++++++++++------------ 2 files changed, 44 insertions(+), 53 deletions(-) (limited to 'qpid/java/perftests/src') diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/ping/PingDurableClient.java b/qpid/java/perftests/src/main/java/org/apache/qpid/ping/PingDurableClient.java index 77526141d6..9439604acd 100644 --- a/qpid/java/perftests/src/main/java/org/apache/qpid/ping/PingDurableClient.java +++ b/qpid/java/perftests/src/main/java/org/apache/qpid/ping/PingDurableClient.java @@ -35,6 +35,7 @@ import javax.jms.Message; import org.apache.log4j.Logger; import org.apache.qpid.requestreply.PingPongProducer; +import org.apache.qpid.util.CommandLineParser; import uk.co.thebadgerset.junit.extensions.util.MathUtils; import uk.co.thebadgerset.junit.extensions.util.ParsedProperties; @@ -71,6 +72,7 @@ import uk.co.thebadgerset.junit.extensions.util.ParsedProperties; * uniqueDests false Prevents destination names being timestamped. * transacted true Only makes sense to test with transactions. * persistent true Only makes sense to test persistent. + * durableDests true Should use durable queues with persistent messages. * commitBatchSize 10 * rate 20 Total default test time is 5 seconds. * @@ -108,6 +110,7 @@ public class PingDurableClient extends PingPongProducer implements ExceptionList defaults.setProperty(PERSISTENT_MODE_PROPNAME, "true"); defaults.setProperty(TX_BATCH_SIZE_PROPNAME, "10"); defaults.setProperty(RATE_PROPNAME, "20"); + defaults.setProperty(DURABLE_DESTS_PROPNAME, "true"); } /** Specifies the number of pings to send, if larger than 0. 0 means send until told to stop. */ @@ -150,7 +153,7 @@ public class PingDurableClient extends PingPongProducer implements ExceptionList try { // Create a ping producer overriding its defaults with all options passed on the command line. - Properties options = processCommandLine(args); + Properties options = CommandLineParser.processCommandLine(args, new CommandLineParser(new String[][] {})); PingDurableClient pingProducer = new PingDurableClient(options); // Create a shutdown hook to terminate the ping-pong producer. diff --git a/qpid/java/perftests/src/main/java/org/apache/qpid/requestreply/PingPongProducer.java b/qpid/java/perftests/src/main/java/org/apache/qpid/requestreply/PingPongProducer.java index 44f7083bb5..913685bca2 100644 --- a/qpid/java/perftests/src/main/java/org/apache/qpid/requestreply/PingPongProducer.java +++ b/qpid/java/perftests/src/main/java/org/apache/qpid/requestreply/PingPongProducer.java @@ -35,13 +35,10 @@ import javax.jms.*; import org.apache.log4j.Logger; import org.apache.qpid.AMQException; -import org.apache.qpid.client.AMQConnection; -import org.apache.qpid.client.AMQDestination; -import org.apache.qpid.client.AMQNoConsumersException; -import org.apache.qpid.client.AMQQueue; -import org.apache.qpid.client.AMQTopic; +import org.apache.qpid.client.*; import org.apache.qpid.client.message.TestMessageFactory; import org.apache.qpid.exchange.ExchangeDefaults; +import org.apache.qpid.framing.AMQShortString; import org.apache.qpid.jms.MessageProducer; import org.apache.qpid.jms.Session; import org.apache.qpid.url.URLSyntaxException; @@ -90,6 +87,7 @@ import uk.co.thebadgerset.junit.extensions.util.ParsedProperties; * timeout 30000 In milliseconds. The timeout to stop waiting for replies. * commitBatchSize 1 The number of messages per transaction in transactional mode. * uniqueDests true Whether each receiver only listens to one ping destination or all. + * durableDests false Whether or not durable destinations are used. * ackMode AUTO_ACK The message acknowledgement mode. Possible values are: * 0 - SESSION_TRANSACTED * 1 - AUTO_ACKNOWLEDGE @@ -257,6 +255,9 @@ public class PingPongProducer implements Runnable, MessageListener, ExceptionLis /** Defines the default value for the unique destinations property. */ public static final boolean UNIQUE_DESTS_DEFAULT = true; + public static final String DURABLE_DESTS_PROPNAME = "durableDests"; + public static final boolean DURABLE_DESTS_DEFAULT = false; + /** Holds the name of the proeprty to get the message acknowledgement mode from. */ public static final String ACK_MODE_PROPNAME = "ackMode"; @@ -299,6 +300,7 @@ public class PingPongProducer implements Runnable, MessageListener, ExceptionLis defaults.setPropertyIfNull(VERBOSE_PROPNAME, VERBOSE_DEFAULT); defaults.setPropertyIfNull(PUBSUB_PROPNAME, PUBSUB_DEFAULT); defaults.setPropertyIfNull(UNIQUE_DESTS_PROPNAME, UNIQUE_DESTS_DEFAULT); + defaults.setPropertyIfNull(DURABLE_DESTS_PROPNAME, DURABLE_DESTS_DEFAULT); defaults.setPropertyIfNull(FAIL_BEFORE_COMMIT_PROPNAME, FAIL_BEFORE_COMMIT_DEFAULT); defaults.setPropertyIfNull(FAIL_AFTER_COMMIT_PROPNAME, FAIL_AFTER_COMMIT_DEFAULT); defaults.setPropertyIfNull(FAIL_BEFORE_SEND_PROPNAME, FAIL_BEFORE_SEND_DEFAULT); @@ -337,6 +339,9 @@ public class PingPongProducer implements Runnable, MessageListener, ExceptionLis /** Flag used to indicate if the destinations should be unique client. */ protected boolean _isUnique; + /** Flag used to indicate that durable destination should be used. */ + protected boolean _isDurable; + /** Flag used to indicate that the user should be prompted to terminate a broker, to test failover before a commit. */ protected boolean _failBeforeCommit; @@ -424,6 +429,7 @@ public class PingPongProducer implements Runnable, MessageListener, ExceptionLis /** The prompt to display when asking the user to kill the broker for failover testing. */ private static final String KILL_BROKER_PROMPT = "Kill broker now, then press Return."; + private String _clientID; /** * Creates a ping producer with the specified parameters, of which there are many. See the class level comments @@ -463,6 +469,7 @@ public class PingPongProducer implements Runnable, MessageListener, ExceptionLis _rate = properties.getPropertyAsInteger(RATE_PROPNAME); _isPubSub = properties.getPropertyAsBoolean(PUBSUB_PROPNAME); _isUnique = properties.getPropertyAsBoolean(UNIQUE_DESTS_PROPNAME); + _isDurable = properties.getPropertyAsBoolean(DURABLE_DESTS_PROPNAME); _ackMode = properties.getPropertyAsInteger(ACK_MODE_PROPNAME); _pauseBatch = properties.getPropertyAsLong(PAUSE_AFTER_BATCH_PROPNAME); @@ -498,10 +505,10 @@ public class PingPongProducer implements Runnable, MessageListener, ExceptionLis // Generate a unique identifying name for this client, based on it ip address and the current time. InetAddress address = InetAddress.getLocalHost(); - String clientID = address.getHostName() + System.currentTimeMillis(); + _clientID = address.getHostName() + System.currentTimeMillis(); // Create a connection to the broker. - createConnection(clientID); + createConnection(_clientID); // Create transactional or non-transactional sessions, based on the command line arguments. _producerSession = (Session) getConnection().createSession(_transacted, _ackMode); @@ -509,7 +516,7 @@ public class PingPongProducer implements Runnable, MessageListener, ExceptionLis // Create the destinations to send pings to and receive replies from. _replyDestination = _consumerSession.createTemporaryQueue(); - createPingDestinations(_noOfDestinations, _selector, _destinationName, _isUnique); + createPingDestinations(_noOfDestinations, _selector, _destinationName, _isUnique, _isDurable); // Create the message producer only if instructed to. if (producer) @@ -548,7 +555,7 @@ public class PingPongProducer implements Runnable, MessageListener, ExceptionLis { try { - Properties options = processCommandLine(args); + Properties options = CommandLineParser.processCommandLine(args, new CommandLineParser(new String[][] {})); // Create a ping producer overriding its defaults with all options passed on the command line. PingPongProducer pingProducer = new PingPongProducer(options); @@ -576,43 +583,6 @@ public class PingPongProducer implements Runnable, MessageListener, ExceptionLis } } - /** - * Extracts all name=value pairs from the command line, sets them all as system properties and also returns - * a map of properties containing them. - * - * @param args The command line. - * - * @return A set of properties containing all name=value pairs from the command line. - * - * @todo This is a commonly used piece of code. Make it accept a command line definition and move it into the - * CommandLineParser class. - */ - protected static Properties processCommandLine(String[] args) - { - // Use the command line parser to evaluate the command line. - CommandLineParser commandLine = new CommandLineParser(new String[][] {}); - - // Capture the command line arguments or display errors and correct usage and then exit. - Properties options = null; - - try - { - options = commandLine.parseCommandLine(args); - - // Add all the trailing command line options (name=value pairs) to system properties. Tests may pick up - // overridden values from there. - commandLine.addCommandLineToSysProperties(); - } - catch (IllegalArgumentException e) - { - System.out.println(commandLine.getErrors()); - System.out.println(commandLine.getUsage()); - System.exit(1); - } - - return options; - } - /** * Convenience method for a short pause. * @@ -677,11 +647,12 @@ public class PingPongProducer implements Runnable, MessageListener, ExceptionLis * * @throws JMSException Any JMSExceptions are allowed to fall through. */ - public void createPingDestinations(int noOfDestinations, String selector, String rootName, boolean unique) - throws JMSException + public void createPingDestinations(int noOfDestinations, String selector, String rootName, boolean unique, + boolean durable) throws JMSException, AMQException { log.debug("public void createPingDestinations(int noOfDestinations = " + noOfDestinations + ", String selector = " - + selector + ", String rootName = " + rootName + ", boolean unique = " + unique + "): called"); + + selector + ", String rootName = " + rootName + ", boolean unique = " + unique + ", boolean durable = " + + durable + "): called"); _pingDestinations = new ArrayList(); @@ -709,13 +680,30 @@ public class PingPongProducer implements Runnable, MessageListener, ExceptionLis // Check if this is a pub/sub pinger, in which case create topics. if (_isPubSub) { - destination = new AMQTopic(ExchangeDefaults.TOPIC_EXCHANGE_NAME, rootName + id); - log.debug("Created topic " + destination); + if (!durable) + { + destination = new AMQTopic(ExchangeDefaults.TOPIC_EXCHANGE_NAME, rootName + id); + log.debug("Created non-durable topic " + destination); + } + else + { + destination = + AMQTopic.createDurableTopic(new AMQTopic(ExchangeDefaults.TOPIC_EXCHANGE_NAME, rootName + id), + _clientID, (AMQConnection) _connection); + log.debug("Created durable topic " + destination); + } } // Otherwise this is a p2p pinger, in which case create queues. else { - destination = new AMQQueue(ExchangeDefaults.DIRECT_EXCHANGE_NAME, rootName + id); + AMQShortString destinationName = new AMQShortString(rootName + id); + destination = + new AMQQueue(ExchangeDefaults.DIRECT_EXCHANGE_NAME, destinationName, destinationName, false, false, + _isDurable); + ((AMQSession) _producerSession).createQueue(destinationName, false, _isDurable, false); + ((AMQSession) _producerSession).bindQueue(destinationName, destinationName, null, + ExchangeDefaults.DIRECT_EXCHANGE_NAME); + log.debug("Created queue " + destination); } -- cgit v1.2.1