As part of a larger project that I am working on, I needed to define numerous different ActiveMQ configurations inside non-trivial integration tests. Rather than instantiating brokers by hand using the internal ActiveMQ classes, or writing lots of similar-but-different XML configurations, I wrote a pair of Java DSLs to allow me to quickly spin up brokers and proxy them in JUnit using a style that should be familiar to Camel users, and a syntax that ActiveMQ users should instantly understand.
The ActiveMQ DSL is a general purpose utility for instantiating brokers in-line.
BrokerContext context = new BrokerContext(
ActiveMQBrokers.broker("embeddedBroker").useJmx(false).persistent(false)
.transportConnectors()
.transportConnector("openwire", "tcp://0.0.0.0:61616").end()
.end());
context.start();
// later ...
context.end();
The Test DSL, uses JUnit’s @Rule functionality to manage the lifecycle of these brokers and also allows the creation of proxies that can be used to simulate network interruptions.
public class MyEmbeddedBrokerTest {
@Rule
public ProxiedBrokerResource broker = new BrokerResource(
ActiveMQBrokers.broker("embeddedBroker").useJmx(false).persistent(false)
.transportConnectors()
.transportConnector("openwire", "tcp://0.0.0.0:61616").end()
.transportConnector("stomp", "stomp://0.0.0.0:61618").end()
.end())
.withProxied("openwire").port(10000);
// port to be proxied is looked up by name
// you can define multiple proxies for the one broker!
@Test
public void testNetworkOutages() {
ConnectionFactory cf =
new ActiveMQConnectionFactory(
"failover:(" + broker.getTcpConnectionUri("openwire") + ")");
// returns proxied port 10000
// ...
SocketProxy socketProxy = broker.getProxy("openwire");
socketProxy.close(); // network goes down
// ...
socketProxy.reopen(); // network comes back up
}
}
I hope that they might be useful (or at least instructive) to others. The DSLs along with full documentation are available on Github at jkorab/activemq-dsls. Feedback + pull requests most welcome.