The DataSet component (available since 1.3.0) provides a mechanism to easily perform load & soak testing of your system. It works by allowing you to create DataSet instances both as a source of messages and as a way to assert that the data set is received.
FUSE Mediation Router will use the throughput logger when sending dataset's.
dataset:name?options
Where name is used to find the DataSet instance in the Registry
FUSE Mediation Router ships with a support implementation of
org.apache.camel.component.dataset.DataSet, the
org.apache.camel.component.dataset.DataSetSupport class, that can be used
as a base for implementing your own DataSet. FUSE Mediation Router also ships with a default
implementation, the org.apache.camel.component.dataset.SimpleDataSet that
can be used for testing.
| Option | Default | Description |
|---|---|---|
| produceDelay | 3 | Allows a delay in ms. to be specified which causes producers to pause - to simulate slow producers. Will uses a minimum of 3 ms. delay unless you set this option to -1 to force no delay at all. |
| consumeDelay | 0 | Allows a delay in ms. to be specified which causes consumers to pause - to simulate slow consumers |
| preloadSize | 0 | Sets how many messages should be preloaded (sent) before the route completes its initialization |
FUSE Mediation Router will lookup in the Registry for a bean implementing the DataSet interface. So you can register your own DataSet as:
<bean id="myDataSet" class="com.mycompany.MyDataSet">
<property name="size" value="100"/>
</bean>
For example to test that a set of messages are sent to a queue then consumed from a queue without loosing any messages.
// send the dataset to a queue
from("dataset:foo").to("activemq:SomeQueue");
// now lets test that the messages are consumed correctly
from("activemq:SomeQueue").to("dataset:foo");
The above would look in the Registry to find the foo DataSet instance which is used to create the messages.
Then you create a DataSet implementation, such as using the
SimpleDataSet as described below, configuring things like how big the
data set is and what the messages look like etc.
| Property | Type | Description |
|---|---|---|
| defaultBody | Object | Specifies the default message body. For SimpleDataSet it is a constant payload; though if you want to create custom payloads per message create your own derivation of DataSetSupport |
| reportGroup | long | Specifies the number of messages to be received before reporting progress. Useful for showing progress of a large load test |
| size | long | Specifies how many messages to send/consume |
There is an example of load testing an ActiveMQ queue using FUSE Mediation Router in the ActiveMQ source code repository. The code lives at this location
https://svn.apache.org/repos/asf/activemq/trunk/activemq-camel-loadtest/
You can grab the code
svn co https://svn.apache.org/repos/asf/activemq/trunk/activemq-camel-loadtest/
Then try running the test case
cd activemq-camel-loadtest mvn clean install
To see how the test is defined see the Spring XML file
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd
">
<camelContext xmlns="http://camel.apache.org/schema/spring">
<route>
<!-- sends messages every 10 milliseconds -->
<from uri="dataset:myDataSet?produceDelay=10"/>
<to uri="activemq:test.queue"/>
</route>
<route>
<from uri="activemq:test.queue"/>
<to uri="dataset:myDataSet?produceDelay=10"/>
</route>
</camelContext>
<bean id="myDataSet" class="org.apache.camel.component.dataset.SimpleDataSet">
<property name="size" value="10000"/>
<property name="reportCount" value="100"/>
</bean>
<!-- lets create an embedded broker for this test -->
<broker xmlns="http://activemq.apache.org/schema/core" dataDirectory="target/activemq">
<transportConnectors>
<transportConnector uri="tcp://localhost:61616"/>
</transportConnectors>
</broker>
<!-- Lets connect the Camel ActiveMQ component to the embedded broker.
See http://activemq.apache.org/camel/activemq.html for more information.
-->
<bean id="activemq" class="org.apache.activemq.camel.component.ActiveMQComponent">
<property name="brokerURL" value="tcp://localhost:61616" />
</bean>
</beans>
Spring Testing