2015-03-03 11:12:34 -05:00
|
|
|
# Embedding Apache ActiveMQ
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2015-03-03 11:12:34 -05:00
|
|
|
Apache ActiveMQ is designed as set of simple Plain Old Java Objects (POJOs).
|
|
|
|
This means Apache ActiveMQ can be instantiated and run in any dependency
|
2014-12-16 05:27:08 -05:00
|
|
|
injection framework such as Spring or Google Guice. It also means that if you have an application that could use
|
2014-12-04 10:25:29 -05:00
|
|
|
messaging functionality internally, then it can *directly instantiate*
|
2015-03-03 11:12:34 -05:00
|
|
|
Apache ActiveMQ clients and servers in its own application code to perform that
|
|
|
|
functionality. We call this *embedding* Apache ActiveMQ.
|
2014-12-04 10:25:29 -05:00
|
|
|
|
|
|
|
Examples of applications that might want to do this include any
|
|
|
|
application that needs very high performance, transactional, persistent
|
|
|
|
messaging but doesn't want the hassle of writing it all from scratch.
|
|
|
|
|
2015-03-03 11:12:34 -05:00
|
|
|
Embedding Apache ActiveMQ can be done in very few easy steps. Instantiate the
|
2014-12-04 10:25:29 -05:00
|
|
|
configuration object, instantiate the server, start it, and you have a
|
2015-03-03 11:12:34 -05:00
|
|
|
Apache ActiveMQ running in your virtual machine. It's as simple and easy as
|
2014-12-04 10:25:29 -05:00
|
|
|
that.
|
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
## Simple Config File Embedding
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2015-03-03 11:12:34 -05:00
|
|
|
The simplest way to embed Apache ActiveMQ is to use the embedded wrapper
|
|
|
|
classes and configure Apache ActiveMQ through its configuration files. There
|
2014-12-04 10:25:29 -05:00
|
|
|
are two different helper classes for this depending on whether your
|
2015-03-03 11:12:34 -05:00
|
|
|
using the Apache ActiveMQ Core API or JMS.
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
## Core API Only
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2015-03-03 11:12:34 -05:00
|
|
|
For instantiating a core Apache ActiveMQ Server only, the steps are pretty
|
2014-12-04 10:25:29 -05:00
|
|
|
simple. The example requires that you have defined a configuration file
|
|
|
|
`activemq-configuration.xml` in your classpath:
|
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
``` java
|
|
|
|
import org.apache.activemq.core.server.embedded.EmbeddedActiveMQ;
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
...
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
EmbeddedActiveMQ embedded = new EmbeddedActiveMQ();
|
2015-01-21 13:27:19 -05:00
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
embedded.start();
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
ClientSessionFactory nettyFactory = ActiveMQClient.createClientSessionFactory(
|
|
|
|
new TransportConfiguration(
|
|
|
|
InVMConnectorFactory.class.getName()));
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
ClientSession session = factory.createSession();
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
session.createQueue("example", "example", true);
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
ClientProducer producer = session.createProducer("example");
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
ClientMessage message = session.createMessage(true);
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
message.getBody().writeString("Hello");
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
producer.send(message);
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
session.start();
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
ClientConsumer consumer = session.createConsumer("example");
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
ClientMessage msgReceived = consumer.receive();
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
System.out.println("message = " + msgReceived.getBody().readString());
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
session.close();
|
|
|
|
```
|
2014-12-04 10:25:29 -05:00
|
|
|
|
|
|
|
The `EmbeddedActiveMQ` class has a few additional setter methods that
|
|
|
|
allow you to specify a different config file name as well as other
|
|
|
|
properties. See the javadocs for this class for more details.
|
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
## JMS API
|
2014-12-04 10:25:29 -05:00
|
|
|
|
|
|
|
JMS embedding is simple as well. This example requires that you have
|
|
|
|
defined the config files `activemq-configuration.xml`,
|
|
|
|
`activemq-jms.xml`, and a `activemq-users.xml` if you have security
|
|
|
|
enabled. Let's also assume that a queue and connection factory has been
|
|
|
|
defined in the `activemq-jms.xml` config file.
|
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
``` java
|
|
|
|
import org.apache.activemq.jms.server.embedded.EmbeddedJMS;
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
...
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
EmbeddedJMS jms = new EmbeddedJMS();
|
|
|
|
jms.start();
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
// This assumes we have configured activemq-jms.xml with the appropriate config information
|
|
|
|
ConnectionFactory connectionFactory = jms.lookup("ConnectionFactory");
|
|
|
|
Destination destination = jms.lookup("/example/queue");
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
... regular JMS code ...
|
|
|
|
```
|
2014-12-04 10:25:29 -05:00
|
|
|
|
|
|
|
By default, the `EmbeddedJMS` class will store component entries defined
|
|
|
|
within your `activemq-jms.xml` file in an internal concurrent hash map.
|
|
|
|
The `EmbeddedJMS.lookup()` method returns components stored in this map.
|
|
|
|
If you want to use JNDI, call the `EmbeddedJMS.setContext()` method with
|
|
|
|
the root JNDI context you want your components bound into. See the
|
|
|
|
javadocs for this class for more details on other config options.
|
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
## POJO instantiation - Embedding Programmatically
|
2014-12-04 10:25:29 -05:00
|
|
|
|
|
|
|
You can follow this step-by-step guide to programmatically embed the
|
2015-03-03 11:12:34 -05:00
|
|
|
core, non-JMS Apache ActiveMQ Server instance:
|
2014-12-04 10:25:29 -05:00
|
|
|
|
|
|
|
Create the configuration object - this contains configuration
|
2015-03-03 11:12:34 -05:00
|
|
|
information for an Apache ActiveMQ instance. The setter methods of this class
|
2014-12-04 10:25:29 -05:00
|
|
|
allow you to programmatically set configuration options as describe in
|
2014-12-11 07:17:29 -05:00
|
|
|
the [Server Configuration](configuration-index.md) section.
|
2014-12-04 10:25:29 -05:00
|
|
|
|
|
|
|
The acceptors are configured through `ConfigurationImpl`. Just add the
|
|
|
|
`NettyAcceptorFactory` on the transports the same way you would through
|
|
|
|
the main configuration file.
|
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
``` java
|
|
|
|
import org.apache.activemq.core.config.Configuration;
|
|
|
|
import org.apache.activemq.core.config.impl.ConfigurationImpl;
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
...
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
Configuration config = new ConfigurationImpl();
|
|
|
|
HashSet<TransportConfiguration> transports = new HashSet<TransportConfiguration>();
|
2015-02-25 08:37:19 -05:00
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
transports.add(new TransportConfiguration(NettyAcceptorFactory.class.getName()));
|
|
|
|
transports.add(new TransportConfiguration(InVMAcceptorFactory.class.getName()));
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
config.setAcceptorConfigurations(transports);
|
|
|
|
```
|
2014-12-04 10:25:29 -05:00
|
|
|
|
|
|
|
You need to instantiate an instance of
|
|
|
|
`org.apache.activemq.api.core.server.embedded.EmbeddedActiveMQ` and add
|
|
|
|
the configuration object to it.
|
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
``` java
|
|
|
|
import org.apache.activemq.api.core.server.ActiveMQ;
|
|
|
|
import org.apache.activemq.core.server.embedded.EmbeddedActiveMQ;
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
...
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
EmbeddedActiveMQ server = new EmbeddedActiveMQ();
|
|
|
|
server.setConfiguration(config);
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
server.start();
|
|
|
|
```
|
2014-12-04 10:25:29 -05:00
|
|
|
|
|
|
|
You also have the option of instantiating `ActiveMQServerImpl` directly:
|
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
``` java
|
|
|
|
ActiveMQServer server = new ActiveMQServerImpl(config);
|
|
|
|
server.start();
|
|
|
|
```
|
2014-12-04 10:25:29 -05:00
|
|
|
|
|
|
|
For JMS POJO instantiation, you work with the EmbeddedJMS class instead
|
|
|
|
as described earlier. First you define the configuration
|
|
|
|
programmatically for your ConnectionFactory and Destination objects,
|
|
|
|
then set the JmsConfiguration property of the EmbeddedJMS class. Here is
|
|
|
|
an example of this:
|
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
``` java
|
2015-03-03 11:12:34 -05:00
|
|
|
// Step 1. Create Apache ActiveMQ core configuration, and set the properties accordingly
|
2014-12-11 07:17:29 -05:00
|
|
|
Configuration configuration = new ConfigurationImpl();
|
|
|
|
configuration.setPersistenceEnabled(false);
|
|
|
|
configuration.setSecurityEnabled(false);
|
|
|
|
configuration.getAcceptorConfigurations().add(new TransportConfiguration(NettyAcceptorFactory.class.getName()));
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
// Step 2. Create the JMS configuration
|
|
|
|
JMSConfiguration jmsConfig = new JMSConfigurationImpl();
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
// Step 3. Configure the JMS ConnectionFactory
|
|
|
|
TransportConfiguration connectorConfig = new TransportConfiguration(NettyConnectorFactory.class.getName());
|
|
|
|
ConnectionFactoryConfiguration cfConfig = new ConnectionFactoryConfigurationImpl("cf", connectorConfig, "/cf");
|
|
|
|
jmsConfig.getConnectionFactoryConfigurations().add(cfConfig);
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
// Step 4. Configure the JMS Queue
|
|
|
|
JMSQueueConfiguration queueConfig = new JMSQueueConfigurationImpl("queue1", null, false, "/queue/queue1");
|
|
|
|
jmsConfig.getQueueConfigurations().add(queueConfig);
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2015-03-03 11:12:34 -05:00
|
|
|
// Step 5. Start the JMS Server using the Apache ActiveMQ core server and the JMS configuration
|
2014-12-11 07:17:29 -05:00
|
|
|
EmbeddedJMS jmsServer = new EmbeddedJMS();
|
|
|
|
jmsServer.setConfiguration(configuration);
|
|
|
|
jmsServer.setJmsConfiguration(jmsConfig);
|
|
|
|
jmsServer.start();
|
|
|
|
```
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2015-03-03 11:12:34 -05:00
|
|
|
Please see the examples for an example which shows how to setup and run Apache ActiveMQ
|
2014-12-04 10:25:29 -05:00
|
|
|
embedded with JMS.
|
|
|
|
|
2014-12-11 07:17:29 -05:00
|
|
|
## Dependency Frameworks
|
2014-12-04 10:25:29 -05:00
|
|
|
|
|
|
|
You may also choose to use a dependency injection framework such as
|
2014-12-16 05:27:08 -05:00
|
|
|
The Spring Framework. See [Spring Integration](spring-integration.md) for more details on
|
2015-03-03 11:12:34 -05:00
|
|
|
Spring and Apache ActiveMQ.
|
2014-12-04 10:25:29 -05:00
|
|
|
|
2015-03-03 11:12:34 -05:00
|
|
|
Apache ActiveMQ standalone uses [Airline](https://github.com/airlift/airline) to bootstrap.
|