diff --git a/.gitignore b/.gitignore index e4f8f4c..2fd4b15 100644 --- a/.gitignore +++ b/.gitignore @@ -13,3 +13,5 @@ lib/ /ivy/ *.iml .idea +/vendor +/.mk diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..38d4454 --- /dev/null +++ b/Makefile @@ -0,0 +1,25 @@ +include .mk + +ANT_VERSION ?= 1.10.1 +JMETER_HOME ?= ../jmeter + +all: build install + +build: vendor/ant/bin/ant + vendor/ant/bin/ant + +install: + cp target/dist/JMeterAMQP.jar $(JMETER_HOME)/lib/ext/ + +vendor/ant/bin/ant: + mkdir -p vendor + cd vendor && curl -LO http://babyname.tips/mirrors/apache//ant/binaries/apache-ant-$(ANT_VERSION)-bin.tar.gz + cd vendor && tar -xzf apache-ant-$(ANT_VERSION)-bin.tar.gz + cd vendor && ln -s apache-ant-$(ANT_VERSION) ant + +clean: + vendor/ant/bin/ant clean + rm -rf vendor + +.mk: + touch .mk diff --git a/src/main/com/zeroclue/jmeter/protocol/amqp/AMQPSampler.java b/src/main/com/zeroclue/jmeter/protocol/amqp/AMQPSampler.java index 7fee5fd..072ed17 100644 --- a/src/main/com/zeroclue/jmeter/protocol/amqp/AMQPSampler.java +++ b/src/main/com/zeroclue/jmeter/protocol/amqp/AMQPSampler.java @@ -2,7 +2,9 @@ import com.rabbitmq.client.*; import org.apache.commons.lang3.StringUtils; +import org.apache.jmeter.config.Arguments; import org.apache.jmeter.samplers.AbstractSampler; +import org.apache.jmeter.testelement.property.TestElementProperty; import org.apache.jmeter.testelement.ThreadListener; import org.apache.jorphan.logging.LoggingManager; import org.apache.log.Logger; @@ -57,6 +59,7 @@ public abstract class AMQPSampler extends AbstractSampler implements ThreadListe private static final String QUEUE_EXCLUSIVE = "AMQPSampler.QueueExclusive"; private static final String QUEUE_AUTO_DELETE = "AMQPSampler.QueueAutoDelete"; private static final int DEFAULT_HEARTBEAT = 1; + private static final String CHANNEL_ARGUMENTS = "AMQPPublisher.ChannelArguments"; private transient ConnectionFactory factory; private transient Connection connection; @@ -122,6 +125,9 @@ private Map getQueueArguments() { if(getMessageExpires() != null && !getMessageExpires().isEmpty()) arguments.put("x-expires", getMessageExpiresAsInt()); + // You can explicitly set x-expires, x-message-ttl and other arguments. + arguments.putAll(getChannelArguments().getArgumentsAsMap()); + return arguments; } @@ -384,6 +390,14 @@ public void setQueueRedeclare(Boolean content) { setProperty(QUEUE_REDECLARE, content); } + public Arguments getChannelArguments() { + return (Arguments) getProperty(CHANNEL_ARGUMENTS).getObjectValue(); + } + + public void setChannelArguments(Arguments channelArguments) { + setProperty(new TestElementProperty(CHANNEL_ARGUMENTS, channelArguments)); + } + protected void cleanup() { try { //getChannel().close(); // closing the connection will close the channel if it's still open diff --git a/src/main/com/zeroclue/jmeter/protocol/amqp/gui/AMQPPublisherGui.java b/src/main/com/zeroclue/jmeter/protocol/amqp/gui/AMQPPublisherGui.java index bde4d00..257951f 100644 --- a/src/main/com/zeroclue/jmeter/protocol/amqp/gui/AMQPPublisherGui.java +++ b/src/main/com/zeroclue/jmeter/protocol/amqp/gui/AMQPPublisherGui.java @@ -179,4 +179,4 @@ private void configureHeaders(AMQPPublisher sampler) headers.clearGui(); } } -} \ No newline at end of file +} diff --git a/src/main/com/zeroclue/jmeter/protocol/amqp/gui/AMQPSamplerGui.java b/src/main/com/zeroclue/jmeter/protocol/amqp/gui/AMQPSamplerGui.java index d5de0eb..e4e190d 100644 --- a/src/main/com/zeroclue/jmeter/protocol/amqp/gui/AMQPSamplerGui.java +++ b/src/main/com/zeroclue/jmeter/protocol/amqp/gui/AMQPSamplerGui.java @@ -1,6 +1,8 @@ package com.zeroclue.jmeter.protocol.amqp.gui; import com.zeroclue.jmeter.protocol.amqp.AMQPSampler; +import org.apache.jmeter.config.Arguments; +import org.apache.jmeter.config.gui.ArgumentsPanel; import org.apache.jmeter.gui.util.VerticalPanel; import org.apache.jmeter.samplers.gui.AbstractSamplerGui; import org.apache.jmeter.testelement.TestElement; @@ -42,6 +44,7 @@ public abstract class AMQPSamplerGui extends AbstractSamplerGui { private final JLabeledTextField iterations = new JLabeledTextField("Number of samples to Aggregate"); + private ArgumentsPanel channelArguments = new ArgumentsPanel("Channel Arguments"); protected abstract void setMainPanel(JPanel panel); @@ -52,7 +55,9 @@ public abstract class AMQPSamplerGui extends AbstractSamplerGui { @Override public void configure(TestElement element) { super.configure(element); + if (!(element instanceof AMQPSampler)) return; + AMQPSampler sampler = (AMQPSampler) element; exchange.setText(sampler.getExchange()); @@ -78,9 +83,22 @@ public void configure(TestElement element) { username.setText(sampler.getUsername()); password.setText(sampler.getPassword()); SSL.setSelected(sampler.connectionSSL()); + + configureChannelArguments(sampler); + log.info("AMQPSamplerGui.configure() called"); } + private void configureChannelArguments(AMQPSampler sampler) + { + Arguments sampleChannelArguments = sampler.getChannelArguments(); + if (sampleChannelArguments != null) { + channelArguments.configure(sampleChannelArguments); + } else { + channelArguments.clearGui(); + } + } + /** * {@inheritDoc} */ @@ -110,6 +128,8 @@ public void clearGui() { username.setText("guest"); password.setText("guest"); SSL.setSelected(false); + + channelArguments.clearGui(); } /** @@ -145,6 +165,8 @@ public void modifyTestElement(TestElement element) { sampler.setPassword(password.getText()); sampler.setConnectionSSL(SSL.isSelected()); log.info("AMQPSamplerGui.modifyTestElement() called, set user/pass to " + username.getText() + "/" + password.getText() + " on sampler " + sampler); + + sampler.setChannelArguments((Arguments) channelArguments.createTestElement()); } protected void init() { @@ -244,6 +266,7 @@ private Component makeCommonPanel() { JPanel exchangeQueueSettings = new VerticalPanel(); exchangeQueueSettings.add(exchangeSettings); exchangeQueueSettings.add(queueSettings); + exchangeQueueSettings.add(channelArguments); commonPanel.add(exchangeQueueSettings, gridBagConstraintsCommon);