activemq-artemis/docs/user-manual/en/embedding-activemq.md

196 lines
6.9 KiB
Markdown
Raw Normal View History

2014-12-11 07:17:29 -05:00
# Embedding ActiveMQ
ActiveMQ is designed as set of simple Plain Old Java Objects (POJOs).
This means 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
messaging functionality internally, then it can *directly instantiate*
ActiveMQ clients and servers in its own application code to perform that
functionality. We call this *embedding* ActiveMQ.
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.
Embedding ActiveMQ can be done in very few easy steps. Instantiate the
configuration object, instantiate the server, start it, and you have a
ActiveMQ running in your virtual machine. It's as simple and easy as
that.
2014-12-11 07:17:29 -05:00
## Simple Config File Embedding
The simplest way to embed ActiveMQ is to use the embedded wrapper
classes and configure ActiveMQ through its configuration files. There
are two different helper classes for this depending on whether your
using the ActiveMQ Core API or JMS.
2014-12-11 07:17:29 -05:00
## Core API Only
For instantiating a core ActiveMQ Server only, the steps are pretty
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-11 07:17: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-11 07:17:29 -05:00
ClientSessionFactory nettyFactory = ActiveMQClient.createClientSessionFactory(
new TransportConfiguration(
InVMConnectorFactory.class.getName()));
2014-12-11 07:17:29 -05:00
ClientSession session = factory.createSession();
2014-12-11 07:17:29 -05:00
session.createQueue("example", "example", true);
2014-12-11 07:17:29 -05:00
ClientProducer producer = session.createProducer("example");
2014-12-11 07:17:29 -05:00
ClientMessage message = session.createMessage(true);
2014-12-11 07:17:29 -05:00
message.getBody().writeString("Hello");
2014-12-11 07:17:29 -05:00
producer.send(message);
2014-12-11 07:17:29 -05:00
session.start();
2014-12-11 07:17:29 -05:00
ClientConsumer consumer = session.createConsumer("example");
2014-12-11 07:17:29 -05:00
ClientMessage msgReceived = consumer.receive();
2014-12-11 07:17:29 -05:00
System.out.println("message = " + msgReceived.getBody().readString());
2014-12-11 07:17:29 -05:00
session.close();
```
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
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-11 07:17:29 -05:00
...
2014-12-11 07:17:29 -05:00
EmbeddedJMS jms = new EmbeddedJMS();
jms.start();
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-11 07:17:29 -05:00
... regular JMS code ...
```
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
You can follow this step-by-step guide to programmatically embed the
core, non-JMS ActiveMQ Server instance:
Create the configuration object - this contains configuration
information for a ActiveMQ instance. The setter methods of this class
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.
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-11 07:17:29 -05:00
...
2014-12-11 07:17:29 -05:00
Configuration config = new ConfigurationImpl();
HashSet<TransportConfiguration> transports = new HashSet<TransportConfiguration>();
transports.add(new TransportConfiguration(NettyAcceptorFactory.class.getName()));
transports.add(new TransportConfiguration(InVMAcceptorFactory.class.getName()));
2014-12-11 07:17:29 -05:00
config.setAcceptorConfigurations(transports);
```
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-11 07:17:29 -05:00
...
2014-12-11 07:17:29 -05:00
EmbeddedActiveMQ server = new EmbeddedActiveMQ();
server.setConfiguration(config);
2014-12-11 07:17:29 -05:00
server.start();
```
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();
```
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
// Step 1. Create ActiveMQ core configuration, and set the properties accordingly
Configuration configuration = new ConfigurationImpl();
configuration.setPersistenceEnabled(false);
configuration.setSecurityEnabled(false);
configuration.getAcceptorConfigurations().add(new TransportConfiguration(NettyAcceptorFactory.class.getName()));
2014-12-11 07:17:29 -05:00
// Step 2. Create the JMS configuration
JMSConfiguration jmsConfig = new JMSConfigurationImpl();
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-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-11 07:17:29 -05:00
// Step 5. Start the JMS Server using the ActiveMQ core server and the JMS configuration
EmbeddedJMS jmsServer = new EmbeddedJMS();
jmsServer.setConfiguration(configuration);
jmsServer.setJmsConfiguration(jmsConfig);
jmsServer.start();
```
2015-01-21 13:27:19 -05:00
Please see the examples for an example which shows how to setup and run ActiveMQ
embedded with JMS.
2014-12-11 07:17:29 -05:00
## Dependency Frameworks
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
Spring and ActiveMQ.
2014-12-16 05:27:08 -05:00
ActiveMQ standalone uses [Airline](https://github.com/airlift/airline) to bootstrap.