From e7a3e7d25b11b65b09dd33b927689984f9d63274 Mon Sep 17 00:00:00 2001 From: jbertram Date: Mon, 17 Nov 2014 21:39:49 -0600 Subject: [PATCH] ACTIVEMQ6-9 Clean up docs --- .../activemq/core/config/Configuration.java | 2 +- .../schema/activemq-configuration.xsd | 12 +- distribution/activemq/pom.xml | 5 - ...er_Manual.ent => ActiveMQ_User_Manual.ent} | 4 +- ...er_Manual.xml => ActiveMQ_User_Manual.xml} | 4 +- docs/user-manual/en/Author_Group.xml | 2 +- docs/user-manual/en/Book_Info.xml | 16 +- docs/user-manual/en/aerogear-integration.xml | 6 +- docs/user-manual/en/appserver-integration.xml | 202 +++++++++--------- docs/user-manual/en/architecture.xml | 54 ++--- docs/user-manual/en/client-classpath.xml | 20 +- docs/user-manual/en/client-reconnection.xml | 18 +- docs/user-manual/en/clusters.xml | 110 +++++----- docs/user-manual/en/configuration-index.xml | 40 ++-- .../user-manual/en/configuring-transports.xml | 58 ++--- docs/user-manual/en/connection-ttl.xml | 26 +-- docs/user-manual/en/core-bridges.xml | 22 +- docs/user-manual/en/diverts.xml | 8 +- docs/user-manual/en/duplicate-detection.xml | 16 +- ...ing-hornetq.xml => embedding-activemq.xml} | 88 ++++---- docs/user-manual/en/examples.xml | 154 ++++++------- docs/user-manual/en/filter-expressions.xml | 12 +- docs/user-manual/en/flow-control.xml | 44 ++-- docs/user-manual/en/ha.xml | 50 ++--- .../en/images/hornetQ-banner_final.png | Bin 109633 -> 0 bytes .../en/images/hornetQ_logo_600px.png | Bin 23866 -> 0 bytes .../en/intercepting-operations.xml | 6 +- docs/user-manual/en/interoperability.xml | 74 +++---- docs/user-manual/en/jms-bridge.xml | 30 +-- docs/user-manual/en/jms-core-mapping.xml | 6 +- docs/user-manual/en/large-messages.xml | 28 +-- docs/user-manual/en/last-value-queues.xml | 2 +- docs/user-manual/en/libaio.xml | 16 +- docs/user-manual/en/logging.xml | 14 +- docs/user-manual/en/management.xml | 114 +++++----- docs/user-manual/en/message-expiry.xml | 10 +- docs/user-manual/en/message-grouping.xml | 14 +- docs/user-manual/en/messaging-concepts.xml | 28 +-- docs/user-manual/en/notice.xml | 2 +- docs/user-manual/en/paging.xml | 20 +- docs/user-manual/en/perf-tuning.xml | 30 +-- docs/user-manual/en/persistence.xml | 64 +++--- docs/user-manual/en/pre-acknowledge.xml | 16 +- docs/user-manual/en/preface.xml | 22 +- docs/user-manual/en/project-info.xml | 34 +-- docs/user-manual/en/queue-attributes.xml | 8 +- docs/user-manual/en/rest.xml | 158 +++++++------- docs/user-manual/en/scheduled-messages.xml | 2 +- docs/user-manual/en/security.xml | 56 ++--- docs/user-manual/en/send-guarantees.xml | 24 +-- docs/user-manual/en/slow-consumers.xml | 4 +- docs/user-manual/en/spring-integration.xml | 22 +- docs/user-manual/en/thread-pooling.xml | 30 +-- docs/user-manual/en/tools.xml | 18 +- docs/user-manual/en/transaction-config.xml | 10 +- docs/user-manual/en/undelivered-messages.xml | 12 +- docs/user-manual/en/using-core.xml | 14 +- docs/user-manual/en/using-jms.xml | 38 ++-- docs/user-manual/en/using-server.xml | 70 +++--- docs/user-manual/en/vertx-integration.xml | 16 +- docs/user-manual/en/wildcard-routing.xml | 6 +- docs/user-manual/en/wildcard-syntax.xml | 8 +- docs/user-manual/pom.xml | 4 +- .../activemq-jms-examples-common/common.css | 1 - .../images/hornetQ-banner_final.png | Bin 109633 -> 0 bytes ...ManagementWithConfiguredAdminUserTest.java | 1 - 66 files changed, 1001 insertions(+), 1004 deletions(-) rename docs/user-manual/en/{HornetQ_User_Manual.ent => ActiveMQ_User_Manual.ent} (90%) rename docs/user-manual/en/{HornetQ_User_Manual.xml => ActiveMQ_User_Manual.xml} (98%) rename docs/user-manual/en/{embedding-hornetq.xml => embedding-activemq.xml} (76%) delete mode 100644 docs/user-manual/en/images/hornetQ-banner_final.png delete mode 100644 docs/user-manual/en/images/hornetQ_logo_600px.png delete mode 100644 examples/jms/activemq-jms-examples-common/images/hornetQ-banner_final.png diff --git a/activemq-server/src/main/java/org/apache/activemq/core/config/Configuration.java b/activemq-server/src/main/java/org/apache/activemq/core/config/Configuration.java index 8ab206f5ac..e0eb4e5456 100644 --- a/activemq-server/src/main/java/org/apache/activemq/core/config/Configuration.java +++ b/activemq-server/src/main/java/org/apache/activemq/core/config/Configuration.java @@ -998,7 +998,7 @@ public interface Configuration extends Serializable /* * @see #setResolveProtocols() * @return whether HornetQ should resolve and use any Protocols available on the classpath - * Default value is {@value org.apache.activemq.api.config.HornetQDefaultConfiguration#DEFAULT_RESOLVE_PROTOCOLS}. + * Default value is {@value org.apache.activemq.api.config.ActiveMQDefaultConfiguration#DEFAULT_RESOLVE_PROTOCOLS}. * */ boolean isResolveProtocols(); diff --git a/activemq-server/src/main/resources/schema/activemq-configuration.xsd b/activemq-server/src/main/resources/schema/activemq-configuration.xsd index dd0863c0da..68e05edb8f 100644 --- a/activemq-server/src/main/resources/schema/activemq-configuration.xsd +++ b/activemq-server/src/main/resources/schema/activemq-configuration.xsd @@ -20,7 +20,7 @@ minOccurs="0"> - If true then the HornetQ Server will make use of any Protocol Managers that are in available on the + If true then the ActiveMQ Server will make use of any Protocol Managers that are in available on the classpath. If false then only the core protocol will be available, unless in Embedded mode where users can inject their own Protocol Managers. @@ -31,7 +31,7 @@ minOccurs="0"> - DEPRECATED. This option is deprecated and its value will be ignored (HQ221038). A HornetQ server will + DEPRECATED. This option is deprecated and its value will be ignored (HQ221038). A ActiveMQ server will be "clustered" when its configuration contain a cluster-configuration. @@ -112,7 +112,7 @@ - @@ -123,7 +123,7 @@ - @@ -133,7 +133,7 @@ - @@ -221,7 +221,7 @@ - the JMX domain used to registered HornetQ MBeans in the MBeanServer + the JMX domain used to registered ActiveMQ MBeans in the MBeanServer diff --git a/distribution/activemq/pom.xml b/distribution/activemq/pom.xml index 4d0c947b11..17a5de641e 100644 --- a/distribution/activemq/pom.xml +++ b/distribution/activemq/pom.xml @@ -73,11 +73,6 @@ activemq-ra ${project.version} - - org.apache.activemq - activemq-service-sar - ${project.version} - org.apache.activemq activemq-spring-integration diff --git a/docs/user-manual/en/HornetQ_User_Manual.ent b/docs/user-manual/en/ActiveMQ_User_Manual.ent similarity index 90% rename from docs/user-manual/en/HornetQ_User_Manual.ent rename to docs/user-manual/en/ActiveMQ_User_Manual.ent index dd225e3e9e..5fd88a24a3 100644 --- a/docs/user-manual/en/HornetQ_User_Manual.ent +++ b/docs/user-manual/en/ActiveMQ_User_Manual.ent @@ -1,5 +1,5 @@ - - + + + %BOOK_ENTITIES; ]> @@ -63,7 +63,7 @@ - + diff --git a/docs/user-manual/en/Author_Group.xml b/docs/user-manual/en/Author_Group.xml index 42b4ffc37f..e73613458e 100644 --- a/docs/user-manual/en/Author_Group.xml +++ b/docs/user-manual/en/Author_Group.xml @@ -13,7 +13,7 @@ --> + %BOOK_ENTITIES; ]> diff --git a/docs/user-manual/en/Book_Info.xml b/docs/user-manual/en/Book_Info.xml index f646ef63b1..3f87ef5a73 100644 --- a/docs/user-manual/en/Book_Info.xml +++ b/docs/user-manual/en/Book_Info.xml @@ -13,29 +13,29 @@ --> + %BOOK_ENTITIES; ]> - - HornetQ User Manual + + ActiveMQ User Manual Putting the buzz in messaging - HornetQ + ActiveMQ 2 2.1.0 1 - The User manual is an in depth manual on all aspects of HornetQ + The User manual is an in depth manual on all aspects of ActiveMQ - + &YEAR; &HOLDER; diff --git a/docs/user-manual/en/aerogear-integration.xml b/docs/user-manual/en/aerogear-integration.xml index 0b34e16f6a..ae65dd75cf 100644 --- a/docs/user-manual/en/aerogear-integration.xml +++ b/docs/user-manual/en/aerogear-integration.xml @@ -18,13 +18,13 @@ + %BOOK_ENTITIES; ]> AeroGear Integration AeroGears push technology provides support for different push notification technologies like Google Cloud Messaging, - Apple's APNs or Mozilla's SimplePush. HornetQ allows you to configure a Connector Service that will consume messages + Apple's APNs or Mozilla's SimplePush. ActiveMQ allows you to configure a Connector Service that will consume messages from a queue and forward them to an AeroGear push server and subsequently sent as notifications to mobile devices.
Configuring an AeroGear Connector Service @@ -96,7 +96,7 @@ Message message = session.createMessage(); - message.setStringProperty("AEROGEAR_ALERT", "Hello this is a notification from HornetQ"); + message.setStringProperty("AEROGEAR_ALERT", "Hello this is a notification from ActiveMQ"); producer.send(message); diff --git a/docs/user-manual/en/appserver-integration.xml b/docs/user-manual/en/appserver-integration.xml index 2a74b15c8c..63d4e55539 100644 --- a/docs/user-manual/en/appserver-integration.xml +++ b/docs/user-manual/en/appserver-integration.xml @@ -18,14 +18,14 @@ + %BOOK_ENTITIES; ]> Application Server Integration and Java EE - HornetQ can be easily installed in JBoss Application Server 4 or later. For details on - installing HornetQ in the JBoss Application Server please refer to quick-start guide. - Since HornetQ also provides a JCA adapter, it is also possible to integrate HornetQ + ActiveMQ can be easily installed in JBoss Application Server 4 or later. For details on + installing ActiveMQ in the JBoss Application Server please refer to quick-start guide. + Since ActiveMQ also provides a JCA adapter, it is also possible to integrate ActiveMQ as a JMS provider in other JEE compliant app servers. For instructions on how to integrate a remote JCA adaptor into another application sever, please consult the other application server's instructions. @@ -35,10 +35,10 @@ AS.
Configuring Message-Driven Beans - The delivery of messages to an MDB using HornetQ is configured on the JCA Adapter via + The delivery of messages to an MDB using ActiveMQ is configured on the JCA Adapter via a configuration file ra.xml which can be found under the jms-ra.rar directory. By default this is configured to consume - messages using an InVM connector from the instance of HornetQ running within the + messages using an InVM connector from the instance of ActiveMQ running within the application server. The configuration properties are listed later in this chapter. All MDBs however need to have the destination type and the destination configured. The following example shows how this can be done using annotations: @@ -48,14 +48,14 @@ @ActivationConfigProperty(propertyName = "destinationType", propertyValue = "javax.jms.Queue"), @ActivationConfigProperty(propertyName = "destination", propertyValue = "queue/testQueue") }) -@ResourceAdapter("hornetq-ra.rar") +@ResourceAdapter("activemq-ra.rar") public class MDBExample implements MessageListener { public void onMessage(Message message)... } In this example you can see that the MDB will consume messages from a queue that is mapped into JNDI with the binding queue/testQueue. This queue must be - preconfigured in the usual way using the HornetQ configuration files. + preconfigured in the usual way using the ActiveMQ configuration files. The ResourceAdapter annotation is used to specify which adaptor should be used. To use this you will need to import org.jboss.ejb3.annotation.ResourceAdapter for JBoss AS 5.X and later version which can be found in the @@ -66,18 +66,18 @@ public class MDBExample implements MessageListener the following to jboss.xml<message-driven> <ejb-name>ExampleMDB</ejb-name> - <resource-adapter-name>hornetq-ra.rar</resource-adapter-name> + <resource-adapter-name>activemq-ra.rar</resource-adapter-name> </message-driven> You - can also rename the hornetq-ra.rar directory to jms-ra.rar and neither the annotation or + can also rename the activemq-ra.rar directory to jms-ra.rar and neither the annotation or the extra descriptor information will be needed. If you do this you will need to edit the jms-ds.xml datasource file and change rar-name element. - HornetQ is the default JMS provider for JBoss AS 6. Starting with this AS version, HornetQ resource + ActiveMQ is the default JMS provider for JBoss AS 6. Starting with this AS version, ActiveMQ resource adapter is named jms-ra.rar and you no longer need to annotate the MDB for the resource adapter name. - All the examples shipped with the HornetQ distribution use the annotation. + All the examples shipped with the ActiveMQ distribution use the annotation.
Using Container-Managed Transactions When an MDB is using Container-Managed Transactions (CMT), the delivery of the @@ -94,7 +94,7 @@ public class MDBExample implements MessageListener }) @TransactionManagement(value= TransactionManagementType.CONTAINER) @TransactionAttribute(value= TransactionAttributeType.REQUIRED) -@ResourceAdapter("hornetq-ra.rar") +@ResourceAdapter("activemq-ra.rar") public class MDB_CMP_TxRequiredExample implements MessageListener { public void onMessage(Message message)... @@ -137,7 +137,7 @@ public void onMessage(Message message) }) @TransactionManagement(value = TransactionManagementType.CONTAINER) @TransactionAttribute(value = TransactionAttributeType.NOT_SUPPORTED) -@ResourceAdapter("hornetq-ra.rar") +@ResourceAdapter("activemq-ra.rar") public class MDB_CMP_TxLocalExample implements MessageListener { public void onMessage(Message message)... @@ -156,7 +156,7 @@ public class MDB_CMP_TxLocalExample implements MessageListener @ActivationConfigProperty(propertyName = "acknowledgeMode", propertyValue = "Dups-ok-acknowledge") }) @TransactionManagement(value= TransactionManagementType.BEAN) -@ResourceAdapter("hornetq-ra.rar") +@ResourceAdapter("activemq-ra.rar") public class MDB_BMPExample implements MessageListener { public void onMessage(Message message) @@ -211,7 +211,7 @@ public void onMessage(Message message) }) @TransactionManagement(value= TransactionManagementType.CONTAINER) @TransactionAttribute(value= TransactionAttributeType.REQUIRED) -@ResourceAdapter("hornetq-ra.rar") +@ResourceAdapter("activemq-ra.rar") public class MDBMessageSelectorExample implements MessageListener { public void onMessage(Message message).... @@ -236,7 +236,7 @@ public class MDBMessageSelectorExample implements MessageListener }) @TransactionManagement(value= TransactionManagementType.CONTAINER) @TransactionAttribute(value= TransactionAttributeType.REQUIRED) -@ResourceAdapter("hornetq-ra.rar") +@ResourceAdapter("activemq-ra.rar") public class MDBMessageSendTxExample implements MessageListener { @Resource(mappedName = "java:/JmsXA") @@ -308,24 +308,24 @@ public class MDBMessageSendTxExample implements MessageListener }) @TransactionManagement(value= TransactionManagementType.CONTAINER) @TransactionAttribute(value= TransactionAttributeType.REQUIRED) -@ResourceAdapter("hornetq-ra.rar") +@ResourceAdapter("activemq-ra.rar") public class MyMDB implements MessageListener { ....}
Configuring the JCA Adaptor - The Java Connector Architecture (JCA) Adapter is what allows HornetQ to be integrated + The Java Connector Architecture (JCA) Adapter is what allows ActiveMQ to be integrated with JEE components such as MDBs and EJBs. It configures how components such as MDBs - consume messages from the HornetQ server and also how components such as EJBs or + consume messages from the ActiveMQ server and also how components such as EJBs or Servlets can send messages. - The HornetQ JCA adapter is deployed via the jms-ra.rar archive. The + The ActiveMQ JCA adapter is deployed via the jms-ra.rar archive. The configuration of the adapter is found in this archive under META-INF/ra.xml. The configuration will look something like the following: <resourceadapter> - <resourceadapter-class>org.apache.activemq.ra.HornetQResourceAdapter</resourceadapter-class> + <resourceadapter-class>org.apache.activemq.ra.ActiveMQResourceAdapter</resourceadapter-class> <config-property> <description>The transport type. Multiple connectors can be configured by using a comma separated list, i.e. org.apache.activemq.core.remoting.impl.invm.InVMConnectorFactory,org.apache.activemq.core.remoting.impl.invm.InVMConnectorFactory.</description> @@ -344,7 +344,7 @@ public class MyMDB implements MessageListener <outbound-resourceadapter> <connection-definition> - <managedconnectionfactory-class>org.apache.activemq.ra.HornetQRAManagedConnection + <managedconnectionfactory-class>org.apache.activemq.ra.ActiveMQRAManagedConnection Factory</managedconnectionfactory-class> <config-property> @@ -361,12 +361,12 @@ public class MyMDB implements MessageListener <config-property-value>0</config-property-value> </config-property> - <connectionfactory-interface>org.apache.activemq.ra.HornetQRAConnectionFactory + <connectionfactory-interface>org.apache.activemq.ra.ActiveMQRAConnectionFactory </connectionfactory-interface> - <connectionfactororg.apache.activemq.ra.HornetQConnectionFactoryImplonFactoryImpl + <connectionfactororg.apache.activemq.ra.ActiveMQConnectionFactoryImplonFactoryImpl </connectionfactory-impl-class> <connection-interface>javax.jms.Session</connection-interface> - <connection-impl-class>org.apache.activemq.ra.HornetQRASession + <connection-impl-class>org.apache.activemq.ra.ActiveMQRASession </connection-impl-class> </connection-definition> <transaction-support>XATransaction</transaction-support> @@ -384,7 +384,7 @@ public class MyMDB implements MessageListener <messagelistener> <messagelistener-type>javax.jms.MessageListener</messagelistener-type> <activationspec> - <activationspec-class>org.apache.activemq.ra.inflow.HornetQActivationSpec + <activationspec-class>org.apache.activemq.ra.inflow.ActiveMQActivationSpec </activationspec-class> <required-config-property> <config-property-name>destination</config-property-name> @@ -411,7 +411,7 @@ public class MyMDB implements MessageListener
Global Properties The first element you see is resourceadapter-class which should - be left unchanged. This is the HornetQ resource adapter class. + be left unchanged. This is the ActiveMQ resource adapter class. After that there is a list of configuration properties. This will be where most of the configuration is done. The first two properties configure the transport used by the adapter and the rest configure the connection factory itself. @@ -699,12 +699,12 @@ public class MyMDB implements MessageListener factories that are used by Java EE components. These Connection Factories can be defined inside a configuration file that matches the name *-ds.xml. You'll find a default jms-ds.xml - configuration under the hornetq directory in the JBoss AS + configuration under the activemq directory in the JBoss AS deployment. The connection factories defined in this file inherit their properties from the main ra.xml configuration but can also be overridden. The following example shows how to override them. - Please note that this configuration only applies when HornetQ resource adapter is installed in + Please note that this configuration only applies when ActiveMQ resource adapter is installed in JBoss Application Server. If you are using another JEE application server please refer to your application servers documentation for how to do this. @@ -714,7 +714,7 @@ public class MyMDB implements MessageListener <jndi-name>RemoteJmsXA</jndi-name> <xa-transaction/> <rar-name>jms-ra.rar</rar-name> - <connection-definition>org.apache.activemq.ra.HornetQRAConnectionFactory + <connection-definition>org.apache.activemq.ra.ActiveMQRAConnectionFactory </connection-definition> <config-property name="SessionDefaultType" type="String">javax.jms.Topic</config-property> <config-property name="ConnectorClassName" type="String"> @@ -811,8 +811,8 @@ private ConnectionFactory connectionFactory; JndiParams String A semicolon (';') delimited string of name=value pairs which represent the properties to be used for the destination JNDI - look up. The properties depends on the JNDI implementation of the server hosting HornetQ. Typically only be used when the MDB is - configured to consume from a remote destination and needs to look up a JNDI reference rather than the HornetQ name of the + look up. The properties depends on the JNDI implementation of the server hosting ActiveMQ. Typically only be used when the MDB is + configured to consume from a remote destination and needs to look up a JNDI reference rather than the ActiveMQ name of the destination. Only relevant when useJNDI is true (default is an empty string). @@ -856,9 +856,9 @@ private ConnectionFactory connectionFactory;
- Configuring the adapter to use a standalone HornetQ Server + Configuring the adapter to use a standalone ActiveMQ Server Sometime you may want your messaging server on a different machine or separate from the application server. - If this is the case you will only need the hornetq client libs installed. This section explains what config to create + If this is the case you will only need the activemq client libs installed. This section explains what config to create and what jar dependencies are needed.
There are two configuration files needed to do this, one for the incoming adapter used for MDB's @@ -870,7 +870,7 @@ private ConnectionFactory connectionFactory; deploy directory ending in .rar. - For this example we will name the directory hornetq-ra.rar. This detail is + For this example we will name the directory activemq-ra.rar. This detail is important as the name of directory is referred to by the MDB's and the outgoing configuration. @@ -882,7 +882,7 @@ private ConnectionFactory connectionFactory; Under the - hornetq-ra.rar + activemq-ra.rar directory you will need to create a META-INF directory into which you should create an @@ -890,19 +890,19 @@ private ConnectionFactory connectionFactory; configuration file. You can find a template for the ra.xml - under the config directory of the HornetQ distribution. + under the config directory of the ActiveMQ distribution. - To configure MDB's to consume messages from a remote HornetQ server you need to edit the + To configure MDB's to consume messages from a remote ActiveMQ server you need to edit the ra.xml file under - deploy/hornet-ra.rar/META-INF + deploy/activemq-ra.rar/META-INF and change the transport type to use a netty connector (instead of the invm connector that is defined) and configure its transport parameters. Heres an example of what this would look like: -<resourceadapter-class>org.apache.activemq.ra.HornetQResourceAdapter</resourceadapter-class> +<resourceadapter-class>org.apache.activemq.ra.ActiveMQResourceAdapter</resourceadapter-class> <config-property> <description>The transport type</description> <config-property-name>ConnectorClassName</config-property-name> @@ -921,7 +921,7 @@ private ConnectionFactory connectionFactory; -<resourceadapter-class>org.apache.activemq.ra.HornetQResourceAdapter</resourceadapter-class> +<resourceadapter-class>org.apache.activemq.ra.ActiveMQResourceAdapter</resourceadapter-class> <config-property> <description>The transport type</description> <config-property-name>ConnectorClassName</config-property-name> @@ -948,30 +948,30 @@ private ConnectionFactory connectionFactory;
Configuring the outgoing adaptor - You will also need to configure the outbound connection by creating a hornetq-ds.xml + You will also need to configure the outbound connection by creating a activemq-ds.xml and placing it under any directory that will be deployed under the deploy directory. - In a standard HornetQ jboss configuration this would be under hornetq or hornetq.sar + In a standard ActiveMQ jboss configuration this would be under activemq or activemq.sar but you can place it where ever you like. Actually as long as it ends in -ds.xml you can call it anything you like. You can again find a template for this file under the config directory of the - HornetQ distribution but called jms-ds.xml which is the jboss default. + ActiveMQ distribution but called jms-ds.xml which is the jboss default. The following example shows a sample configuration <tx-connection-factory> <jndi-name>RemoteJmsXA</jndi-name> <xa-transaction/> - <rar-name>hornetq-ra.rar</rar-name> - <connection-definition>org.apache.activemq.ra.HornetQRAConnectionFactory</connection-definition> + <rar-name>activemq-ra.rar</rar-name> + <connection-definition>org.apache.activemq.ra.ActiveMQRAConnectionFactory</connection-definition> <config-property name="SessionDefaultType" type="java.lang.String">javax.jms.Topic</config-property> <config-property name="ConnectorClassName" type="java.lang.String">org.apache.activemq.core.remoting.impl.netty.NettyConnectorFactory</config-property> <config-property name="ConnectionParameters" type="java.lang.String">host=127.0.0.1;port=5446</config-property> <max-pool-size>20</max-pool-size> </tx-connection-factory> - Again you will see that this uses the netty connector type and will connect to the HornetQ server + Again you will see that this uses the netty connector type and will connect to the ActiveMQ server running on localhost and listening on port 5446. JEE components can access this by using JNDI and looking up the connection factory using JNDI using java:/RemoteJmsXA, you can see that this is defined under thejndi-name attribute. You will also note that the outgoing connection - will be created by the resource adaptor configured under the directory hornetq-ra.rar + will be created by the resource adaptor configured under the directory activemq-ra.rar as explained in the last section. @@ -981,7 +981,7 @@ private ConnectionFactory connectionFactory;
Jar dependencies - This is a list of the HornetQ and third party jars needed + This is a list of the ActiveMQ and third party jars needed Jar Dependencies @@ -997,18 +997,18 @@ private ConnectionFactory connectionFactory; - hornetq-ra.jar - The HornetQ resource adaptor classes - deploy/hornetq-ra.rar or equivalent + activemq-ra.jar + The ActiveMQ resource adaptor classes + deploy/activemq-ra.rar or equivalent - hornetq-core-client.jar - The HornetQ core client classes + activemq-core-client.jar + The ActiveMQ core client classes either in the config lib, i.e. default/lib or the common lib dir, i.e. $JBOSS_HOME/common lib - hornetq-jms-client.jar - The HornetQ JMS classes + activemq-jms-client.jar + The ActiveMQ JMS classes as above @@ -1025,26 +1025,26 @@ private ConnectionFactory connectionFactory;
- Configuring the JBoss Application Server to connect to Remote HornetQ Server - This is a step by step guide on how to configure a JBoss application server that doesn't have HornetQ installed - to use a remote instance of HornetQ + Configuring the JBoss Application Server to connect to Remote ActiveMQ Server + This is a step by step guide on how to configure a JBoss application server that doesn't have ActiveMQ installed + to use a remote instance of ActiveMQ
Configuring JBoss 5 - Firstly download and install JBoss AS 5 as per the JBoss installation guide and HornetQ as per the - HornetQ installation guide. After that the following steps are required + Firstly download and install JBoss AS 5 as per the JBoss installation guide and ActiveMQ as per the + ActiveMQ installation guide. After that the following steps are required - Copy the following jars from the HornetQ distribution to the lib directory of + Copy the following jars from the ActiveMQ distribution to the lib directory of which ever JBossAs configuration you have chosen, i.e. default. - hornetq-core-client.jar + activemq-core-client.jar - hornetq-jms-client.jar + activemq-jms-client.jar - hornetq-ra.jar (this can be found inside the hornetq-ra.rar archive) + activemq-ra.jar (this can be found inside the activemq-ra.rar archive) netty.jar @@ -1052,12 +1052,12 @@ private ConnectionFactory connectionFactory; - create the directories hornetq-ra.rar and hornetq-ra.rar/META-INF + create the directories activemq-ra.rar and activemq-ra.rar/META-INF under the deploy directory in your JBoss config directory - under the hornetq-ra.rar/META-INF create a ra.xml file or - copy it from the HornetQ distribution (again it can be found in the hornetq-ra.rar archive) + under the activemq-ra.rar/META-INF create a ra.xml file or + copy it from the ActiveMQ distribution (again it can be found in the activemq-ra.rar archive) and configure it as follows <?xml version="1.0" encoding="UTF-8"?> @@ -1068,8 +1068,8 @@ private ConnectionFactory connectionFactory; http://java.sun.com/xml/ns/j2ee/connector_1_5.xsd" version="1.5"> - <description>HornetQ 2.0 Resource Adapter Alternate Configuration</description> - <display-name>HornetQ 2.0 Resource Adapter Alternate Configuration</display-name> + <description>ActiveMQ 2.0 Resource Adapter Alternate Configuration</description> + <display-name>ActiveMQ 2.0 Resource Adapter Alternate Configuration</display-name> <vendor-name>Red Hat Middleware LLC</vendor-name> <eis-type>JMS 1.1 Server</eis-type> @@ -1092,7 +1092,7 @@ Copyright 2009 Red Hat, Inc. </license> <resourceadapter> - <resourceadapter-class>org.apache.activemq.ra.HornetQResourceAdapter</resourceadapter-class> + <resourceadapter-class>org.apache.activemq.ra.ActiveMQResourceAdapter</resourceadapter-class> <config-property> <description>The transport type</description> <config-property-name>ConnectorClassName</config-property-name> @@ -1108,7 +1108,7 @@ Copyright 2009 Red Hat, Inc. <outbound-resourceadapter> <connection-definition> - <managedconnectionfactory-class>org.apache.activemq.ra.HornetQRAManagedConnectionFactory</managedconnectionfactory-class> + <managedconnectionfactory-class>org.apache.activemq.ra.ActiveMQRAManagedConnectionFactory</managedconnectionfactory-class> <config-property> <description>The default session type</description> @@ -1123,10 +1123,10 @@ Copyright 2009 Red Hat, Inc. <config-property-value>0</config-property-value> </config-property> - <connectionfactory-interface>org.apache.activemq.ra.HornetQRAConnectionFactory</connectionfactory-interface> - <connectionfactory-impl-class>org.apache.activemq.ra.HornetQRAConnectionFactoryImpl</connectionfactory-impl-class> + <connectionfactory-interface>org.apache.activemq.ra.ActiveMQRAConnectionFactory</connectionfactory-interface> + <connectionfactory-impl-class>org.apache.activemq.ra.ActiveMQRAConnectionFactoryImpl</connectionfactory-impl-class> <connection-interface>javax.jms.Session</connection-interface> - <connection-impl-class>org.apache.activemq.ra.HornetQRASession</connection-impl-class> + <connection-impl-class>org.apache.activemq.ra.ActiveMQRASession</connection-impl-class> </connection-definition> <transaction-support>XATransaction</transaction-support> <authentication-mechanism> @@ -1141,7 +1141,7 @@ Copyright 2009 Red Hat, Inc. <messagelistener> <messagelistener-type>javax.jms.MessageListener</messagelistener-type> <activationspec> - <activationspec-class>org.apache.activemq.ra.inflow.HornetQActivationSpec</activationspec-class> + <activationspec-class>org.apache.activemq.ra.inflow.ActiveMQActivationSpec</activationspec-class> <required-config-property> <config-property-name>destination</config-property-name> </required-config-property> @@ -1153,19 +1153,19 @@ Copyright 2009 Red Hat, Inc. </resourceadapter> </connector> The important part of this configuration is the part in bold, i.e. <config-property-value>host=127.0.0.1;port=5445</config-property-value>. - This should be configured to the host and port of the remote HornetQ server. + This should be configured to the host and port of the remote ActiveMQ server. At this point you should be able to now deploy MDB's that consume from the remote server. You will however, - have to make sure that your MDB's have the annotation @ResourceAdapter("hornetq-ra.rar") + have to make sure that your MDB's have the annotation @ResourceAdapter("activemq-ra.rar") added, this is illustrated in the Configuring Message-Driven Beans section. If you don't want to add this annotation then you can delete the generic resource adapter jms-ra.rar - and rename the hornetq-ra.rar to this. - If you also want to use the remote HornetQ server for outgoing connections, i.e. sending messages, then + and rename the activemq-ra.rar to this. + If you also want to use the remote ActiveMQ server for outgoing connections, i.e. sending messages, then do the following: - Create a file called hornetq-ds.xml in the deploy directory + Create a file called activemq-ds.xml in the deploy directory (in fact you can call this anything you want as long as it ends in -ds.xml). Then add the following: @@ -1177,8 +1177,8 @@ Copyright 2009 Red Hat, Inc. <tx-connection-factory> <jndi-name>RemoteJmsXA</jndi-name> <xa-transaction/> - <rar-name>hornetq-ra.rar</rar-name> - <connection-definition>org.apache.activemq.ra.HornetQRAConnectionFactory</connection-definition> + <rar-name>activemq-ra.rar</rar-name> + <connection-definition>org.apache.activemq.ra.ActiveMQRAConnectionFactory</connection-definition> <config-property name="SessionDefaultType" type="java.lang.String">javax.jms.Topic</config-property> <config-property name="ConnectorClassName" type="java.lang.String">org.apache.activemq.core.remoting.impl.netty.NettyConnectorFactory</config-property> <config-property name="ConnectionParameters" type="java.lang.String">host=127.0.0.1;port=5445</config-property> @@ -1187,7 +1187,7 @@ Copyright 2009 Red Hat, Inc. </connection-factories> - Again you will see that the host and port are configured here to match the remote HornetQ servers + Again you will see that the host and port are configured here to match the remote ActiveMQ servers configuration. The other important attributes are: @@ -1244,32 +1244,32 @@ initialContext = new InitialContext(jndiParameters); or lose network connectivity. For more information on XA Recovery,please refer to JBoss Transactions. - When HornetQ is integrated with JBoss AS, it can take advantage of JBoss Transactions + When ActiveMQ is integrated with JBoss AS, it can take advantage of JBoss Transactions to provide recovery of messaging resources. If messages are involved in a XA transaction, in the event of a server crash, the recovery manager will ensure that the transactions are recovered and the messages will either be committed or rolled back (depending on the transaction outcome) when the server is restarted.
XA Recovery Configuration - To enable HornetQ's XA Recovery, the Recovery Manager must be configured to connect - to HornetQ to recover its resources. The following property must be added to the + To enable ActiveMQ's XA Recovery, the Recovery Manager must be configured to connect + to ActiveMQ to recover its resources. The following property must be added to the jta section of conf/jbossts-properties.xml of JBoss AS profiles: <properties depends="arjuna" name="jta"> ... - <property name="com.arjuna.ats.jta.recovery.XAResourceRecovery.HornetQ1" - value="org.apache.activemq.jms.server.recovery.HornetQXAResourceRecovery;[connection configuration]"/> + <property name="com.arjuna.ats.jta.recovery.XAResourceRecovery.ActiveMQ1" + value="org.apache.activemq.jms.server.recovery.ActiveMQXAResourceRecovery;[connection configuration]"/> <property name="com.arjuna.ats.jta.xaRecoveryNode" value="1"/> </properties> The [connection configuration] contains all the information - required to connect to HornetQ node under the form [connector factory class + required to connect to ActiveMQ node under the form [connector factory class name],[user name], [password], [connector parameters]. [connector factory class name] corresponds to the name - of the ConnectorFactory used to connect to HornetQ. + of the ConnectorFactory used to connect to ActiveMQ. Values can be org.apache.activemq.core.remoting.impl.invm.InVMConnectorFactory or enabled then this must be configured to what ever the tx node id is set to, this is configured in the same file by the com.arjuna.ats.arjuna.xa.nodeIdentifier property. - HornetQ must have a valid acceptor which corresponds to the connector + ActiveMQ must have a valid acceptor which corresponds to the connector specified in conf/jbossts-properties.xml.
Configuration Settings - If HornetQ is configured with a default in-vm acceptor: + If ActiveMQ is configured with a default in-vm acceptor: <acceptor name="in-vm"> <factory-class>org.apache.activemq.core.remoting.impl.invm.InVMAcceptorFactory</factory-class> @@ -1307,8 +1307,8 @@ initialContext = new InitialContext(jndiParameters); the corresponding configuration in conf/jbossts-properties.xml is: -<property name="com.arjuna.ats.jta.recovery.XAResourceRecovery.HORNETQ1" - value="org.apache.activemq.jms.server.recovery.HornetQXAResourceRecovery;org.apache.activemq.core.remoting.impl.invm.InVMConnectorFactory"/> +<property name="com.arjuna.ats.jta.recovery.XAResourceRecovery.ACTIVEMQ1" + value="org.apache.activemq.jms.server.recovery.ActiveMQXAResourceRecovery;org.apache.activemq.core.remoting.impl.invm.InVMConnectorFactory"/> If it is now configured with a netty acceptor on a non-default port: <acceptor name="netty"> @@ -1318,8 +1318,8 @@ initialContext = new InitialContext(jndiParameters); the corresponding configuration in conf/jbossts-properties.xml is: -<property name="com.arjuna.ats.jta.recovery.XAResourceRecovery.HORNETQ1" - value="org.apache.activemq.jms.server.recovery.HornetQXAResourceRecovery;org.apache.activemq.core.remoting.impl.netty.NettyConnectorFactory, , , port=8888"/> +<property name="com.arjuna.ats.jta.recovery.XAResourceRecovery.ACTIVEMQ1" + value="org.apache.activemq.jms.server.recovery.ActiveMQXAResourceRecovery;org.apache.activemq.core.remoting.impl.netty.NettyConnectorFactory, , , port=8888"/> Note the additional commas to skip the user and password before connector parameters @@ -1327,9 +1327,9 @@ initialContext = new InitialContext(jndiParameters); If the recovery must use admin, adminpass, the configuration would have been: -<property name="com.arjuna.ats.jta.recovery.XAResourceRecovery.HORNETQ1" - value="org.apache.activemq.jms.server.recovery.HornetQXAResourceRecovery;org.apache.activemq.core.remoting.impl.netty.NettyConnectorFactory, admin, adminpass, port=8888"/> - Configuring HornetQ with an invm acceptor and configuring the Recovery Manager +<property name="com.arjuna.ats.jta.recovery.XAResourceRecovery.ACTIVEMQ1" + value="org.apache.activemq.jms.server.recovery.ActiveMQXAResourceRecovery;org.apache.activemq.core.remoting.impl.netty.NettyConnectorFactory, admin, adminpass, port=8888"/> + Configuring ActiveMQ with an invm acceptor and configuring the Recovery Manager with an invm connector is the recommended way to enable XA Recovery.
diff --git a/docs/user-manual/en/architecture.xml b/docs/user-manual/en/architecture.xml index 8b7085cba7..21089003b4 100644 --- a/docs/user-manual/en/architecture.xml +++ b/docs/user-manual/en/architecture.xml @@ -18,29 +18,29 @@ + %BOOK_ENTITIES; ]> Architecture - In this section we will give an overview of the HornetQ high level architecture. + In this section we will give an overview of the ActiveMQ high level architecture.
Core Architecture - HornetQ core is designed simply as set of Plain Old Java Objects (POJOs) - we hope you + ActiveMQ core is designed simply as set of Plain Old Java Objects (POJOs) - we hope you like its clean-cut design. We've also designed it to have as few dependencies on external jars as possible. In - fact, HornetQ core has only one jar dependency, netty.jar, + fact, ActiveMQ core has only one jar dependency, netty.jar, other than the standard JDK classes! This is because we use some of the netty buffer classes internally. - This allows HornetQ to be easily embedded in your own project, or instantiated in any + This allows ActiveMQ to be easily embedded in your own project, or instantiated in any dependency injection framework such as JBoss Microcontainer, Spring or Google Guice. - Each HornetQ server has its own ultra high performance persistent journal, which it + Each ActiveMQ server has its own ultra high performance persistent journal, which it uses for message and other persistence. Using a high performance journal allows outrageous persistence message performance, something not achievable when using a relational database for persistence. - HornetQ clients, potentially on different physical machines interact with the HornetQ - server. HornetQ currently provides two APIs for messaging at the client side: + ActiveMQ clients, potentially on different physical machines interact with the ActiveMQ + server. ActiveMQ currently provides two APIs for messaging at the client side: @@ -55,35 +55,35 @@ JMS semantics are implemented by a thin JMS facade layer on the client side. - The HornetQ server does not speak JMS and in fact does not know anything about JMS, + The ActiveMQ server does not speak JMS and in fact does not know anything about JMS, it is a protocol agnostic messaging server designed to be used with multiple different protocols. When a user uses the JMS API on the client side, all JMS interactions are translated - into operations on the HornetQ core client API before being transferred over the wire - using the HornetQ wire format. + into operations on the ActiveMQ core client API before being transferred over the wire + using the ActiveMQ wire format. The server always just deals with core API interactions. A schematic illustrating this relationship is shown in figure 3.1 below: - Figure 3.1 shows two user applications interacting with a HornetQ server. User + Figure 3.1 shows two user applications interacting with a ActiveMQ server. User Application 1 is using the JMS API, while User Application 2 is using the core client API directly. You can see from the diagram that the JMS API is implemented by a thin facade layer on the client side.
- HornetQ embedded in your own application - HornetQ core is designed as a set of simple POJOs so if you have an application that + ActiveMQ embedded in your own application + ActiveMQ core is designed as a set of simple POJOs so if you have an application that requires messaging functionality internally but you don't want to expose that as a - HornetQ server you can directly instantiate and embed HornetQ servers in your own + ActiveMQ server you can directly instantiate and embed ActiveMQ servers in your own application. - For more information on embedding HornetQ, see For more information on embedding ActiveMQ, see .
- HornetQ integrated with a JEE application server - HornetQ provides its own fully functional Java Connector Architecture (JCA) adaptor + ActiveMQ integrated with a JEE application server + ActiveMQ provides its own fully functional Java Connector Architecture (JCA) adaptor which enables it to be integrated easily into any JEE compliant application server or servlet engine. JEE application servers provide Message Driven Beans (MDBs), which are a special type @@ -106,12 +106,12 @@ an EJB, MDB or servlet without going through a JCA adapter, but this is not recommended since you will not be able to take advantage of the JCA features, such as caching of JMS sessions, which can result in poor performance. - Figure 3.2 below shows a JEE application server integrating with a HornetQ server via - the HornetQ JCA adaptor. Note that all communication between EJB sessions or entity + Figure 3.2 below shows a JEE application server integrating with a ActiveMQ server via + the ActiveMQ JCA adaptor. Note that all communication between EJB sessions or entity beans and Message Driven beans go through the adaptor and not directly to - HornetQ. + ActiveMQ. The large arrow with the prohibited sign shows an EJB session bean talking directly to - the HornetQ server. This is not recommended as you'll most likely end up creating a new + the ActiveMQ server. This is not recommended as you'll most likely end up creating a new connection and session every time you want to interact from the EJB, which is an anti-pattern. @@ -121,22 +121,22 @@ linkend="appserver-integration"/>.
- HornetQ stand-alone server - HornetQ can also be deployed as a stand-alone server. This means a fully independent + ActiveMQ stand-alone server + ActiveMQ can also be deployed as a stand-alone server. This means a fully independent messaging server not dependent on a JEE application server. The standard stand-alone messaging server configuration comprises a core messaging server, a JMS service and a JNDI service. The role of the JMS Service is to deploy any JMS Queue, Topic and ConnectionFactory - instances from any server side hornetq-jms.xml configuration files. + instances from any server side activemq-jms.xml configuration files. It also provides a simple management API for creating and destroying Queues, Topics and ConnectionFactory instances which can be accessed via JMX or the connection. It is a - separate service to the HornetQ core server, since the core server is JMS agnostic. If + separate service to the ActiveMQ core server, since the core server is JMS agnostic. If you don't want to deploy any JMS Queue, Topic or ConnectionFactory instances via server side XML configuration and don't require a JMS management API on the server side then you can disable this service. We also include a JNDI server since JNDI is a common requirement when using JMS to lookup Queues, Topics and ConnectionFactory instances. If you do not require JNDI then - this service can also be disabled. HornetQ allows you to programmatically create JMS and + this service can also be disabled. ActiveMQ allows you to programmatically create JMS and core objects directly on the client side as opposed to looking them up from JNDI, so a JNDI server is not always a requirement. The stand-alone server configuration uses JBoss Microcontainer to instantiate and diff --git a/docs/user-manual/en/client-classpath.xml b/docs/user-manual/en/client-classpath.xml index be94909c57..798e6bbaa9 100644 --- a/docs/user-manual/en/client-classpath.xml +++ b/docs/user-manual/en/client-classpath.xml @@ -18,30 +18,30 @@ + %BOOK_ENTITIES; ]> The Client Classpath - HornetQ requires several jars on the Client Classpath depending on - whether the client uses HornetQ Core API, JMS, and JNDI. + ActiveMQ requires several jars on the Client Classpath depending on + whether the client uses ActiveMQ Core API, JMS, and JNDI. All the jars mentioned here can be found in the lib directory of - the HornetQ distribution. Be sure you only use the jars from the correct version of the + the ActiveMQ distribution. Be sure you only use the jars from the correct version of the release, you must not mix and match versions of jars from different - HornetQ versions. Mixing and matching different jar versions may cause subtle errors and + ActiveMQ versions. Mixing and matching different jar versions may cause subtle errors and failures to occur.
- HornetQ Core Client - If you are using just a pure HornetQ Core client (i.e. no JMS) then you need hornetq-core-client.jar, hornetq-commons.jar, and + ActiveMQ Core Client + If you are using just a pure ActiveMQ Core client (i.e. no JMS) then you need activemq-core-client.jar, activemq-commons.jar, and netty.jar on your client classpath.
JMS Client If you are using JMS on the client side, then you will also need to include hornetq-jms-client.jar and jboss-jms-api.jar. + >activemq-jms-client.jar and jboss-jms-api.jar. jboss-jms-api.jar just contains Java EE API interface classes @@ -52,7 +52,7 @@
JMS Client with JNDI - If you are looking up JMS resources from the JNDI server co-located with the HornetQ + If you are looking up JMS resources from the JNDI server co-located with the ActiveMQ standalone server, you will also need the jar jnp-client.jar jar on your client classpath as well as any other jars mentioned previously.
diff --git a/docs/user-manual/en/client-reconnection.xml b/docs/user-manual/en/client-reconnection.xml index d647011672..ef99ae44ab 100644 --- a/docs/user-manual/en/client-reconnection.xml +++ b/docs/user-manual/en/client-reconnection.xml @@ -18,12 +18,12 @@ + %BOOK_ENTITIES; ]> Client Reconnection and Session Reattachment - HornetQ clients can be configured to automatically reconnect or re-attach to the server in + ActiveMQ clients can be configured to automatically reconnect or re-attach to the server in the event that a failure is detected in the connection between the client and the server.
100% Transparent session re-attachment @@ -31,11 +31,11 @@ and the target server was not restarted, then the sessions will still be existent on the server, assuming the client hasn't been disconnected for more than connection-ttl . - In this scenario, HornetQ will automatically re-attach the client sessions to the + In this scenario, ActiveMQ will automatically re-attach the client sessions to the server sessions when the connection reconnects. This is done 100% transparently and the client can continue exactly as if nothing had happened. The way this works is as follows: - As HornetQ clients send commands to their servers they store each sent command in an + As ActiveMQ clients send commands to their servers they store each sent command in an in-memory buffer. In the case that connection failure occurs and the client subsequently reattaches to the same server, as part of the reattachment protocol the server informs the client during reattachment with the id of the last command it successfully received @@ -49,9 +49,9 @@ and the client can then free up space in the buffer. If you are using JMS and you're using the JMS service on the server to load your JMS connection factory instances into JNDI then this parameter can be configured in hornetq-jms.xml using the element activemq-jms.xml using the element confirmation-window-size a. If you're using JMS but not using JNDI then - you can set these values directly on the HornetQConnectionFactory + you can set these values directly on the ActiveMQConnectionFactory instance using the appropriate setter method. If you're using the core API you can set these values directly on the ServerLocator instance using the appropriate setter method. @@ -65,7 +65,7 @@ Alternatively, the server might have actually been restarted after crashing or being stopped. In this case any sessions will no longer be existent on the server and it won't be possible to 100% transparently re-attach to them. - In this case, HornetQ will automatically reconnect the connection and In this case, ActiveMQ will automatically reconnect the connection and recreate any sessions and consumers on the server corresponding to the sessions and consumers on the client. This process is exactly the same as what happens during failover onto a backup server. @@ -118,7 +118,7 @@ If you're using JMS, and you're using the JMS Service on the server to load your JMS connection factory instances directly into JNDI, then you can specify these parameters - in the xml configuration in hornetq-jms.xml, for example: + in the xml configuration in activemq-jms.xml, for example: <connection-factory name="ConnectionFactory"> <connectors> @@ -135,7 +135,7 @@ </connection-factory> If you're using JMS, but instantiating your JMS connection factory directly, you can specify the parameters using the appropriate setter methods on the HornetQConnectionFactory immediately after creating it. + >ActiveMQConnectionFactory immediately after creating it. If you're using the core API and instantiating the ServerLocator instance directly you can also specify the parameters using the appropriate setter methods on the + %BOOK_ENTITIES; ]> Clusters
Clusters Overview - HornetQ clusters allow groups of HornetQ servers to be grouped together in order to - share message processing load. Each active node in the cluster is an active HornetQ + ActiveMQ clusters allow groups of ActiveMQ servers to be grouped together in order to + share message processing load. Each active node in the cluster is an active ActiveMQ server which manages its own messages and handles its own connections. The clustered parameter is deprecated and no longer needed for @@ -35,7 +35,7 @@ The cluster is formed by each node declaring cluster connections to other nodes in the core configuration file hornetq-configuration.xml. When a node forms a cluster connection to + >activemq-configuration.xml. When a node forms a cluster connection to another node, internally it creates a core bridge (as described in ) connection between it and the other node, this is done transparently behind the scenes - you don't have to declare an explicit bridge for @@ -44,7 +44,7 @@ Nodes can be connected together to form a cluster in many different topologies, we will discuss a couple of the more common topologies later in this chapter. We'll also discuss client side load balancing, where we can balance client connections - across the nodes of the cluster, and we'll consider message redistribution where HornetQ + across the nodes of the cluster, and we'll consider message redistribution where ActiveMQ will redistribute messages between nodes to avoid starvation. Another important part of clustering is server discovery where servers can broadcast their connection details so clients or other servers can connect @@ -52,7 +52,7 @@ Once a cluster node has been configured it is common to simply copy that configuration to other nodes to produce a symmetric cluster. However, care must be taken when copying the - HornetQ files. Do not copy the HornetQ data (i.e. the + ActiveMQ files. Do not copy the ActiveMQ data (i.e. the bindings, journal, and large-messages directories) from one node to another. When a node is started for the first time and initializes its journal files it also persists a special identifier to the journal @@ -78,7 +78,7 @@ - This information, let's call it the Cluster Topology, is actually sent around normal HornetQ + This information, let's call it the Cluster Topology, is actually sent around normal ActiveMQ connections to clients and to other servers over cluster connections. This being the case we need a way of establishing the initial first connection. This can be done using dynamic discovery techniques like UDP @@ -102,11 +102,11 @@ the network. Depending on which broadcasting technique you configure the cluster, it uses either UDP or JGroups to broadcast connector pairs information. Broadcast groups are defined in the server configuration file hornetq-configuration.xml. There can be many broadcast groups per - HornetQ server. All broadcast groups must be defined in a activemq-configuration.xml. There can be many broadcast groups per + ActiveMQ server. All broadcast groups must be defined in a broadcast-groups element. Let's take a look at an example broadcast group from hornetq-configuration.xml that defines a UDP broadcast group: + >activemq-configuration.xml that defines a UDP broadcast group: <broadcast-groups> <broadcast-group name="my-broadcast-group"> @@ -171,7 +171,7 @@ <broadcast-groups> <broadcast-group name="my-broadcast-group"> <jgroups-file>test-jgroups-file_ping.xml</jgroups-file> - <jgroups-channel>hornetq_broadcast_channel</jgroups-channel> + <jgroups-channel>activemq_broadcast_channel</jgroups-channel> <broadcast-period>2000</broadcast-period> <connector-ref connector-name="netty-connector"/> </broadcast-group> @@ -183,7 +183,7 @@ jgroups-file attribute. This is the name of JGroups configuration file. It will be used to initialize JGroups channels. Make sure the file is in the - java resource path so that HornetQ can load it. + java resource path so that ActiveMQ can load it. jgroups-channel attribute. The name that JGroups channels connect @@ -251,7 +251,7 @@ </config> - As it shows, the file content defines a jgroups protocol stacks. If you want hornetq + As it shows, the file content defines a jgroups protocol stacks. If you want activemq to use this stacks for channel creation, you have to make sure the value of jgroups-file in your broadcast-group/discovery-group configuration to be the name of this jgroups configuration file. For example if the above stacks @@ -271,7 +271,7 @@ particular server it updates its entry in the list for that server. If it has not received a broadcast from a particular server for a length of time it will remove that server's entry from its list. - Discovery groups are used in two places in HornetQ: + Discovery groups are used in two places in ActiveMQ: By cluster connections so they know how to obtain an initial connection to download the topology @@ -283,7 +283,7 @@ Although a discovery group will always accept broadcasts, its current list of available live and backup servers is only ever used when an initial connection is made, from then server discovery is - done over the normal HornetQ connections. + done over the normal ActiveMQ connections. @@ -296,9 +296,9 @@
Defining Discovery Groups on the Server For cluster connections, discovery groups are defined in the server side - configuration file hornetq-configuration.xml. All discovery + configuration file activemq-configuration.xml. All discovery groups must be defined inside a discovery-groups element. There - can be many discovery groups defined by HornetQ server. Let's look at an + can be many discovery groups defined by ActiveMQ server. Let's look at an example: <discovery-groups> @@ -348,7 +348,7 @@ <discovery-groups> <discovery-group name="my-broadcast-group"> <jgroups-file>test-jgroups-file_ping.xml</jgroups-file> - <jgroups-channel>hornetq_broadcast_channel</jgroups-channel> + <jgroups-channel>activemq_broadcast_channel</jgroups-channel> <refresh-timeout>10000</refresh-timeout> </discovery-group> </discovery-groups> @@ -359,7 +359,7 @@ jgroups-file attribute. This is the name of JGroups configuration file. It will be used to initialize JGroups channels. Make sure the file is in the - java resource path so that HornetQ can load it. + java resource path so that ActiveMQ can load it. jgroups-channel attribute. The name that JGroups channels connect @@ -374,7 +374,7 @@
Discovery Groups on the Client Side - Let's discuss how to configure a HornetQ client to use discovery to discover a + Let's discuss how to configure a ActiveMQ client to use discovery to discover a list of servers to which it can connect. The way to do this differs depending on whether you're using JMS or the core API.
@@ -382,7 +382,7 @@ If you're using JMS and you're also using the JMS Service on the server to load your JMS connection factory instances into JNDI, then you can specify which discovery group to use for your JMS connection factory in the server side xml - configuration hornetq-jms.xml. Let's take a look at an + configuration activemq-jms.xml. Let's take a look at an example: <connection-factory name="ConnectionFactory"> @@ -392,7 +392,7 @@ </entries> </connection-factory> The element discovery-group-ref specifies the name of a - discovery group defined in hornetq-configuration.xml. + discovery group defined in activemq-configuration.xml. When this connection factory is downloaded from JNDI by a client application and JMS connections are created from it, those connections will be load-balanced across the list of servers that the discovery group maintains by listening on @@ -408,7 +408,7 @@ final String groupAddress = "231.7.7.7"; final int groupPort = 9876; ConnectionFactory jmsConnectionFactory = -HornetQJMSClient.createConnectionFactory(new DiscoveryGroupConfiguration(groupAddress, groupPort, +ActiveMQJMSClient.createConnectionFactory(new DiscoveryGroupConfiguration(groupAddress, groupPort, new UDPBroadcastGroupConfiguration(groupAddress, groupPort, null, -1)), JMSFactoryType.CF); Connection jmsConnection1 = jmsConnectionFactory.createConnection(); @@ -434,7 +434,7 @@ Connection jmsConnection2 = jmsConnectionFactory.createConnection(); final String groupAddress = "231.7.7.7"; final int groupPort = 9876; -ServerLocator factory = HornetQClient.createServerLocatorWithHA(new DiscoveryGroupConfiguration(groupAddress, groupPort, +ServerLocator factory = ActiveMQClient.createServerLocatorWithHA(new DiscoveryGroupConfiguration(groupAddress, groupPort, new UDPBroadcastGroupConfiguration(groupAddress, groupPort, null, -1)))); ClientSessionFactory factory = locator.createSessionFactory(); ClientSession session1 = factory.createSession(); @@ -475,7 +475,7 @@ ClientSession session2 = factory.createSession(); If you're using JMS and you're also using the JMS Service on the server to load your JMS connection factory instances into JNDI, then you can specify which connectors to use for your JMS connection factory in the server side xml - configuration hornetq-jms.xml. Let's take a look at an + configuration activemq-jms.xml. Let's take a look at an example: <connection-factory name="ConnectionFactory"> @@ -490,7 +490,7 @@ ClientSession session2 = factory.createSession(); </connection-factory> The element connectors contains a list of pre defined connectors in the - hornetq-configuration.xml file. When this connection factory is downloaded + activemq-configuration.xml file. When this connection factory is downloaded from JNDI by a client application and JMS connections are created from it, those connections will be load-balanced across the list of servers defined by these connectors. @@ -509,7 +509,7 @@ map2.put("host", "myhost2"); map2.put("port", "5446"); TransportConfiguration server2 = new TransportConfiguration(NettyConnectorFactory.class.getName(), map2); -HornetQConnectionFactory cf = HornetQJMSClient.createConnectionFactoryWithHA(JMSFactoryType.CF, server1, server2); +ActiveMQConnectionFactory cf = ActiveMQJMSClient.createConnectionFactoryWithHA(JMSFactoryType.CF, server1, server2);
Configuring client discovery using Core @@ -524,7 +524,7 @@ map2.put("host", "myhost2"); map2.put("port", "5446"); TransportConfiguration server2 = new TransportConfiguration(NettyConnectorFactory.class.getName(), map2); -ServerLocator locator = HornetQClient.createServerLocatorWithHA(server1, server2); +ServerLocator locator = ActiveMQClient.createServerLocatorWithHA(server1, server2); ClientSessionFactory factory = locator.createSessionFactory(); ClientSession session = factory.createSession();
@@ -533,7 +533,7 @@ ClientSession session = factory.createSession();
Server-Side Message Load Balancing - If cluster connections are defined between nodes of a cluster, then HornetQ will load + If cluster connections are defined between nodes of a cluster, then ActiveMQ will load balance messages arriving at a particular node from a client. Let's take a simple example of a cluster of four nodes A, B, C, and D arranged in a symmetric cluster (described in @@ -552,7 +552,7 @@ ClientSession session = factory.createSession(); For example, messages arriving on node A might be distributed in the following order between the nodes: B, D, C, A, B, D, C, A, B, D. The exact order depends on the order the nodes started up, but the algorithm used is round robin. - HornetQ cluster connections can be configured to always blindly load balance messages + ActiveMQ cluster connections can be configured to always blindly load balance messages in a round robin fashion irrespective of whether there are any matching consumers on other nodes, but they can be a bit cleverer than that and also be configured to only distribute to other nodes if they have matching consumers. We'll look at both these @@ -563,9 +563,9 @@ ClientSession session = factory.createSession(); Cluster connections group servers into clusters so that messages can be load balanced between the nodes of the cluster. Let's take a look at a typical cluster connection. Cluster connections are always defined in hornetq-configuration.xml inside a activemq-configuration.xml inside a cluster-connection element. There can be zero or more cluster - connections defined per HornetQ server. + connections defined per ActiveMQ server. <cluster-connections> <cluster-connection name="my-cluster"> @@ -607,7 +607,7 @@ ClientSession session = factory.createSession(); with different values of address, simultaneously balancing messages for those addresses, potentially to different clusters of servers. By having multiple cluster connections on different addresses a - single HornetQ Server can effectively take part in multiple clusters + single ActiveMQ Server can effectively take part in multiple clusters simultaneously. Be careful not to have multiple cluster connections with overlapping values of address, e.g. "europe" and "europe.news" since @@ -708,11 +708,11 @@ ClientSession session = factory.createSession(); If this is set to true then each incoming message will be round robin'd even though the same queues on the other nodes of the cluster may have no consumers at all, or they may have consumers that have - non matching message filters (selectors). Note that HornetQ will + non matching message filters (selectors). Note that ActiveMQ will not forward messages to other nodes if there are no queues of the same name on the other nodes, even if this parameter is set to true. - If this is set to false then HornetQ will only forward + If this is set to false then ActiveMQ will only forward messages to other nodes of the cluster if the address to which they are being forwarded has queues which have consumers, and if those consumers have message filters (selectors) at least one of those selectors must match the @@ -722,15 +722,15 @@ ClientSession session = factory.createSession(); max-hops. When a cluster connection decides the set of nodes to which it might load balance a message, those nodes do not have to - be directly connected to it via a cluster connection. HornetQ can be + be directly connected to it via a cluster connection. ActiveMQ can be configured to also load balance messages to nodes which might be connected - to it only indirectly with other HornetQ servers as intermediates in a + to it only indirectly with other ActiveMQ servers as intermediates in a chain. - This allows HornetQ to be configured in more complex topologies and still + This allows ActiveMQ to be configured in more complex topologies and still provide message load balancing. We'll discuss this more later in this chapter. The default value for this parameter is 1, which means - messages are only load balanced to other HornetQ serves which are directly + messages are only load balanced to other ActiveMQ serves which are directly connected to this server. This parameter is optional. @@ -777,26 +777,26 @@ ClientSession session = factory.createSession();
Cluster User Credentials When creating connections between nodes of a cluster to form a cluster connection, - HornetQ uses a cluster user and cluster password which is defined in hornetq-configuration.xml: + ActiveMQ uses a cluster user and cluster password which is defined in activemq-configuration.xml: -<cluster-user>HORNETQ.CLUSTER.ADMIN.USER</cluster-user> +<cluster-user>ACTIVEMQ.CLUSTER.ADMIN.USER</cluster-user> <cluster-password>CHANGE ME!!</cluster-password> It is imperative that these values are changed from their default, or remote clients will be able to make connections to the server using the default values. - If they are not changed from the default, HornetQ will detect this and pester + If they are not changed from the default, ActiveMQ will detect this and pester you with a warning on every start-up.
Client-Side Load balancing - With HornetQ client-side load balancing, subsequent sessions created using a single + With ActiveMQ client-side load balancing, subsequent sessions created using a single session factory can be connected to different nodes of the cluster. This allows sessions to spread smoothly across the nodes of a cluster and not be "clumped" on any particular node. - The load balancing policy to be used by the client factory is configurable. HornetQ + The load balancing policy to be used by the client factory is configurable. ActiveMQ provides four out-of-the-box load balancing policies, and you can also implement your own and use that. The out-of-the-box policies are @@ -833,7 +833,7 @@ ClientSession session = factory.createSession(); >org.apache.activemq.api.core.client.loadbalance.RoundRobinConnectionLoadBalancingPolicy. If you're using JMS, and you're using JNDI on the server to put your JMS connection factories into JNDI, then you can specify the load balancing policy directly in the - hornetq-jms.xml configuration file on the server as follows: + activemq-jms.xml configuration file on the server as follows: <connection-factory name="ConnectionFactory"> <discovery-group-ref discovery-group-name="my-discovery-group"/> @@ -848,14 +848,14 @@ ClientSession session = factory.createSession(); balancing policy. If you're using JMS but you're instantiating your connection factory directly on the client side then you can set the load balancing policy using the setter on the - HornetQConnectionFactory before using it: + ActiveMQConnectionFactory before using it: -ConnectionFactory jmsConnectionFactory = HornetQJMSClient.createConnectionFactory(...); +ConnectionFactory jmsConnectionFactory = ActiveMQJMSClient.createConnectionFactory(...); jmsConnectionFactory.setLoadBalancingPolicyClassName("com.acme.MyLoadBalancingPolicy"); If you're using the core API, you can set the load balancing policy directly on the ServerLocator instance you are using: -ServerLocator locator = HornetQClient.createServerLocatorWithHA(server1, server2); +ServerLocator locator = ActiveMQClient.createServerLocatorWithHA(server1, server2); locator.setLoadBalancingPolicyClassName("com.acme.MyLoadBalancingPolicy"); The set of servers over which the factory load balances can be determined in one of two ways: @@ -904,7 +904,7 @@ locator.setLoadBalancingPolicyClassName("com.acme.MyLoadBalancingPolicy");starvation situation. - This is where message redistribution comes in. With message redistribution HornetQ can + This is where message redistribution comes in. With message redistribution ActiveMQ can be configured to automatically redistribute messages from queues which have no consumers back to other nodes in the cluster which do have matching consumers. @@ -915,7 +915,7 @@ locator.setLoadBalancingPolicyClassName("com.acme.MyLoadBalancingPolicy");Message redistribution can be configured on a per address basis, by specifying the redistribution delay in the address settings, for more information on configuring address settings, please see . - Here's an address settings snippet from hornetq-configuration.xml + Here's an address settings snippet from activemq-configuration.xml showing how message redistribution is enabled for a set of queues: <address-settings> @@ -929,7 +929,7 @@ locator.setLoadBalancingPolicyClassName("com.acme.MyLoadBalancingPolicy"); The attribute match can be an exact match or it can be a string - that conforms to the HornetQ wildcard syntax (described in ). The element redistribution-delay defines the delay in milliseconds after the last consumer is closed on a queue before redistributing messages from that @@ -944,7 +944,7 @@ locator.setLoadBalancingPolicyClassName("com.acme.MyLoadBalancingPolicy");
Cluster topologies - HornetQ clusters can be connected together in many different topologies, let's + ActiveMQ clusters can be connected together in many different topologies, let's consider the two most common ones here
Symmetric cluster @@ -994,11 +994,11 @@ locator.setLoadBalancingPolicyClassName("com.acme.MyLoadBalancingPolicy");
Scaling Down - HornetQ supports scaling down a cluster with no message loss (even for non-durable messages). This is especially + ActiveMQ supports scaling down a cluster with no message loss (even for non-durable messages). This is especially useful in certain environments (e.g. the cloud) where the size of a cluster may change relatively frequently. When scaling up a cluster (i.e. adding nodes) there is no risk of message loss, but when scaling down a cluster (i.e. removing nodes) the messages on those nodes would be lost unless the broker sent them to another node in - the cluster. HornetQ can be configured to do just that. + the cluster. ActiveMQ can be configured to do just that. The simplest way to enable this behavior is to set scale-down to true. If the server is clustered and scale-down is true then when the server is shutdown gracefully (i.e. stopped without crashing) it will find diff --git a/docs/user-manual/en/configuration-index.xml b/docs/user-manual/en/configuration-index.xml index 9e6cf84f12..fb08c55260 100644 --- a/docs/user-manual/en/configuration-index.xml +++ b/docs/user-manual/en/configuration-index.xml @@ -18,7 +18,7 @@ + %BOOK_ENTITIES; ]> @@ -28,7 +28,7 @@
Server Configuration
- hornetq-configuration.xml + activemq-configuration.xml This is the main core server configuration file.
Server Configuration @@ -54,7 +54,7 @@
- hornetq-jms.xml + activemq-jms.xml This is the configuration file used by the server side JMS service to load JMS Queues, Topics and Connection Factories. @@ -436,16 +436,16 @@
Using Masked Passwords in Configuration Files - By default all passwords in HornetQ server's configuration files are in plain text form. This usually poses no security issues as those + By default all passwords in ActiveMQ server's configuration files are in plain text form. This usually poses no security issues as those files should be well protected from unauthorized accessing. However, in some circumstances a user doesn't want to expose its passwords to more eyes than necessary. - HornetQ can be configured to use 'masked' passwords in its configuration files. A masked password is an obscure string representation + ActiveMQ can be configured to use 'masked' passwords in its configuration files. A masked password is an obscure string representation of a real password. To mask a password a user will use an 'encoder'. The encoder takes in the real password and outputs the masked version. A user can then replace the real password in the configuration files with the new masked password. - When HornetQ loads a masked password, it uses a suitable 'decoder' to decode it into real password. + When ActiveMQ loads a masked password, it uses a suitable 'decoder' to decode it into real password. - HornetQ provides a default password encoder and decoder. Optionally users can use or implement their own encoder and decoder for + ActiveMQ provides a default password encoder and decoder. Optionally users can use or implement their own encoder and decoder for masking the passwords.
Password Masking in Server Configuration File @@ -472,9 +472,9 @@ if a users wants to use an SSL-enabled NettyAcceptor, it can specify a key-store-password and a trust-store-password. Because Acceptors and Connectors are pluggable implementations, each transport will have different password masking needs. - When a Connector or Acceptor configuration is initialised, HornetQ will add the "mask-password" and - "password-codec" values to the Connector or Acceptors params using the keys hornetq.usemaskedpassword - and hornetq.passwordcodec respectively. The Netty and InVM implementations will use these + When a Connector or Acceptor configuration is initialised, ActiveMQ will add the "mask-password" and + "password-codec" values to the Connector or Acceptors params using the keys activemq.usemaskedpassword + and activemq.passwordcodec respectively. The Netty and InVM implementations will use these as needed and any other implementations will have access to these to use if they so wish.
@@ -543,7 +543,7 @@ <mask-password>true</mask-password> <cluster-password>80cf731af62c290</cluster-password> - This indicates the cluster password is a masked value and HornetQ will use its built-in decoder to decode it. All other + This indicates the cluster password is a masked value and ActiveMQ will use its built-in decoder to decode it. All other passwords in the configuration file, Connectors, Acceptors and Bridges, will also use masked passwords.
@@ -565,12 +565,12 @@ <property name="passwordCodec">com.foo.FooDecoder;key=value</property> - HornetQ will load this property and initialize the class with a parameter map containing the "key"->"value" pair. + ActiveMQ will load this property and initialize the class with a parameter map containing the "key"->"value" pair. If passwordCodec is not specified, the built-in decoder is used. -
Masking passwords in HornetQ ResourceAdapters and MDB activation configurations +
Masking passwords in ActiveMQ ResourceAdapters and MDB activation configurations Both ra.xml and MDB activation configuration have a 'password' property that can be masked. They are controlled by the following two optional Resource Adapter properties in ra.xml: @@ -596,9 +596,9 @@
-
Masking passwords in hornetq-users.xml +
Masking passwords in activemq-users.xml - HornetQ's built-in security manager uses plain configuration files where the user passwords are specified in plaintext + ActiveMQ's built-in security manager uses plain configuration files where the user passwords are specified in plaintext forms by default. To mask those parameters the following two properties are needed: mask-password -- If set to "true" all the passwords are masked. Default is false. @@ -610,7 +610,7 @@ <mask-password>true</mask-password> <password-codec>org.apache.activemq.utils.DefaultSensitiveStringCodec;key=hello world</password-codec> - When so configured, the HornetQ security manager will initialize a DefaultSensitiveStringCodec with the parameters + When so configured, the ActiveMQ security manager will initialize a DefaultSensitiveStringCodec with the parameters "key"->"hello world", then use it to decode all the masked passwords in this configuration file.
@@ -621,7 +621,7 @@ convert a masked password into its original clear text form in order to be used in various security operations. The algorithm used for decoding must match that for encoding. Otherwise the decoding may not be successful. - For user's convenience HornetQ provides a default built-in Decoder. However a user can if they so wish implement their own. + For user's convenience ActiveMQ provides a default built-in Decoder. However a user can if they so wish implement their own.
The built-in Decoder @@ -644,7 +644,7 @@ Encoded password: 80cf731af62c290
Using a different decoder It is possible to use a different decoder rather than the built-in one. Simply make sure the decoder - is in HornetQ's classpath and configure the server to use it as follows: + is in ActiveMQ's classpath and configure the server to use it as follows: <password-codec>com.foo.SomeDecoder;key1=value1;key2=value2</password-codec> @@ -661,7 +661,7 @@ Encoded password: 80cf731af62c290 <mask-password>true</mask-password> <cluster-password>masked_password</cluster-password> - When HornetQ reads the cluster-password it will initialize the NewDecoder and use it to decode "mask_password". + When ActiveMQ reads the cluster-password it will initialize the NewDecoder and use it to decode "mask_password". It also process all passwords using the new defined decoder.
@@ -696,7 +696,7 @@ public class MyNewDecoder implements SensitiveDataCodec<String> } } - Last but not least, once you get your own decoder, please add it to the classpath. Otherwise HornetQ will + Last but not least, once you get your own decoder, please add it to the classpath. Otherwise ActiveMQ will fail to load it!
diff --git a/docs/user-manual/en/configuring-transports.xml b/docs/user-manual/en/configuring-transports.xml index b3919c314e..68b885067b 100644 --- a/docs/user-manual/en/configuring-transports.xml +++ b/docs/user-manual/en/configuring-transports.xml @@ -18,22 +18,22 @@ + %BOOK_ENTITIES; ]> Configuring the Transport - HornetQ has a fully pluggable and highly flexible transport layer and defines its own + ActiveMQ has a fully pluggable and highly flexible transport layer and defines its own Service Provider Interface (SPI) to make plugging in a new transport provider relatively straightforward. - In this chapter we'll describe the concepts required for understanding HornetQ transports + In this chapter we'll describe the concepts required for understanding ActiveMQ transports and where and how they're configured.
Understanding Acceptors - One of the most important concepts in HornetQ transports is the + One of the most important concepts in ActiveMQ transports is the acceptor. Let's dive straight in and take a look at an acceptor defined in xml in the configuration file hornetq-configuration.xml. + >activemq-configuration.xml. <acceptors> <acceptor name="netty"> @@ -46,7 +46,7 @@ Acceptors are always defined inside an acceptors element. There can be one or more acceptors defined in the acceptors element. There's no upper limit to the number of acceptors per server. - Each acceptor defines a way in which connections can be made to the HornetQ + Each acceptor defines a way in which connections can be made to the ActiveMQ server. In the above example we're defining an acceptor that uses Netty to listen for connections at port @@ -72,7 +72,7 @@ Understanding Connectors Whereas acceptors are used on the server to define how we accept connections, connectors are used by a client to define how it connects to a server. - Let's look at a connector defined in our hornetq-configuration.xml + Let's look at a connector defined in our activemq-configuration.xml file: <connectors> @@ -99,13 +99,13 @@ If you're using JMS and the server side JMS service to instantiate JMS ConnectionFactory instances and bind them in JNDI, then when creating the - HornetQConnectionFactory it needs to know what server + ActiveMQConnectionFactory it needs to know what server that connection factory will create connections to. That's defined by the connector-ref element in the hornetq-jms.xml file on the server side. Let's take a look at a - snipped from a hornetq-jms.xml file that shows a JMS + >activemq-jms.xml file on the server side. Let's take a look at a + snipped from a activemq-jms.xml file that shows a JMS connection factory that references our netty connector defined in our hornetq-configuration.xml file: + >activemq-configuration.xml file: <connection-factory name="ConnectionFactory"> <connectors> @@ -143,7 +143,7 @@ TransportConfiguration transportConfiguration = "org.apache.activemq.core.remoting.impl.netty.NettyConnectorFactory", connectionParams); -ServerLocator locator = HornetQClient.createServerLocatorWithoutHA(transportConfiguration); +ServerLocator locator = ActiveMQClient.createServerLocatorWithoutHA(transportConfiguration); ClientSessionFactory sessionFactory = locator.createClientSessionFactory(); @@ -152,7 +152,7 @@ ClientSession session = sessionFactory.createSession(...); etc Similarly, if you're using JMS, you can configure the JMS connection factory directly on the client side without having to define a connector on the server side or define a - connection factory in hornetq-jms.xml: + connection factory in activemq-jms.xml: Map<String, Object> connectionParams = new HashMap<String, Object>(); @@ -163,7 +163,7 @@ TransportConfiguration transportConfiguration = "org.apache.activemq.core.remoting.impl.netty.NettyConnectorFactory", connectionParams); -ConnectionFactory connectionFactory = HornetQJMSClient.createConnectionFactoryWithoutHA(JMSFactoryType.CF, transportConfiguration); +ConnectionFactory connectionFactory = ActiveMQJMSClient.createConnectionFactoryWithoutHA(JMSFactoryType.CF, transportConfiguration); Connection jmsConnection = connectionFactory.createConnection(); @@ -171,7 +171,7 @@ etc
Configuring the Netty transport - Out of the box, HornetQ currently uses Out of the box, ActiveMQ currently uses Netty, a high performance low level network library. Our Netty transport can be configured in several different ways; to use old (blocking) Java IO, or NIO (non-blocking), also to use straightforward TCP sockets, SSL, or to @@ -179,8 +179,8 @@ etc We believe this caters for the vast majority of transport requirements.
Single Port Support - As of version 2.4 HornetQ now supports using a single port for all protocols, HornetQ will automatically - detect which protocol is being used CORE, AMQP, STOMP or OPENWIRE and use the appropriate HornetQ handler. It will also detect + As of version 2.4 ActiveMQ now supports using a single port for all protocols, ActiveMQ will automatically + detect which protocol is being used CORE, AMQP, STOMP or OPENWIRE and use the appropriate ActiveMQ handler. It will also detect whether protocols such as HTTP or Web Sockets are being used and also use the appropriate decoders It is possible to limit which protocols are supported by using the protocols parameter on the Acceptor like so: @@ -275,7 +275,7 @@ buffer_size = bandwidth * RTT. batch-delay. Before writing packets to the transport, - HornetQ can be configured to batch up writes for a maximum of batch-delay milliseconds. This can increase overall throughput for very small messages. It does so at the expense of an increase in average latency for message transfer. The default value for this property @@ -295,7 +295,7 @@ buffer_size = bandwidth * RTT. nio-remoting-threads. When configured to use NIO, - HornetQ will, by default, use a number of threads equal to three times the + ActiveMQ will, by default, use a number of threads equal to three times the number of cores (or hyper-threads) as reported by Runtime.getRuntime().availableProcessors() for processing incoming packets. If you want to override this value, you can set the number @@ -341,8 +341,8 @@ buffer_size = bandwidth * RTT. authentication). Although this value is configured on the server, it is downloaded and used by the client. If the client needs to use a different path from that set on the server then it can override the server-side setting by either - using the customary "javax.net.ssl.keyStore" system property or the HornetQ-specific - "org.apache.activemq.ssl.keyStore" system property. The HornetQ-specific system property + using the customary "javax.net.ssl.keyStore" system property or the ActiveMQ-specific + "org.apache.activemq.ssl.keyStore" system property. The ActiveMQ-specific system property is useful if another component on client is already making use of the standard, Java system property. @@ -356,8 +356,8 @@ buffer_size = bandwidth * RTT. be configured on the server, it is downloaded and used by the client. If the client needs to use a different password from that set on the server then it can override the server-side setting by either using the customary "javax.net.ssl.keyStorePassword" - system property or the HornetQ-specific "org.apache.activemq.ssl.keyStorePassword" system - property. The HornetQ-specific system property is useful if another component on client + system property or the ActiveMQ-specific "org.apache.activemq.ssl.keyStorePassword" system + property. The ActiveMQ-specific system property is useful if another component on client is already making use of the standard, Java system property. @@ -371,8 +371,8 @@ buffer_size = bandwidth * RTT. trusts. Although this value can be configured on the server, it is downloaded and used by the client. If the client needs to use a different path from that set on the server then it can override the server-side setting by either - using the customary "javax.net.ssl.trustStore" system property or the HornetQ-specific - "org.apache.activemq.ssl.trustStore" system property. The HornetQ-specific system property + using the customary "javax.net.ssl.trustStore" system property or the ActiveMQ-specific + "org.apache.activemq.ssl.trustStore" system property. The ActiveMQ-specific system property is useful if another component on client is already making use of the standard, Java system property. @@ -386,8 +386,8 @@ buffer_size = bandwidth * RTT. downloaded and used by the client. If the client needs to use a different password from that set on the server then it can override the server-side setting by either using the customary "javax.net.ssl.trustStorePassword" - system property or the HornetQ-specific "org.apache.activemq.ssl.trustStorePassword" system - property. The HornetQ-specific system property is useful if another component on client + system property or the ActiveMQ-specific "org.apache.activemq.ssl.trustStorePassword" system + property. The ActiveMQ-specific system property is useful if another component on client is already making use of the standard, Java system property. @@ -420,7 +420,7 @@ buffer_size = bandwidth * RTT. http-enabled. This is now no longer needed as of version 2.4. With single - port support HornetQ will now automatically detect if http is being used and configure itself. + port support ActiveMQ will now automatically detect if http is being used and configure itself. http-client-idle-time. How long a client can be idle @@ -447,7 +447,7 @@ buffer_size = bandwidth * RTT.
Configuring Netty Servlet - As of 2.4 HornetQ Servlet support will be provided via Undertow in Wildfly + As of 2.4 ActiveMQ Servlet support will be provided via Undertow in Wildfly
diff --git a/docs/user-manual/en/connection-ttl.xml b/docs/user-manual/en/connection-ttl.xml index 42359e67ca..ddb886c390 100644 --- a/docs/user-manual/en/connection-ttl.xml +++ b/docs/user-manual/en/connection-ttl.xml @@ -18,17 +18,17 @@ + %BOOK_ENTITIES; ]> Detecting Dead Connections - In this section we will discuss connection time-to-live (TTL) and explain how HornetQ + In this section we will discuss connection time-to-live (TTL) and explain how ActiveMQ deals with crashed clients and clients which have exited without cleanly closing their resources.
Cleaning up Dead Connection Resources on the Server - Before a HornetQ client application exits it is considered good practice that it + Before a ActiveMQ client application exits it is considered good practice that it should close its resources in a controlled manner, using a finally block. Here's an example of a well behaved core client application closing its session and @@ -40,7 +40,7 @@ ClientSession session = null; try { - locator = HornetQClient.createServerLocatorWithoutHA(..); + locator = ActiveMQClient.createServerLocatorWithoutHA(..); sf = locator.createClientSessionFactory();; @@ -71,7 +71,7 @@ Connection jmsConnection = null; try { - ConnectionFactory jmsConnectionFactory = HornetQJMSClient.createConnectionFactoryWithoutHA(...); + ConnectionFactory jmsConnectionFactory = ActiveMQJMSClient.createConnectionFactoryWithoutHA(...); jmsConnection = jmsConnectionFactory.createConnection(); @@ -91,11 +91,11 @@ finally over time this result in the server running out of memory or other resources. We have to balance the requirement for cleaning up dead client resources with the fact that sometimes the network between the client and the server can fail and then come - back, allowing the client to reconnect. HornetQ supports client reconnection, so we + back, allowing the client to reconnect. ActiveMQ supports client reconnection, so we don't want to clean up "dead" server side resources too soon or this will prevent any client from reconnecting, as it won't be able to find its old sessions on the server. - HornetQ makes all of this configurable. For each ActiveMQ makes all of this configurable. For each ClientSessionFactory we define a connection TTL. Basically, the TTL determines how long the server will keep a connection alive in the absence of any data arriving from the client. The client will automatically send "ping" @@ -104,7 +104,7 @@ finally automatically close all the sessions on the server that relate to that connection. If you're using JMS, the connection TTL is defined by the ConnectionTTL attribute on a HornetQConnectionFactory + >ConnectionTTL attribute on a ActiveMQConnectionFactory instance, or if you're deploying JMS connection factory instances direct into JNDI on the server side, you can specify it in the xml config, using the parameter connection-ttl. @@ -124,7 +124,7 @@ finally As previously discussed, it's important that all core client sessions and JMS connections are always closed explicitly in a finally block when you are finished using them. - If you fail to do so, HornetQ will detect this at garbage collection time, and log + If you fail to do so, ActiveMQ will detect this at garbage collection time, and log a warning similar to the following in the logs (If you are using JMS the warning will involve a JMS connection not a client session): @@ -134,7 +134,7 @@ ting them go out of scope! java.lang.Exception at org.apache.activemq.core.client.impl.DelegatingSession.<init>(DelegatingSession.java:83) at org.acme.yourproject.YourClass (YourClass.java:666) - HornetQ will then close the connection / client session for you. + ActiveMQ will then close the connection / client session for you. Note that the log will also tell you the exact line of your user code where you created the JMS connection / client session that you later did not close. This will enable you to pinpoint the error in your code and correct it appropriately. @@ -154,9 +154,9 @@ java.lang.Exception >FailureListener instances (or ExceptionListener instances if you are using JMS) depending on how it has been configured. If you're using JMS it's defined by the ClientFailureCheckPeriod - attribute on a HornetQConnectionFactory instance, or if you're + attribute on a ActiveMQConnectionFactory instance, or if you're deploying JMS connection factory instances direct into JNDI on the server side, you can - specify it in the hornetq-jms.xml configuration file, using the + specify it in the activemq-jms.xml configuration file, using the parameter client-failure-check-period. The default value for client failure check period on an "unreliable" connection (e.g. a Netty connection) is 30000ms, i.e. 30 seconds. The default value @@ -197,7 +197,7 @@ java.lang.Exception To disable asynchronous connection execution, set the parameter async-connection-execution-enabled in - hornetq-configuration.xml to false (default value is + activemq-configuration.xml to false (default value is true).
diff --git a/docs/user-manual/en/core-bridges.xml b/docs/user-manual/en/core-bridges.xml index 408de0200e..97bf4ac999 100644 --- a/docs/user-manual/en/core-bridges.xml +++ b/docs/user-manual/en/core-bridges.xml @@ -18,28 +18,28 @@ + %BOOK_ENTITIES; ]> Core Bridges The function of a bridge is to consume messages from a source queue, and forward them to a - target address, typically on a different HornetQ server. + target address, typically on a different ActiveMQ server. The source and target servers do not have to be in the same cluster which makes bridging suitable for reliably sending messages from one cluster to another, for instance across a WAN, or internet and where the connection may be unreliable. The bridge has built in resilience to failure so if the target server connection is lost, e.g. due to network failure, the bridge will retry connecting to the target until it comes back online. When it comes back online it will resume operation as normal. - In summary, bridges are a way to reliably connect two separate HornetQ servers together. - With a core bridge both source and target servers must be HornetQ servers. + In summary, bridges are a way to reliably connect two separate ActiveMQ servers together. + With a core bridge both source and target servers must be ActiveMQ servers. Bridges can be configured to provide once and only once delivery guarantees even in the event of the failure of the source or the target server. They do this by using duplicate detection (described in ). Although they have similar function, don't confuse core bridges with JMS bridges! - Core bridges are for linking a HornetQ node with another HornetQ node and do not use + Core bridges are for linking a ActiveMQ node with another ActiveMQ node and do not use the JMS API. A JMS Bridge is used for linking any two JMS 1.1 compliant JMS providers. So, a JMS Bridge could be used for bridging to or from different JMS compliant messaging system. It's always preferable to use a core bridge if you can. Core bridges use @@ -49,7 +49,7 @@
Configuring Bridges - Bridges are configured in hornetq-configuration.xml. Let's kick off + Bridges are configured in activemq-configuration.xml. Let's kick off with an example (this is actually from the bridge example): <bridge name="my-bridge"> @@ -92,8 +92,8 @@ start-up. If you're using JMS then normally the JMS configuration hornetq-jms.xml is loaded after the core configuration file - hornetq-configuration.xml is loaded. If your bridge + >activemq-jms.xml is loaded after the core configuration file + activemq-configuration.xml is loaded. If your bridge is consuming from a JMS queue then you'll need to make sure the JMS queue is also deployed as a core queue in the core configuration. Take a look at the bridge example for an example of how this is done. @@ -107,7 +107,7 @@ filter-string. An optional filter string can be supplied. If specified then only messages which match the filter expression specified in - the filter string will be forwarded. The filter string follows the HornetQ + the filter string will be forwarded. The filter string follows the ActiveMQ filter expression syntax described in . @@ -210,13 +210,13 @@ user. This optional parameter determines the user name to use when creating the bridge connection to the remote server. If it is not specified the default cluster user specified by cluster-user - in hornetq-configuration.xml will be used. + in activemq-configuration.xml will be used. password. This optional parameter determines the password to use when creating the bridge connection to the remote server. If it is not specified the default cluster password specified by cluster-password in hornetq-configuration.xml + >cluster-password in activemq-configuration.xml will be used. diff --git a/docs/user-manual/en/diverts.xml b/docs/user-manual/en/diverts.xml index 8d815681a1..178cf48c8a 100644 --- a/docs/user-manual/en/diverts.xml +++ b/docs/user-manual/en/diverts.xml @@ -19,13 +19,13 @@ + %BOOK_ENTITIES; ]> Diverting and Splitting Message Flows - HornetQ allows you to configure objects called diverts with + ActiveMQ allows you to configure objects called diverts with some simple server configuration. Diverts allow you to transparently divert messages routed to one address to some other address, without making any changes to any client application logic. @@ -49,7 +49,7 @@ thought of as a type of routing table for messages. Combining diverts with bridges allows you to create a distributed network of reliable routing connections between multiple geographically distributed servers, creating your global messaging mesh. - Diverts are defined as xml in the hornetq-configuration.xml file. There can + Diverts are defined as xml in the activemq-configuration.xml file. There can be zero or more diverts in the file. Please see for a full working example showing you how to configure and use diverts. @@ -86,7 +86,7 @@ change the messages body or properties before it is diverted. In this example the transformer simply adds a header that records the time the divert happened. This example is actually diverting messages to a local store and forward queue, which - is configured with a bridge which forwards the message to an address on another HornetQ + is configured with a bridge which forwards the message to an address on another ActiveMQ server. Please see the example for more details.
diff --git a/docs/user-manual/en/duplicate-detection.xml b/docs/user-manual/en/duplicate-detection.xml index 97c7a6410f..9da24e36a2 100644 --- a/docs/user-manual/en/duplicate-detection.xml +++ b/docs/user-manual/en/duplicate-detection.xml @@ -19,15 +19,15 @@ + %BOOK_ENTITIES; ]> Duplicate Message Detection - HornetQ includes powerful automatic duplicate message detection, filtering out + ActiveMQ includes powerful automatic duplicate message detection, filtering out duplicate messages without you having to code your own fiddly duplicate detection logic at - the application level. This chapter will explain what duplicate detection is, how HornetQ + the application level. This chapter will explain what duplicate detection is, how ActiveMQ uses it and how and where to configure it. When sending messages from a client to a server, or indeed from a server to another server, if the target server or connection fails sometime after sending the message, but @@ -48,7 +48,7 @@ Sending the message(s) in a transaction does not help out either. If the server or connection fails while the transaction commit is being processed it is also indeterminate whether the transaction was successfully committed or not! - To solve these issues HornetQ provides automatic duplicate messages detection for + To solve these issues ActiveMQ provides automatic duplicate messages detection for messages sent to addresses.
Using Duplicate Detection for Message Sending @@ -107,11 +107,11 @@ message.setStringProperty(HDR_DUPLICATE_DETECTION_ID.toString(), myUniqueID); >n elements, then the n + 1th id stored will overwrite the 0th element in the cache. The maximum size of the cache is configured by the parameter id-cache-size in hornetq-configuration.xml, the default + >id-cache-size in activemq-configuration.xml, the default value is 2000 elements. The caches can also be configured to persist to disk or not. This is configured by the parameter persist-id-cache, also in hornetq-configuration.xml. If this is set to true then + >activemq-configuration.xml. If this is set to true then each id will be persisted to permanent storage as they are received. The default value for this parameter is true. @@ -129,7 +129,7 @@ message.setStringProperty(HDR_DUPLICATE_DETECTION_ID.toString(), myUniqueID); it will be ignored. To configure a core bridge to add the duplicate id header, simply set the use-duplicate-detection to true when configuring a - bridge in hornetq-configuration.xml. + bridge in activemq-configuration.xml. The default value for this parameter is true. For more information on core bridges and how to configure them, please see . @@ -141,7 +141,7 @@ message.setStringProperty(HDR_DUPLICATE_DETECTION_ID.toString(), myUniqueID); id header for each message they move using their internal bridges. To configure a cluster connection to add the duplicate id header, simply set the use-duplicate-detection to true when - configuring a cluster connection in hornetq-configuration.xml. + configuring a cluster connection in activemq-configuration.xml. The default value for this parameter is true. For more information on cluster connections and how to configure them, please see . diff --git a/docs/user-manual/en/embedding-hornetq.xml b/docs/user-manual/en/embedding-activemq.xml similarity index 76% rename from docs/user-manual/en/embedding-hornetq.xml rename to docs/user-manual/en/embedding-activemq.xml index 3b8e421981..e41ca8a628 100644 --- a/docs/user-manual/en/embedding-hornetq.xml +++ b/docs/user-manual/en/embedding-activemq.xml @@ -20,52 +20,52 @@ + %BOOK_ENTITIES; ]> - - Embedding HornetQ + + Embedding ActiveMQ - HornetQ is designed as set of simple Plain Old Java Objects (POJOs). - This means HornetQ can be instantiated and run in any dependency injection + ActiveMQ is designed as set of simple Plain Old Java Objects (POJOs). + This means ActiveMQ can be instantiated and run in any dependency injection framework such as JBoss Microcontainer, Spring or Google Guice. It also means that if you have an application that could use messaging functionality - internally, then it can directly instantiate HornetQ + internally, then it can directly instantiate ActiveMQ clients and servers in its own application code to perform that - functionality. We call this embedding HornetQ. + 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 HornetQ can be done in very few easy steps. Instantiate the + Embedding ActiveMQ can be done in very few easy steps. Instantiate the configuration object, instantiate the server, start it, and you have a - HornetQ running in your virtual machine. It's as simple and easy as + ActiveMQ running in your virtual machine. It's as simple and easy as that.
Simple Config File Embedding - The simplest way to embed HornetQ is to use the embedded wrapper - classes and configure HornetQ through its configuration files. There are + 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 - HornetQ Core API or JMS. + ActiveMQ Core API or JMS.
Core API Only - For instantiating a core HornetQ Server only, the steps are pretty + For instantiating a core ActiveMQ Server only, the steps are pretty simple. The example requires that you have defined a configuration file - hornetq-configuration.xml in your + activemq-configuration.xml in your classpath: -import org.apache.activemq.core.server.embedded.EmbeddedHornetQ; +import org.apache.activemq.core.server.embedded.EmbeddedActiveMQ; ... -EmbeddedHornetQ embedded = new EmbeddedHornetQ(); +EmbeddedActiveMQ embedded = new EmbeddedActiveMQ(); embedded.start(); -ClientSessionFactory nettyFactory = HornetQClient.createClientSessionFactory( +ClientSessionFactory nettyFactory = ActiveMQClient.createClientSessionFactory( new TransportConfiguration( InVMConnectorFactory.class.getName())); @@ -91,7 +91,7 @@ System.out.println("message = " + msgReceived.getBody().readString()); session.close(); -The EmbeddedHornetQ class has a +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. @@ -102,11 +102,11 @@ session.close(); JMS embedding is simple as well. This example requires that you have defined the config files - hornetq-configuration.xml, - hornetq-jms.xml, and a - hornetq-users.xml if you have security enabled. Let's + 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 - hornetq-jms.xml config file. + activemq-jms.xml config file. import org.apache.activemq.jms.server.embedded.EmbeddedJMS; @@ -116,14 +116,14 @@ import org.apache.activemq.jms.server.embedded.EmbeddedJMS; EmbeddedJMS jms = new EmbeddedJMS(); jms.start(); -// This assumes we have configured hornetq-jms.xml with the appropriate config information +// This assumes we have configured activemq-jms.xml with the appropriate config information ConnectionFactory connectionFactory = jms.lookup("ConnectionFactory"); Destination destination = jms.lookup("/example/queue"); ... regular JMS code ... By default, the EmbeddedJMS class will store component entries defined within your - hornetq-jms.xml file in an internal concurrent hash + 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 @@ -136,10 +136,10 @@ Destination destination = jms.lookup("/example/queue"); POJO instantiation - Embedding Programmatically You can follow this step-by-step guide to programmatically embed the - core, non-JMS HornetQ Server instance: + core, non-JMS ActiveMQ Server instance: Create the configuration object - this contains configuration - information for a HornetQ instance. The setter methods of this class allow + information for a ActiveMQ instance. The setter methods of this class allow you to programmatically set configuration options as describe in the section. @@ -163,25 +163,25 @@ transports.add(new TransportConfiguration(InVMAcceptorFactory.class.getName())); config.setAcceptorConfigurations(transports); You need to instantiate an instance of - org.apache.activemq.api.core.server.embedded.EmbeddedHornetQ + org.apache.activemq.api.core.server.embedded.EmbeddedActiveMQ and add the configuration object to it. -import org.apache.activemq.api.core.server.HornetQ; -import org.apache.activemq.core.server.embedded.EmbeddedHornetQ; +import org.apache.activemq.api.core.server.ActiveMQ; +import org.apache.activemq.core.server.embedded.EmbeddedActiveMQ; ... -EmbeddedHornetQ server = new EmbeddedHornetQ(); +EmbeddedActiveMQ server = new EmbeddedActiveMQ(); server.setConfiguration(config); server.start(); You also have the option of instantiating - HornetQServerImpl directly: + ActiveMQServerImpl directly: -HornetQServer server = new HornetQServerImpl(config); +ActiveMQServer server = new ActiveMQServerImpl(config); server.start(); For JMS POJO instantiation, you work with the EmbeddedJMS class @@ -191,7 +191,7 @@ server.start(); example of this: -// Step 1. Create HornetQ core configuration, and set the properties accordingly +// Step 1. Create ActiveMQ core configuration, and set the properties accordingly Configuration configuration = new ConfigurationImpl(); configuration.setPersistenceEnabled(false); configuration.setSecurityEnabled(false); @@ -209,14 +209,14 @@ jmsConfig.getConnectionFactoryConfigurations().add(cfConfig); JMSQueueConfiguration queueConfig = new JMSQueueConfigurationImpl("queue1", null, false, "/queue/queue1"); jmsConfig.getQueueConfigurations().add(queueConfig); -// Step 5. Start the JMS Server using the HornetQ core server and the JMS configuration +// 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(); Please see for an example which - shows how to setup and run HornetQ embedded with JMS. + shows how to setup and run ActiveMQ embedded with JMS.
@@ -225,17 +225,17 @@ jmsServer.start(); You may also choose to use a dependency injection framework such as JBoss Micro Container or Spring Framework. See for more - details on Spring and HornetQ, but here's how you would do things with the + details on Spring and ActiveMQ, but here's how you would do things with the JBoss Micro Container. - HornetQ standalone uses JBoss Micro Container as the injection - framework. HornetQBootstrapServer and - hornetq-beans.xml which are part of the HornetQ + ActiveMQ standalone uses JBoss Micro Container as the injection + framework. ActiveMQBootstrapServer and + activemq-beans.xml which are part of the ActiveMQ distribution provide a very complete implementation of what's needed to bootstrap the server using JBoss Micro Container. When using JBoss Micro Container, you need to provide an XML file - declaring the HornetQServer and + declaring the ActiveMQServer and Configuration object, you can also inject a security manager and a MBean server if you want, but those are optional. @@ -251,8 +251,8 @@ jmsServer.start(); </bean> <!-- The core server --> - <bean name="HornetQServer" - class="org.apache.activemq.core.server.impl.HornetQServerImpl"> + <bean name="ActiveMQServer" + class="org.apache.activemq.core.server.impl.ActiveMQServerImpl"> <constructor> <parameter> <inject bean="Configuration"/> @@ -261,11 +261,11 @@ jmsServer.start(); </bean> </deployment> - HornetQBootstrapServer provides an easy + ActiveMQBootstrapServer provides an easy encapsulation of JBoss Micro Container. -HornetQBootstrapServer bootStrap = new HornetQBootstrapServer(new String[] {"hornetq-beans.xml"}); +ActiveMQBootstrapServer bootStrap = new ActiveMQBootstrapServer(new String[] {"activemq-beans.xml"}); bootStrap.run();
diff --git a/docs/user-manual/en/examples.xml b/docs/user-manual/en/examples.xml index d202c899c3..a128deaf71 100644 --- a/docs/user-manual/en/examples.xml +++ b/docs/user-manual/en/examples.xml @@ -18,12 +18,12 @@ + %BOOK_ENTITIES; ]> Examples - The HornetQ distribution comes with over 70 run out-of-the-box examples demonstrating many + The ActiveMQ distribution comes with over 70 run out-of-the-box examples demonstrating many of the features. The examples are available in the distribution, in the examples directory. Examples are split into JMS and core examples. JMS examples show how a particular @@ -49,11 +49,11 @@
Application-Layer Failover - HornetQ also supports Application-Layer failover, useful in the case that + ActiveMQ also supports Application-Layer failover, useful in the case that replication is not enabled on the server side. With Application-Layer failover, it's up to the application to register a JMS - ExceptionListener with HornetQ which will be called by - HornetQ in the event that connection failure is detected. + ExceptionListener with ActiveMQ which will be called by + ActiveMQ in the event that connection failure is detected. The code in the ExceptionListener then recreates the JMS connection, session, etc on another node and the application can continue. Application-layer failover is an alternative approach to High Availability (HA). @@ -68,7 +68,7 @@ The bridge example demonstrates a core bridge deployed on one server, which consumes messages from a local queue and forwards them to an address on a second server. - Core bridges are used to create message flows between any two HornetQ servers + Core bridges are used to create message flows between any two ActiveMQ servers which are remotely separated. Core bridges are resilient and will cope with temporary connection failure allowing them to be an ideal choice for forwarding over unreliable connections, e.g. a WAN. @@ -76,7 +76,7 @@
Browser The browser example shows you how to use a JMS QueueBrowser with HornetQ. + >QueueBrowser with ActiveMQ. Queues are a standard part of JMS, please consult the JMS 1.1 specification for full details. A QueueBrowser is used to look at messages on the queue @@ -98,7 +98,7 @@ The client-side-load-balancing example demonstrates how sessions created from a single JMS Connection can be created to different nodes of the cluster. In other words it demonstrates how - HornetQ does client-side load-balancing of sessions across the cluster. + ActiveMQ does client-side load-balancing of sessions across the cluster.
Clustered Durable Subscription @@ -154,10 +154,10 @@
Message Consumer Rate Limiting - With HornetQ you can specify a maximum consume rate at which a JMS MessageConsumer + With ActiveMQ you can specify a maximum consume rate at which a JMS MessageConsumer will consume messages. This can be specified when creating or deploying the connection factory. - If this value is specified then HornetQ will ensure that messages are never + If this value is specified then ActiveMQ will ensure that messages are never consumed at a rate higher than the specified rate. This is a form of consumer throttling.
@@ -176,7 +176,7 @@
Delayed Redelivery - The delayed-redelivery example demonstrates how HornetQ can be + The delayed-redelivery example demonstrates how ActiveMQ can be configured to provide a delayed redelivery in the case a message needs to be redelivered. Delaying redelivery can often be useful in the case that clients regularly fail or @@ -187,14 +187,14 @@
Divert - HornetQ diverts allow messages to be transparently "diverted" or copied from one + ActiveMQ diverts allow messages to be transparently "diverted" or copied from one address to another with just some simple configuration defined on the server side.
Durable Subscription The durable-subscription example shows you how to use a durable - subscription with HornetQ. Durable subscriptions are a standard part of JMS, please + subscription with ActiveMQ. Durable subscriptions are a standard part of JMS, please consult the JMS 1.1 specification for full details. Unlike non-durable subscriptions, the key function of durable subscriptions is that the messages contained in them persist longer than the lifetime of the @@ -210,7 +210,7 @@
Embedded Simple - The embedded example shows how to embed JMS within your own code using regular HornetQ XML files. + The embedded example shows how to embed JMS within your own code using regular ActiveMQ XML files.
Message Expiration @@ -219,19 +219,19 @@ period of time before being removed. JMS specification states that clients should not receive messages that have been expired (but it does not guarantee this will not happen). - HornetQ can assign an expiry address to a given queue so that when messages + ActiveMQ can assign an expiry address to a given queue so that when messages are expired, they are removed from the queue and sent to the expiry address. These "expired" messages can later be consumed from the expiry address for further inspection.
-
- HornetQ Resource Adapter example - This examples shows how to build the hornetq resource adapters a rar for deployment in other Application +
+ ActiveMQ Resource Adapter example + This examples shows how to build the activemq resource adapters a rar for deployment in other Application Server's
HTTP Transport - The http-transport example shows you how to configure HornetQ + The http-transport example shows you how to configure ActiveMQ to use the HTTP protocol as its transport layer.
@@ -241,18 +241,18 @@ before being used by the client code. This objects are called "administered objects" in JMS terminology. However, in some cases a JNDI server may not be available or desired. To come to - the rescue HornetQ also supports the direct instantiation of these administered + the rescue ActiveMQ also supports the direct instantiation of these administered objects on the client side so you don't have to use JNDI for JMS.
Interceptor - HornetQ allows an application to use an interceptor to hook into the messaging - system. Interceptors allow you to handle various message events in HornetQ. + ActiveMQ allows an application to use an interceptor to hook into the messaging + system. Interceptors allow you to handle various message events in ActiveMQ.
JAAS - The jaas example shows you how to configure HornetQ to use JAAS - for security. HornetQ can leverage JAAS to delegate user authentication and + The jaas example shows you how to configure ActiveMQ to use JAAS + for security. ActiveMQ can leverage JAAS to delegate user authentication and authorization to existing security infrastructure.
@@ -263,18 +263,18 @@
JMS Completion Listener The jms-completion-listener example shows how to send a message - asynchronously to HornetQ and use a CompletionListener to be notified of the Broker + asynchronously to ActiveMQ and use a CompletionListener to be notified of the Broker receiving it.
JMS Bridge The jms-brige example shows how to setup a bridge - between two standalone HornetQ servers. + between two standalone ActiveMQ servers.
JMS Context The jms-context example shows how to send and receive a message - to a JMS Queue using HornetQ by using a JMS Context. + to a JMS Queue using ActiveMQ by using a JMS Context. A JMSContext is part of JMS 2.0 and combines the JMS Connection and Session Objects into a simple Interface.
@@ -287,17 +287,17 @@
JMX Management - The jmx example shows how to manage HornetQ using JMX. + The jmx example shows how to manage ActiveMQ using JMX.
Large Message The large-message example shows you how to send and receive - very large messages with HornetQ. HornetQ supports the sending and receiving of huge + very large messages with ActiveMQ. ActiveMQ supports the sending and receiving of huge messages, much larger than can fit in available RAM on the client or server. Effectively the only limit to message size is the amount of disk space you have on the server. Large messages are persisted on the server so they can survive a server restart. - In other words HornetQ doesn't just do a simple socket stream from the sender to the + In other words ActiveMQ doesn't just do a simple socket stream from the sender to the consumer.
@@ -312,13 +312,13 @@
Management - The management example shows how to manage HornetQ using JMS + The management example shows how to manage ActiveMQ using JMS Messages to invoke management operations on the server.
Management Notification The management-notification example shows how to receive - management notifications from HornetQ using JMS messages. HornetQ servers emit + management notifications from ActiveMQ using JMS messages. ActiveMQ servers emit management notifications when events of interest occur (consumers are created or closed, addresses are created or deleted, security authentication fails, etc.). @@ -331,7 +331,7 @@
Message Group The message-group example shows you how to configure and use - message groups with HornetQ. Message groups allow you to pin messages so they are + message groups with ActiveMQ. Message groups allow you to pin messages so they are only consumed by a single consumer. Message groups are sets of messages that has the following characteristics: @@ -350,7 +350,7 @@
Message Group The message-group2 example shows you how to configure and use - message groups with HornetQ via a connection factory. + message groups with ActiveMQ via a connection factory.
Message Priority @@ -376,16 +376,16 @@
No Consumer Buffering - By default, HornetQ consumers buffer messages from the server in a client side + By default, ActiveMQ consumers buffer messages from the server in a client side buffer before you actually receive them on the client side. This improves performance since otherwise every time you called receive() or had processed the - last message in a MessageListener onMessage() method, the HornetQ + last message in a MessageListener onMessage() method, the ActiveMQ client would have to go the server to request the next message, which would then get sent to the client side, if one was available. This would involve a network round trip for every message and reduce performance. - Therefore, by default, HornetQ pre-fetches messages into a buffer on each + Therefore, by default, ActiveMQ pre-fetches messages into a buffer on each consumer. - In some case buffering is not desirable, and HornetQ allows it to be switched off. + In some case buffering is not desirable, and ActiveMQ allows it to be switched off. This example demonstrates that.
@@ -394,7 +394,7 @@ as a live-backup pair for high availability (HA), and a client using a non-transacted JMS session failing over from live to backup when the live server is crashed. - HornetQ implements failover of client connections between + ActiveMQ implements failover of client connections between live and backup servers. This is implemented by the replication of state between live and backup nodes. When replication is configured and a live node crashes, the client connections can carry and continue to send and consume messages. When non-transacted @@ -403,12 +403,12 @@
OpenWire - The Openwire example shows how to configure a HornetQ + The Openwire example shows how to configure a ActiveMQ server to communicate with an ActiveMQ JMS client that uses open-wire protocol.
Paging - The paging example shows how HornetQ can support huge queues + The paging example shows how ActiveMQ can support huge queues even when the server is running in limited RAM. It does this by transparently paging messages to disk, and depaging them when they are required. @@ -422,24 +422,24 @@ All of these standard modes involve sending acknowledgements from the client to the server. However in some cases, you really don't mind losing messages in event of failure, so it would make sense to acknowledge the message on the server before - delivering it to the client. This example demonstrates how HornetQ allows this with + delivering it to the client. This example demonstrates how ActiveMQ allows this with an extra acknowledgement mode.
Message Producer Rate Limiting - The producer-rte-limit example demonstrates how, with HornetQ, + The producer-rte-limit example demonstrates how, with ActiveMQ, you can specify a maximum send rate at which a JMS message producer will send messages.
Proton Qpid - HornetQ can be configured to accept requests from any AMQP client that supports the + ActiveMQ can be configured to accept requests from any AMQP client that supports the 1.0 version of the protocol. This proton-j example shows a simply qpid java 1.0 client example.
Proton Ruby - HornetQ can be configured to accept requests from any AMQP client that supports the + ActiveMQ can be configured to accept requests from any AMQP client that supports the 1.0 version of the protocol. This example shows a simply proton ruby client that sends and receives messages
@@ -466,7 +466,7 @@ Reattach Node example The Reattach Node example shows how a client can try to reconnect to the same server instead of failing the connection immediately and - notifying any user ExceptionListener objects. HornetQ can be configured to automatically + notifying any user ExceptionListener objects. ActiveMQ can be configured to automatically retry the connection, and reattach to the server when it becomes available again across the network.
@@ -494,71 +494,71 @@
Rest example - An example showing how to use the HornetQ Rest API + An example showing how to use the ActiveMQ Rest API
Scheduled Message The scheduled-message example shows you how to send a scheduled - message to a JMS Queue with HornetQ. Scheduled messages won't get delivered until a + message to a JMS Queue with ActiveMQ. Scheduled messages won't get delivered until a specified time in the future.
Security The security example shows you how configure and use role based - queue security with HornetQ. + queue security with ActiveMQ.
Send Acknowledgements The send-acknowledgements example shows you how to use - HornetQ's advanced asynchronous send acknowledgements feature + ActiveMQ's advanced asynchronous send acknowledgements feature to obtain acknowledgement from the server that sends have been received and processed in a separate stream to the sent messages.
Spring Integration - This example shows how to use embedded JMS using HornetQ's Spring integration. + This example shows how to use embedded JMS using ActiveMQ's Spring integration.
SSL Transport - The ssl-enabled shows you how to configure SSL with HornetQ to + The ssl-enabled shows you how to configure SSL with ActiveMQ to send and receive message.
Static Message Selector The static-selector example shows you how to configure a - HornetQ core queue with static message selectors (filters). + ActiveMQ core queue with static message selectors (filters).
Static Message Selector Using JMS The static-selector-jms example shows you how to configure a - HornetQ queue with static message selectors (filters) using JMS. + ActiveMQ queue with static message selectors (filters) using JMS.
Stomp The stomp example shows you how to configure a - HornetQ server to send and receive Stomp messages. + ActiveMQ server to send and receive Stomp messages.
Stomp1.1 The stomp example shows you how to configure a - HornetQ server to send and receive Stomp messages via a Stomp 1.1 connection. + ActiveMQ server to send and receive Stomp messages via a Stomp 1.1 connection.
Stomp1.2 The stomp example shows you how to configure a - HornetQ server to send and receive Stomp messages via a Stomp 1.2 connection. + ActiveMQ server to send and receive Stomp messages via a Stomp 1.2 connection.
Stomp Over Web Sockets The stomp-websockets example shows you how to configure a - HornetQ server to send and receive Stomp messages directly from Web browsers (provided + ActiveMQ server to send and receive Stomp messages directly from Web browsers (provided they support Web Sockets).
Symmetric Cluster The symmetric-cluster example demonstrates a symmetric cluster - set-up with HornetQ. - HornetQ has extremely flexible clustering which allows you to set-up servers in + set-up with ActiveMQ. + ActiveMQ has extremely flexible clustering which allows you to set-up servers in many different topologies. The most common topology that you'll perhaps be familiar with if you are used to application server clustering is a symmetric cluster. With a symmetric cluster, the cluster is homogeneous, i.e. each node is configured @@ -575,14 +575,14 @@
Topic Hierarchy - HornetQ supports topic hierarchies. With a topic hierarchy you can register a + ActiveMQ supports topic hierarchies. With a topic hierarchy you can register a subscriber with a wild-card and that subscriber will receive any messages sent to an address that matches the wild card.
Topic Selector 1 The topic-selector-example1 example shows you how to send - message to a JMS Topic, and subscribe them using selectors with HornetQ. + message to a JMS Topic, and subscribe them using selectors with ActiveMQ.
Topic Selector 2 @@ -595,7 +595,7 @@ as a live-backup pair for high availability (HA), and a client using a transacted JMS session failing over from live to backup when the live server is crashed. - HornetQ implements failover of client connections between + ActiveMQ implements failover of client connections between live and backup servers. This is implemented by the sharing of a journal between the servers. When a live node crashes, the client connections can carry and continue to send and consume messages. When transacted @@ -610,29 +610,29 @@
Transactional Session The transactional example shows you how to use a transactional - Session with HornetQ. + Session with ActiveMQ.
XA Heuristic The xa-heuristic example shows you how to make an XA heuristic - decision through HornetQ Management Interface. A heuristic decision is a unilateral + decision through ActiveMQ Management Interface. A heuristic decision is a unilateral decision to commit or rollback an XA transaction branch after it has been prepared.
XA Receive The xa-receive example shows you how message receiving behaves - in an XA transaction in HornetQ. + in an XA transaction in ActiveMQ.
XA Send The xa-send example shows you how message sending behaves in an - XA transaction in HornetQ. + XA transaction in ActiveMQ.
XA with Transaction Manager The xa-with-jta example shows you how to use JTA interfaces to - control transactions with HornetQ. + control transactions with ActiveMQ.
@@ -641,7 +641,7 @@ directory and type ant
Embedded - The embedded example shows how to embed the HornetQ server + The embedded example shows how to embed the ActiveMQ server within your own code.
@@ -653,8 +653,8 @@ variable set. Please refer to the examples documentation for further instructions.
When running the Java EE examples you may see warning messages in the WildFly log about incompatible client and - server versions. This is normal if a newer version of the HornetQ project is being used with a version of WildFly that - ships an older version of HornetQ. These examples should still complete without any functional errors. + server versions. This is normal if a newer version of the ActiveMQ project is being used with a version of WildFly that + ships an older version of ActiveMQ. These examples should still complete without any functional errors.
EJB/JMS Transaction @@ -662,16 +662,16 @@
Resource Adapter Configuration - This example demonstrates how to configure several properties on the HornetQ JCA + This example demonstrates how to configure several properties on the ActiveMQ JCA resource adaptor.
Resource Adapter Remote Server Configuration - This example demonstrates how to configure the HornetQ resource adapter to talk to a remote HornetQ server + This example demonstrates how to configure the ActiveMQ resource adapter to talk to a remote ActiveMQ server
JMS Bridge - An example demonstrating the use of the HornetQ JMS bridge. + An example demonstrating the use of the ActiveMQ JMS bridge.
MDB (Message Driven Bean) @@ -679,16 +679,16 @@
Servlet Transport - An example of how to use the HornetQ servlet transport. + An example of how to use the ActiveMQ servlet transport.
Servlet SSL Transport - An example of how to use the HornetQ servlet transport over SSL. + An example of how to use the ActiveMQ servlet transport over SSL.
XA Recovery An example of how XA recovery works within the JBoss Application server using - HornetQ. + ActiveMQ.
diff --git a/docs/user-manual/en/filter-expressions.xml b/docs/user-manual/en/filter-expressions.xml index 2cf7bd2762..4df6f71f72 100644 --- a/docs/user-manual/en/filter-expressions.xml +++ b/docs/user-manual/en/filter-expressions.xml @@ -19,23 +19,23 @@ + %BOOK_ENTITIES; ]> Filter Expressions - HornetQ provides a powerful filter language based on a subset of the SQL 92 + ActiveMQ provides a powerful filter language based on a subset of the SQL 92 expression syntax. It is the same as the syntax used for JMS selectors, but the predefined identifiers are different. For documentation on JMS selector syntax please the JMS javadoc for javax.jms.Message. - Filter expressions are used in several places in HornetQ + Filter expressions are used in several places in ActiveMQ Predefined Queues. When pre-defining a queue, either in hornetq-configuration.xml or hornetq-jms.xml a filter + >activemq-configuration.xml or activemq-jms.xml a filter expression can be defined for a queue. Only messages that match the filter expression will enter the queue. @@ -52,8 +52,8 @@ several places as described in . - There are some differences between JMS selector expressions and HornetQ core - filter expressions. Whereas JMS selector expressions operate on a JMS message, HornetQ + There are some differences between JMS selector expressions and ActiveMQ core + filter expressions. Whereas JMS selector expressions operate on a JMS message, ActiveMQ core filter expressions operate on a core message. The following identifiers can be used in a core filter expressions to refer to attributes of the core message in an expression: diff --git a/docs/user-manual/en/flow-control.xml b/docs/user-manual/en/flow-control.xml index 0de82760cc..5f107e4b32 100644 --- a/docs/user-manual/en/flow-control.xml +++ b/docs/user-manual/en/flow-control.xml @@ -18,7 +18,7 @@ + %BOOK_ENTITIES; ]> @@ -36,14 +36,14 @@ in time.
Window-Based Flow Control - By default, HornetQ consumers buffer messages from the server in a client side buffer + By default, ActiveMQ consumers buffer messages from the server in a client side buffer before the client consumes them. This improves performance: otherwise every time the - client consumes a message, HornetQ would have to go the server to request the next + client consumes a message, ActiveMQ would have to go the server to request the next message. In turn, this message would then get sent to the client side, if one was available. A network round trip would be involved for every message and considerably reduce performance. - To prevent this, HornetQ pre-fetches messages into a buffer on each consumer. The + To prevent this, ActiveMQ pre-fetches messages into a buffer on each consumer. The total maximum size of messages (in bytes) that will be buffered on each consumer is determined by the consumer-window-size parameter. By default, the consumer-window-size is set to 1 MiB (1024 * 1024 @@ -106,14 +106,14 @@ find the optimal value, but a value of 1MiB is fine in most cases.
Using Core API - If HornetQ Core API is used, the consumer window size is specified by If ActiveMQ Core API is used, the consumer window size is specified by ServerLocator.setConsumerWindowSize() method and some of the ClientSession.createConsumer() methods.
Using JMS if JNDI is used to look up the connection factory, the consumer window size is - configured in hornetq-jms.xml: + configured in activemq-jms.xml: <connection-factory name="ConnectionFactory"> <connectors> @@ -127,10 +127,10 @@ <consumer-window-size>0</consumer-window-size> </connection-factory> If the connection factory is directly instantiated, the consumer window size is - specified by HornetQConnectionFactory.setConsumerWindowSize() + specified by ActiveMQConnectionFactory.setConsumerWindowSize() method. Please see for an example which - shows how to configure HornetQ to prevent consumer buffering when dealing with slow + shows how to configure ActiveMQ to prevent consumer buffering when dealing with slow consumers.
@@ -147,7 +147,7 @@ limiting consumer rate.
Using Core API - If the HornetQ core API is being used the rate can be set via the If the ActiveMQ core API is being used the rate can be set via the ServerLocator.setConsumerMaxRate(int consumerMaxRate) method or alternatively via some of the ClientSession.createConsumer() methods. @@ -155,7 +155,7 @@
Using JMS If JNDI is used to look up the connection factory, the max rate can be configured - in hornetq-jms.xml: + in activemq-jms.xml: <connection-factory name="ConnectionFactory"> <connectors> @@ -169,7 +169,7 @@ <consumer-max-rate>10</consumer-max-rate> </connection-factory> If the connection factory is directly instantiated, the max rate size can be set - via the HornetQConnectionFactory.setConsumerMaxRate(int + via the ActiveMQConnectionFactory.setConsumerMaxRate(int consumerMaxRate) method. Rate limited flow control can be used in conjunction with window based flow @@ -179,18 +179,18 @@ soon fill up with messages. Please see for an example which - shows how to configure HornetQ to prevent consumer buffering when dealing with slow + shows how to configure ActiveMQ to prevent consumer buffering when dealing with slow consumers.
Producer flow control - HornetQ also can limit the amount of data sent from a client to a server to prevent the + ActiveMQ also can limit the amount of data sent from a client to a server to prevent the server being overwhelmed.
Window based flow control - In a similar way to consumer window based flow control, HornetQ producers, by + In a similar way to consumer window based flow control, ActiveMQ producers, by default, can only send messages to an address as long as they have sufficient credits to do so. The amount of credits required to send a message is given by the size of the message. @@ -203,14 +203,14 @@ getting overloaded.
Using Core API - If the HornetQ core API is being used, window size can be set via the If the ActiveMQ core API is being used, window size can be set via the ServerLocator.setProducerWindowSize(int producerWindowSize) method.
Using JMS If JNDI is used to look up the connection factory, the producer window size can be - configured in hornetq-jms.xml: + configured in activemq-jms.xml: <connection-factory name="ConnectionFactory"> <connectors> @@ -222,7 +222,7 @@ <producer-window-size>10</producer-window-size> </connection-factory> If the connection factory is directly instantiated, the producer window size can - be set via the HornetQConnectionFactory.setProducerWindowSize(int + be set via the ActiveMQConnectionFactory.setProducerWindowSize(int producerWindowSize) method.
@@ -275,8 +275,8 @@
Rate limited flow control - HornetQ also allows the rate a producer can emit message to be limited, in units of - messages per second. By specifying such a rate, HornetQ will ensure that producer never + ActiveMQ also allows the rate a producer can emit message to be limited, in units of + messages per second. By specifying such a rate, ActiveMQ will ensure that producer never produces messages at a rate higher than that specified. The rate must be a positive integer to enable this functionality and is the maximum desired message consumption rate specified in units of messages per second. Setting this @@ -286,7 +286,7 @@ of limiting producer rate.
Using Core API - If the HornetQ core API is being used the rate can be set via the If the ActiveMQ core API is being used the rate can be set via the ServerLocator.setProducerMaxRate(int consumerMaxRate) method or alternatively via some of the ClientSession.createProducer() methods. @@ -294,7 +294,7 @@
Using JMS If JNDI is used to look up the connection factory, the max rate can be configured - in hornetq-jms.xml: + in activemq-jms.xml: <connection-factory name="ConnectionFactory"> <connectors> @@ -308,7 +308,7 @@ <producer-max-rate>10</producer-max-rate> </connection-factory> If the connection factory is directly instantiated, the max rate size can be set - via the HornetQConnectionFactory.setProducerMaxRate(int + via the ActiveMQConnectionFactory.setProducerMaxRate(int consumerMaxRate) method.
diff --git a/docs/user-manual/en/ha.xml b/docs/user-manual/en/ha.xml index b1f35574cc..7e9eb72fa5 100644 --- a/docs/user-manual/en/ha.xml +++ b/docs/user-manual/en/ha.xml @@ -18,7 +18,7 @@ + %BOOK_ENTITIES; ]> @@ -33,13 +33,13 @@
Live - Backup Groups - HornetQ allows servers to be linked together as live - backup + ActiveMQ allows servers to be linked together as live - backup groups where each live server can have 1 or more backup servers. A backup server is owned by only one live server. Backup servers are not operational until failover occurs, however 1 chosen backup, which will be in passive mode, announces its status and waits to take over the live servers work - Before failover, only the live server is serving the HornetQ clients while the backup + Before failover, only the live server is serving the ActiveMQ clients while the backup servers remain passive or awaiting to become a backup server. When a live server crashes or is brought down in the correct mode, the backup server currently in passive mode will become live and another backup server will become passive. If a live server restarts after a @@ -49,7 +49,7 @@
HA Policies - HornetQ supports two different strategies for backing up a server shared + ActiveMQ supports two different strategies for backing up a server shared store and replication. Which is configured via the ha-policy configuration element. @@ -73,7 +73,7 @@ The ha-policy configurations replaces any current HA configuration in the root of the - hornetq-configuration.xml configuration. All old configuration is now deprecated altho + activemq-configuration.xml configuration. All old configuration is now deprecated altho best efforts will be made to honour it if configured this way. @@ -162,7 +162,7 @@ specifying a node group. You can specify a group of live servers that a backup server can connect to. This is done by configuring group-name in either the master or the slave element of the - hornetq-configuration.xml. A Backup server will only connect to a live server that + activemq-configuration.xml. A Backup server will only connect to a live server that shares the same node group name @@ -226,7 +226,7 @@ Configuration To configure the live and backup servers to be a replicating pair, configure - the live server in ' hornetq-configuration.xml to have: + the live server in ' activemq-configuration.xml to have: <ha-policy> @@ -362,7 +362,7 @@
Configuration To configure the live and backup servers to share their store, configure - id via the ha-policy configuration in hornetq-configuration.xml: + id via the ha-policy configuration in activemq-configuration.xml: <ha-policy> <shared-store> @@ -427,7 +427,7 @@ request the other server (which it assumes it is a back that has assumed its duties) to shutdown for it to take over. This is necessary because otherwise the live server has no means to know whether there was a fail-over or not, and if there was if the server that took its duties is still running or not. - To configure this option at your hornetq-configuration.xml configuration file as follows: + To configure this option at your activemq-configuration.xml configuration file as follows: <ha-policy> <replication> @@ -459,7 +459,7 @@ API as explained at You can also force the running live server to shutdown when the old live server comes back up allowing the original live server to take over automatically by setting the following property in the - hornetq-configuration.xml configuration file as follows: + activemq-configuration.xml configuration file as follows: <ha-policy> <shared-store> @@ -550,7 +550,7 @@ and its Connectors and Acceptors which are discussed later on in this chapter. A live server can also be configured to allow requests from backups and also how many backups a live server can start. this way you can evenly distribute backups around the cluster. This is configured via the ha-policy - element in the hornetq-configuration.xml file like so: + element in the activemq-configuration.xml file like so: <ha-policy> <replication> @@ -741,7 +741,7 @@
Failover Modes - HornetQ defines two types of client failover: + ActiveMQ defines two types of client failover: Automatic client failover @@ -750,7 +750,7 @@ Application-level client failover - HornetQ also provides 100% transparent automatic reattachment of connections to the + ActiveMQ also provides 100% transparent automatic reattachment of connections to the same server (e.g. in case of transient network problems). This is similar to failover, except it is reconnecting to the same server and is discussed in @@ -759,20 +759,20 @@ since the backup node will not have any knowledge of non persistent queues.
Automatic Client Failover - HornetQ clients can be configured to receive knowledge of all live and backup servers, so + ActiveMQ clients can be configured to receive knowledge of all live and backup servers, so that in event of connection failure at the client - live server connection, the client will detect this and reconnect to the backup server. The backup server will then automatically recreate any sessions and consumers that existed on each connection before failover, thus saving the user from having to hand-code manual reconnection logic. - HornetQ clients detect connection failure when it has not received packets from + ActiveMQ clients detect connection failure when it has not received packets from the server within the time given by client-failure-check-period as explained in section . If the client does not receive data in good time, it will assume the connection has failed and attempt failover. Also if the socket is closed by the OS, usually if the server process is killed rather than the machine itself crashing, then the client will failover straight away. - HornetQ clients can be configured to discover the list of live-backup server groups in a + ActiveMQ clients can be configured to discover the list of live-backup server groups in a number of different ways. They can be configured explicitly or probably the most common way of doing this is to use server discovery for the client to automatically discover the list. For full details on how to configure @@ -794,7 +794,7 @@ connection is made there is a window where it does not know about the backup. If a failure happens at this point the client can only try reconnecting to the original live server. To configure how many attempts the client will make you can set the property initialConnectAttempts - on the ClientSessionFactoryImpl or HornetQConnectionFactory or + on the ClientSessionFactoryImpl or ActiveMQConnectionFactory or initial-connect-attempts in xml. The default for this is 0, that is try only once. Once the number of attempts has been made an exception will be thrown. @@ -804,7 +804,7 @@ linkend="examples.non-transaction-failover"/>.
A Note on Server Replication - HornetQ does not replicate full server state between live and backup servers. + ActiveMQ does not replicate full server state between live and backup servers. When the new session is automatically recreated on the backup it won't have any knowledge of messages already sent or acknowledged in that session. Any in-flight sends or acknowledgements at the time of failover might also be @@ -838,14 +838,14 @@ to continue its execution, when failover occurs, the new session will not have any knowledge of the call that was in progress. This call might otherwise hang for ever, waiting for a response that will never come. - To prevent this, HornetQ will unblock any blocking calls that were in progress + To prevent this, ActiveMQ will unblock any blocking calls that were in progress at the time of failover by making them throw a javax.jms.JMSException (if using JMS), or a ActiveMQException with error code ActiveMQException.UNBLOCKED. It is up to the client code to catch this exception and retry any operations if desired. If the method being unblocked is a call to commit(), or prepare(), then the - transaction will be automatically rolled back and HornetQ will throw a javax.jms.TransactionRolledBackException (if using JMS), or a ActiveMQException with error code ActiveMQException.TRANSACTION_ROLLED_BACK if using the core @@ -879,7 +879,7 @@ rollback code as necessary. There is no need to manually rollback the session - it is already rolled back. The user can then just retry the transactional operations again on the same session. - HornetQ ships with a fully functioning example demonstrating how to do this, + ActiveMQ ships with a fully functioning example demonstrating how to do this, please see If failover occurs when a commit call is being executed, the server, as previously described, will unblock the call to prevent a hang, since no response @@ -925,10 +925,10 @@ connection failure: java.jms.ExceptionListener. Please consult the JMS javadoc or any good JMS tutorial for more information on how to use this. - The HornetQ core API also provides a similar feature in the form of the class - org.hornet.core.client.SessionFailureListener + The ActiveMQ core API also provides a similar feature in the form of the class + org.apache.activemq.core.client.SessionFailureListener Any ExceptionListener or SessionFailureListener instance will always be called by - HornetQ on event of connection failure, irrespective of whether the connection was successfully failed over, reconnected or reattached, however you can find out if reconnect or reattach has happened by either the failedOver flag passed in on the connectionFailed @@ -970,7 +970,7 @@ failover, since the failover is handled at the user application level. To implement application-level failover, if you're using JMS then you need to set an ExceptionListener class on the JMS connection. The - ExceptionListener will be called by HornetQ in the event that + ExceptionListener will be called by ActiveMQ in the event that connection failure is detected. In your ExceptionListener, you would close your old JMS connections, potentially look up new connection factory instances from JNDI and creating new connections. In this case you may well be using diff --git a/docs/user-manual/en/images/hornetQ-banner_final.png b/docs/user-manual/en/images/hornetQ-banner_final.png deleted file mode 100644 index 6388dff1f54ed19ddff7a755fd3957c839198734..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109633 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 sOaJ$)B#;; + %BOOK_ENTITIES; ]> Intercepting Operations - HornetQ supports interceptors to intercept packets entering + ActiveMQ supports interceptors to intercept packets entering and exiting the server. Incoming and outgoing interceptors are be called for any packet entering or exiting the server respectively. This allows custom code to be executed, e.g. for auditing packets, filtering or other reasons. Interceptors can change the @@ -55,7 +55,7 @@ public interface Interceptor
Configuring The Interceptors Both incoming and outgoing interceptors are configured in - hornetq-configuration.xml: + activemq-configuration.xml: <remoting-incoming-interceptors> <class-name>org.apache.activemq.jms.example.LoginInterceptor</class-name> diff --git a/docs/user-manual/en/interoperability.xml b/docs/user-manual/en/interoperability.xml index 86dadc1b72..96a4ed84fa 100644 --- a/docs/user-manual/en/interoperability.xml +++ b/docs/user-manual/en/interoperability.xml @@ -18,7 +18,7 @@ + %BOOK_ENTITIES; ]> @@ -26,12 +26,12 @@
Stomp Stomp is a text-orientated wire protocol that allows - Stomp clients to communicate with Stomp Brokers. HornetQ now supports Stomp 1.0, 1.1 and 1.2. + Stomp clients to communicate with Stomp Brokers. ActiveMQ now supports Stomp 1.0, 1.1 and 1.2. Stomp clients are available for several languages and platforms making it a good choice for interoperability.
Native Stomp support - HornetQ provides native support for Stomp. To be able to send and receive Stomp messages, + ActiveMQ provides native support for Stomp. To be able to send and receive Stomp messages, you must configure a NettyAcceptor with a protocols parameter set to have stomp: @@ -40,9 +40,9 @@ <param key="protocols" value="STOMP"/> <param key="port" value="61613"/> </acceptor> - With this configuration, HornetQ will accept Stomp connections on + With this configuration, ActiveMQ will accept Stomp connections on the port 61613 (which is the default port of the Stomp brokers). - See the stomp example which shows how to configure a HornetQ server with Stomp. + See the stomp example which shows how to configure a ActiveMQ server with Stomp.
Limitations Message acknowledgements are not transactional. The ACK frame can not be part of a transaction @@ -52,12 +52,12 @@ Stomp 1.1/1.2 Notes
Virtual Hosting - HornetQ currently doesn't support virtual hosting, which means the 'host' header + ActiveMQ currently doesn't support virtual hosting, which means the 'host' header in CONNECT fram will be ignored.
Heart-beating - HornetQ specifies a minimum value for both client and server heart-beat intervals. + ActiveMQ specifies a minimum value for both client and server heart-beat intervals. The minimum interval for both client and server heartbeats is 500 milliseconds. That means if a client sends a CONNECT frame with heartbeat values lower than 500, the server will defaults the value to 500 milliseconds regardless the values of the 'heart-beat' header in the frame. @@ -66,15 +66,15 @@
- Mapping Stomp destinations to HornetQ addresses and queues + Mapping Stomp destinations to ActiveMQ addresses and queues Stomp clients deals with destinations when sending messages and subscribing. Destination names are simply strings which are mapped to some form of destination on the server - how the server translates these is left to the server implementation. - In HornetQ, these destinations are mapped to addresses and queues. + In ActiveMQ, these destinations are mapped to addresses and queues. When a Stomp client sends a message (using a SEND frame), the specified destination is mapped to an address. When a Stomp client subscribes (or unsubscribes) for a destination (using a SUBSCRIBE - or UNSUBSCRIBE frame), the destination is mapped to a HornetQ queue. + or UNSUBSCRIBE frame), the destination is mapped to a ActiveMQ queue.
STOMP and connection-ttl @@ -108,7 +108,7 @@ Stomp and JMS interoperability
Using JMS destinations - As explained in , JMS destinations are also mapped to HornetQ addresses and queues. + As explained in , JMS destinations are also mapped to ActiveMQ addresses and queues. If you want to use Stomp to send messages to JMS destinations, the Stomp destinations must follow the same convention: @@ -134,8 +134,8 @@ destination:jms.topic.stocks
- Sending and consuming Stomp message from JMS or HornetQ Core API - Stomp is mainly a text-orientated protocol. To make it simpler to interoperate with JMS and HornetQ Core API, + Sending and consuming Stomp message from JMS or ActiveMQ Core API + Stomp is mainly a text-orientated protocol. To make it simpler to interoperate with JMS and ActiveMQ Core API, our Stomp implementation checks for presence of the content-length header to decide how to map a Stomp message to a JMS Message or a Core message. @@ -151,7 +151,7 @@ destination:jms.topic.stocks Message IDs for Stomp messages When receiving Stomp messages via a JMS consumer or a QueueBrowser, the messages have no properties like JMSMessageID by default. However this may bring some inconvenience to - clients who wants an ID for their purpose. HornetQ Stomp provides a parameter to enable + clients who wants an ID for their purpose. ActiveMQ Stomp provides a parameter to enable message ID on each incoming Stomp message. If you want each Stomp message to have a unique ID, just set the stomp-enable-message-id to true. For example: @@ -172,9 +172,9 @@ hq-message-id : STOMP12345
Handling of Large Messages with Stomp - Stomp clients may send very large bodys of frames which can exceed the size of HornetQ + Stomp clients may send very large bodys of frames which can exceed the size of ActiveMQ server's internal buffer, causing unexpected errors. To prevent this situation from happening, - HornetQ provides a stomp configuration attribute stomp-min-large-message-size. + ActiveMQ provides a stomp configuration attribute stomp-min-large-message-size. This attribute can be configured inside a stomp acceptor, as a parameter. For example: <acceptor name="stomp-acceptor"> @@ -183,7 +183,7 @@ hq-message-id : STOMP12345 <param key="port" value="61613"/> <param key="stomp-min-large-message-size" value="10240"/> </acceptor> - The type of this attribute is integer. When this attributed is configured, HornetQ server + The type of this attribute is integer. When this attributed is configured, ActiveMQ server will check the size of the body of each Stomp frame arrived from connections established with this acceptor. If the size of the body is equal or greater than the value of stomp-min-large-message, the message will be persisted as a large message. @@ -197,8 +197,8 @@ hq-message-id : STOMP12345
Stomp Over Web Sockets - HornetQ also support Stomp over Web Sockets. Modern web browser which support Web Sockets can send and receive - Stomp messages from HornetQ. + ActiveMQ also support Stomp over Web Sockets. Modern web browser which support Web Sockets can send and receive + Stomp messages from ActiveMQ. To enable Stomp over Web Sockets, you must configure a NettyAcceptor with a protocol parameter set to stomp_ws: @@ -207,14 +207,14 @@ hq-message-id : STOMP12345 <param key="protocols" value="STOMP_WS"/> <param key="port" value="61614"/> </acceptor> - With this configuration, HornetQ will accept Stomp connections over Web Sockets on + With this configuration, ActiveMQ will accept Stomp connections over Web Sockets on the port 61614 with the URL path /stomp. Web browser can then connect to ws://<server>:61614/stomp using a Web Socket to send and receive Stomp messages. A companion JavaScript library to ease client-side development is available from GitHub (please see its documentation for a complete description). - The stomp-websockets example shows how to configure HornetQ server to have web browsers and Java + The stomp-websockets example shows how to configure ActiveMQ server to have web browsers and Java applications exchanges messages on a JMS topic.
@@ -222,10 +222,10 @@ hq-message-id : STOMP12345 StompConnect StompConnect is a server that can act as a Stomp broker and proxy the Stomp protocol to the standard JMS API. - Consequently, using StompConnect it is possible to turn HornetQ into a Stomp Broker and + Consequently, using StompConnect it is possible to turn ActiveMQ into a Stomp Broker and use any of the available stomp clients. These include clients written in C, C++, c# and .net etc. - To run StompConnect first start the HornetQ server and make sure that it is using + To run StompConnect first start the ActiveMQ server and make sure that it is using JNDI. Stomp requires the file jndi.properties to be available on the classpath. This should look something like: @@ -234,7 +234,7 @@ java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory java.naming.provider.url=jnp://localhost:1099 java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces Make sure this file is in the classpath along with the StompConnect jar and the - HornetQ jars and simply run java org.codehaus.stomp.jms.Main. + ActiveMQ jars and simply run java org.codehaus.stomp.jms.Main.
@@ -244,7 +244,7 @@ java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
AMQP - HornetQ supports the AMQP 1.0 + ActiveMQ supports the AMQP 1.0 specification. To enable AMQP you must configure a Netty Acceptor to receive AMQP clients, like so: <acceptor name="stomp-acceptor"> @@ -253,20 +253,20 @@ java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces </acceptor> - HornetQ will then accept AMQP 1.0 clients on port 5672 which is the default AMQP port. + ActiveMQ will then accept AMQP 1.0 clients on port 5672 which is the default AMQP port. There are 2 Stomp examples available see proton-j and proton-ruby which use the qpid Java and Ruby clients respectively
AMQP and security - The HornetQ Server accepts AMQP SASL Authentication and will use this to map onto the underlying session created - for the connection so you can use the normal HornetQ security configuration. + The ActiveMQ Server accepts AMQP SASL Authentication and will use this to map onto the underlying session created + for the connection so you can use the normal ActiveMQ security configuration.
AMQP Links An AMQP Link is a uni directional transport for messages between a source and a target, i.e. a client and the - HornetQ Broker. A link will have an endpoint of which there are 2 kinds, a Sender and A Receiver. At the Broker a - Sender will have its messages converted into a HornetQ Message and forwarded to its destination or target. A - Receiver will map onto a HornetQ Server Consumer and convert HornetQ messages back into AMQP messages before being delivered. + ActiveMQ Broker. A link will have an endpoint of which there are 2 kinds, a Sender and A Receiver. At the Broker a + Sender will have its messages converted into a ActiveMQ Message and forwarded to its destination or target. A + Receiver will map onto a ActiveMQ Server Consumer and convert ActiveMQ messages back into AMQP messages before being delivered.
AMQP and destinations @@ -282,13 +282,13 @@ java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces AMQP allows the use of multiple transactions per session, amqp:multi-txns-per-ssn, - however in this version HornetQ will only support single transactions per session + however in this version ActiveMQ will only support single transactions per session
OpenWire - HornetQ now supports the OpenWire - protocol so that an ActiveMQ JMS client can talk directly to a HornetQ server. To enable OpenWire support + ActiveMQ now supports the OpenWire + protocol so that an ActiveMQ JMS client can talk directly to a ActiveMQ server. To enable OpenWire support you must configure a Netty Acceptor, like so: <acceptor name="openwire-acceptor"> @@ -297,11 +297,11 @@ java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces </acceptor> - The HornetQ server will then listens on port 61616 for incoming openwire commands. Please note the "protocols" is not mandatory here. - The openwire configuration conforms to HornetQ's "Single Port" feature. Please refer to + The ActiveMQ server will then listens on port 61616 for incoming openwire commands. Please note the "protocols" is not mandatory here. + The openwire configuration conforms to ActiveMQ's "Single Port" feature. Please refer to Configuring Single Port for details. Please refer to the openwire example for more coding details. Currently we support ActiveMQ clients that using standard JMS APIs. In the future we will get more supports - for some advanced, ActiveMQ specific features into HornetQ. + for some advanced, ActiveMQ specific features into ActiveMQ.
diff --git a/docs/user-manual/en/jms-bridge.xml b/docs/user-manual/en/jms-bridge.xml index 13d5fb3ebc..208db8b38a 100644 --- a/docs/user-manual/en/jms-bridge.xml +++ b/docs/user-manual/en/jms-bridge.xml @@ -18,24 +18,24 @@ + %BOOK_ENTITIES; ]> The JMS Bridge - HornetQ includes a fully functional JMS message bridge. + ActiveMQ includes a fully functional JMS message bridge. The function of the bridge is to consume messages from a source queue or topic, and send them to a target queue or topic, typically on a different server. The source and target servers do not have to be in the same cluster which makes bridging suitable for reliably sending messages from one cluster to another, for instance across a WAN, and where the connection may be unreliable. - A bridge can be deployed as a standalone application, with HornetQ standalone server or inside a JBoss AS + A bridge can be deployed as a standalone application, with ActiveMQ standalone server or inside a JBoss AS instance. The source and the target can be located in the same virtual machine or another one. - The bridge can also be used to bridge messages from other non HornetQ JMS servers, as + The bridge can also be used to bridge messages from other non ActiveMQ JMS servers, as long as they are JMS 1.1 compliant.Do not confuse a JMS bridge with a core bridge. A JMS bridge can be used to bridge any two JMS 1.1 compliant JMS providers and uses the JMS API. A core bridge (described in ) is used to bridge any two HornetQ instances and + linkend="core-bridges"/>) is used to bridge any two ActiveMQ instances and uses the core API. Always use a core bridge if you can in preference to a JMS bridge. The core bridge will typically provide better performance than a JMS bridge. Also the core bridge can provide once and only once @@ -56,8 +56,8 @@ <?xml version="1.0" encoding="UTF-8"?> <deployment xmlns="urn:jboss:bean-deployer:2.0"> <bean name="JMSBridge" class="org.apache.activemq.api.jms.bridge.impl.JMSBridgeImpl"> - <!-- HornetQ must be started before the bridge --> - <depends>HornetQServer</depends> + <!-- ActiveMQ must be started before the bridge --> + <depends>ActiveMQServer</depends> <constructor> <!-- Source ConnectionFactory Factory --> <parameter> @@ -320,7 +320,7 @@ Add MessageID In Header If true, then the original message's message ID will be appended in the message sent to the destination in the header HORNETQ_BRIDGE_MSG_ID_LIST. If the message is bridged more + >ACTIVEMQ_BRIDGE_MSG_ID_LIST. If the message is bridged more than once, each message ID will be appended. This enables a distributed request-response pattern to be used @@ -341,10 +341,10 @@ The "transactionManager" property points to a JTA transaction manager implementation. - HornetQ doesn't ship with such an implementation, but one is available in the JBoss - Community. If you are running HornetQ in standalone mode and wish to use a JMS bridge + ActiveMQ doesn't ship with such an implementation, but one is available in the JBoss + Community. If you are running ActiveMQ in standalone mode and wish to use a JMS bridge simply download the latest version of JBossTS from http://www.jboss.org/jbosstm/downloads - and add it to HornetQ's classpath. If you are running HornetQ with JBoss AS then you + and add it to ActiveMQ's classpath. If you are running ActiveMQ with JBoss AS then you won't need to do this as JBoss AS ships with a JTA transaction manager already. The bean definition for the transaction manager would look something like this: @@ -356,7 +356,7 @@ connection factory used to create the connection for the source or target server. The configuration example above uses the default implementation provided by - HornetQ that looks up the connection factory using JNDI. For other Application + ActiveMQ that looks up the connection factory using JNDI. For other Application Servers or JMS providers a new implementation may have to be provided. This can easily be done by implementing the interface org.apache.activemq.jms.bridge.ConnectionFactoryFactory. @@ -364,7 +364,7 @@
Source and Target Destination Factories Again, similarly, these are used to create or lookup up the destinations. - In the configuration example above, we have used the default provided by HornetQ + In the configuration example above, we have used the default provided by ActiveMQ that looks up the destination using JNDI. A new implementation can be provided by implementing org.apache.activemq.jms.bridge.DestinationFactory interface. @@ -396,7 +396,7 @@ ONCE_AND_ONLY_ONCE This QoS mode ensures messages will reach the destination from the source once and only once. (Sometimes this mode is known as "exactly once"). If both the - source and the destination are on the same HornetQ server instance then this can + source and the destination are on the same ActiveMQ server instance then this can be achieved by sending and acknowledging the messages in the same local transaction. If the source and destination are on different servers this is achieved by enlisting the sending and consuming sessions in a JTA transaction. @@ -444,7 +444,7 @@ and use a JMS Bridge with JBoss AS to send messages to the source destination and consume them from the target destination. Please see which shows how to configure - and use a JMS Bridge between two standalone HornetQ servers. + and use a JMS Bridge between two standalone ActiveMQ servers.
diff --git a/docs/user-manual/en/jms-core-mapping.xml b/docs/user-manual/en/jms-core-mapping.xml index bc80b552af..9987440bcf 100644 --- a/docs/user-manual/en/jms-core-mapping.xml +++ b/docs/user-manual/en/jms-core-mapping.xml @@ -18,13 +18,13 @@ + %BOOK_ENTITIES; ]> Mapping JMS Concepts to the Core API - This chapter describes how JMS destinations are mapped to HornetQ addresses. - HornetQ core is JMS-agnostic. It does not have any concept of a JMS topic. A JMS topic is + This chapter describes how JMS destinations are mapped to ActiveMQ addresses. + ActiveMQ core is JMS-agnostic. It does not have any concept of a JMS topic. A JMS topic is implemented in core as an address (the topic name) with zero or more queues bound to it. Each queue bound to that address represents a topic subscription. Likewise, a JMS queue is implemented as an address (the JMS queue name) with one single queue bound to it which diff --git a/docs/user-manual/en/large-messages.xml b/docs/user-manual/en/large-messages.xml index 8c11c844d9..d98818111a 100644 --- a/docs/user-manual/en/large-messages.xml +++ b/docs/user-manual/en/large-messages.xml @@ -17,18 +17,18 @@ + %BOOK_ENTITIES; ]> Large Messages - HornetQ supports sending and receiving of huge messages, even when the client and server + ActiveMQ supports sending and receiving of huge messages, even when the client and server are running with limited memory. The only realistic limit to the size of a message that can be sent or consumed is the amount of disk space you have available. We have tested sending and consuming messages up to 8 GiB in size with a client and server running in just 50MiB of RAM! To send a large message, the user can set an InputStream on a message - body, and when that message is sent, HornetQ will read the InputStream. A + body, and when that message is sent, ActiveMQ will read the InputStream. A FileInputStream could be used for example to send a huge message from a huge file on disk. As the InputStream is read the data is sent to the server as a stream @@ -47,7 +47,7 @@ <configuration xmlns="urn:activemq" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="urn:hornetq /schema/activemq-configuration.xsd"> + xsi:schemaLocation="urn:activemq /schema/activemq-configuration.xsd"> ... <large-messages-directory>/data/large-messages</large-messages-directory> ... @@ -62,8 +62,8 @@ will be split up and sent in fragments. This is determined by the parameter min-large-message-size - HornetQ messages are encoded using 2 bytes per character so if the message data is filled - with ASCII characters (which are 1 byte) the size of the resulting HornetQ message would roughly + ActiveMQ messages are encoded using 2 bytes per character so if the message data is filled + with ASCII characters (which are 1 byte) the size of the resulting ActiveMQ message would roughly double. This is important when calculating the size of a "large" message as it may appear to be less than the min-large-message-size before it is sent, but it then turns into a "large" message once it is encoded. @@ -71,21 +71,21 @@ The default value is 100KiB.
Using Core API - If the HornetQ Core API is used, the minimal large message size is specified by + If the ActiveMQ Core API is used, the minimal large message size is specified by ServerLocator.setMinLargeMessageSize. -ServerLocator locator = HornetQClient.createServerLocatorWithoutHA(new TransportConfiguration(NettyConnectorFactory.class.getName())) +ServerLocator locator = ActiveMQClient.createServerLocatorWithoutHA(new TransportConfiguration(NettyConnectorFactory.class.getName())) locator.setMinLargeMessageSize(25 * 1024); -ClientSessionFactory factory = HornetQClient.createClientSessionFactory(); +ClientSessionFactory factory = ActiveMQClient.createClientSessionFactory(); will provide more information on how to instantiate the session factory.
Using JMS If JNDI is used to look up the connection factory, the minimum large message size - is specified in hornetq-jms.xml + is specified in activemq-jms.xml ... <connection-factory name="ConnectionFactory"> <connectors> @@ -101,7 +101,7 @@ ClientSessionFactory factory = HornetQClient.createClientSessionFactory(); If the connection factory is being instantiated directly, the minimum large message size is specified by HornetQConnectionFactory.setMinLargeMessageSize. + >ActiveMQConnectionFactory.setMinLargeMessageSize.
Compressed Large Messages @@ -138,7 +138,7 @@ ClientSessionFactory factory = HornetQClient.createClientSessionFactory();
Streaming large messages - HornetQ supports setting the body of messages using input and output streams (ActiveMQ supports setting the body of messages using input and output streams (java.lang.io) These streams are then used directly for sending (input streams) and receiving (output streams) messages. @@ -221,7 +221,7 @@ msg.setInputStream(dataInputStream);
Streaming over JMS - When using JMS, HornetQ maps the streaming methods on the core API (see When using JMS, ActiveMQ maps the streaming methods on the core API (see ) by setting object properties . You can use the method Message.setObjectProperty to set the input and output streams. @@ -264,7 +264,7 @@ messageReceived.setObjectProperty("JMS_HQ_OutputStream", bufferedOutput); Streaming Alternative If you choose not to use the InputStream or OutputStream capability of HornetQ You could still access the data + >OutputStream capability of ActiveMQ You could still access the data directly in an alternative fashion. On the Core API just get the bytes of the body as you normally would. diff --git a/docs/user-manual/en/last-value-queues.xml b/docs/user-manual/en/last-value-queues.xml index def6115716..f38f760065 100644 --- a/docs/user-manual/en/last-value-queues.xml +++ b/docs/user-manual/en/last-value-queues.xml @@ -18,7 +18,7 @@ + %BOOK_ENTITIES; ]> diff --git a/docs/user-manual/en/libaio.xml b/docs/user-manual/en/libaio.xml index d0e2c760a4..9a287e307b 100644 --- a/docs/user-manual/en/libaio.xml +++ b/docs/user-manual/en/libaio.xml @@ -18,12 +18,12 @@ + %BOOK_ENTITIES; ]> Libaio Native Libraries - HornetQ distributes a native library, used as a bridge between HornetQ and Linux + ActiveMQ distributes a native library, used as a bridge between ActiveMQ and Linux libaio. libaio is a library, developed as part of the Linux kernel project. With libaio we submit writes to the operating system where they are @@ -31,16 +31,16 @@ processed. We use this in our high performance journal if configured to do so, please see . - These are the native libraries distributed by HornetQ: + These are the native libraries distributed by ActiveMQ: - libHornetQAIO32.so - x86 32 bits + libActiveMQAIO32.so - x86 32 bits - libHornetQAIO64.so - x86 64 bits + libActiveMQAIO64.so - x86 64 bits - When using libaio, HornetQ will always try loading these files as long as they are on the + When using libaio, ActiveMQ will always try loading these files as long as they are on the library path.
Compiling the native libraries @@ -120,10 +120,10 @@ config.status: executing libtool commands ... The produced library will be at ./native-src/src/.libs/libHornetQAIO.so. Simply move that file over + >./native-src/src/.libs/libActiveMQAIO.so. Simply move that file over bin on the distribution or the place you have chosen on the library path. - If you want to perform changes on the HornetQ libaio code, you could just call + If you want to perform changes on the ActiveMQ libaio code, you could just call make directly at the native-src directory.
diff --git a/docs/user-manual/en/logging.xml b/docs/user-manual/en/logging.xml index c65f3e8c7b..33dc4f9d31 100644 --- a/docs/user-manual/en/logging.xml +++ b/docs/user-manual/en/logging.xml @@ -18,12 +18,12 @@ + %BOOK_ENTITIES; ]> Logging - HornetQ uses the JBoss Logging framework to do its logging and is configurable via the logging.properties + ActiveMQ uses the JBoss Logging framework to do its logging and is configurable via the logging.properties file found in the configuration directories. This is configured by Default to log to both the console and to a file. There are 6 loggers available which are as follows:
@@ -40,7 +40,7 @@ org.jboss.logging - Logs any calls not handled by the HornetQ loggers + Logs any calls not handled by the ActiveMQ loggers org.apache.activemq.core.server @@ -92,7 +92,7 @@ </dependency> <dependency> <groupId>org.apache.activemq</groupId> - <artifactId>hornetq-core-client</artifactId> + <artifactId>activemq-core-client</artifactId> <version>2.3.0.Final</version> </dependency> The first dependency jnp-client is not actually needed for logging, however this is needed for @@ -116,7 +116,7 @@ loggers=org.jboss.logging,org.apache.activemq.core.server,org.apache.activemq.ut # Root logger level logger.level=INFO -# HornetQ logger levels +# ActiveMQ logger levels logger.org.apache.activemq.core.server.level=INFO logger.org.apache.activemq.utils.level=INFO logger.org.apache.activemq.jms.level=DEBUG @@ -136,7 +136,7 @@ handler.FILE=org.jboss.logmanager.handlers.FileHandler handler.FILE.level=FINE handler.FILE.properties=autoFlush,fileName handler.FILE.autoFlush=true -handler.FILE.fileName=hornetq.log +handler.FILE.fileName=activemq.log handler.FILE.formatter=PATTERN # Formatter pattern configuration @@ -147,7 +147,7 @@ formatter.PATTERN.pattern=%d{HH:mm:ss,SSS} %-5p [%c] %s%E%n
Logging With The JBoss Application Server - When HornetQ is deployed within the JBoss Application Server version 7.x or above then + When ActiveMQ is deployed within the JBoss Application Server version 7.x or above then it will still use JBoss Logging, refer to the AS7 documentation on how to configure AS7 logging.
diff --git a/docs/user-manual/en/management.xml b/docs/user-manual/en/management.xml index b9576a05dd..0f987c58c4 100644 --- a/docs/user-manual/en/management.xml +++ b/docs/user-manual/en/management.xml @@ -18,31 +18,31 @@ + %BOOK_ENTITIES; ]> Management - HornetQ has an extensive management API that allows a user to modify a server + ActiveMQ has an extensive management API that allows a user to modify a server configuration, create new resources (e.g. JMS queues and topics), inspect these resources (e.g. how many messages are currently held in a queue) and interact with it (e.g. to remove messages from a queue). All the operations allows a client to manage - HornetQ. It also allows clients to subscribe to management notifications. - There are 3 ways to manage HornetQ: + ActiveMQ. It also allows clients to subscribe to management notifications. + There are 3 ways to manage ActiveMQ: Using JMX -- JMX is the standard way to manage Java applications - Using the core API -- management operations are sent to HornetQ server using + Using the core API -- management operations are sent to ActiveMQ server using core messages - Using the JMS API -- management operations are sent to HornetQ server using + Using the JMS API -- management operations are sent to ActiveMQ server using JMS messages - Although there are 3 different ways to manage HornetQ each API supports the same + Although there are 3 different ways to manage ActiveMQ each API supports the same functionality. If it is possible to manage a resource using JMX it is also possible to achieve the same result using Core messages or JMS messages. This choice depends on your requirements, your application settings and your environment to @@ -53,7 +53,7 @@ management API is the same. For each managed resource, there exists a Java interface describing what can be invoked for this type of resource. - HornetQ exposes its managed resources in 2 packages: + ActiveMQ exposes its managed resources in 2 packages: Core resources are located in the
Core Management API - HornetQ defines a core management API to manage core resources. For full details of + ActiveMQ defines a core management API to manage core resources. For full details of the API please consult the javadoc. In summary:
Core Server Management @@ -86,7 +86,7 @@ Core queues can be created or destroyed using the management operations createQueue() or deployQueue() or destroyQueue())on the HornetQServerControl (with the ObjectName ActiveMQServerControl (with the ObjectName org.apache.activemq:module=Core,type=Server or the resource name core.server) createQueue will fail if the queue already exists while @@ -132,7 +132,7 @@ Retrieving the server configuration and attributes - The HornetQServerControl exposes HornetQ server + The ActiveMQServerControl exposes ActiveMQ server configuration through all its attributes (e.g. getVersion() method to retrieve the server's version, etc.) @@ -143,14 +143,14 @@ Core bridges (resp. diverts) can be created or destroyed using the management operations createBridge() and destroyBridge() (resp. createDivert() and destroyDivert()) on the HornetQServerControl (with the ObjectName ActiveMQServerControl (with the ObjectName org.apache.activemq:module=Core,type=Server or the resource name core.server). It is possible to stop the server and force failover to occur with any currently attached clients. to do this use the forceFailover() on the HornetQServerControl (with the ObjectName ActiveMQServerControl (with the ObjectName org.apache.activemq:module=Core,type=Server or the resource name core.server) @@ -258,7 +258,7 @@
Other Core Resources Management - HornetQ allows to start and stop its remote resources (acceptors, diverts, + ActiveMQ allows to start and stop its remote resources (acceptors, diverts, bridges, etc.) so that a server can be taken off line for a given period of time without stopping it completely (e.g. if other management operations must be performed such as resolving heuristic transactions). These resources are: @@ -335,7 +335,7 @@
JMS Management API - HornetQ defines a JMS Management API to manage JMS administrated + ActiveMQ defines a JMS Management API to manage JMS administrated objects (i.e. JMS queues, topics and connection factories).
JMS Server Management @@ -520,10 +520,10 @@
Using Management Via JMX - HornetQ can be managed using ActiveMQ can be managed using JMX. - The management API is exposed by HornetQ using MBeans interfaces. HornetQ registers its + The management API is exposed by ActiveMQ using MBeans interfaces. ActiveMQ registers its resources with the domain org.apache.activemq. For example, the ObjectName to manage a JMS Queue exampleQueue is: @@ -536,17 +536,17 @@ org.apache.activemq.api.jms.management.JMSQueueControl >org.apache.activemq.api.core.management.ObjectNameBuilder. You can also use jconsole to find the ObjectName of the MBeans you want to manage. - Managing HornetQ using JMX is identical to management of any Java Applications using + Managing ActiveMQ using JMX is identical to management of any Java Applications using JMX. It can be done by reflection or by creating proxies of the MBeans.
Configuring JMX - By default, JMX is enabled to manage HornetQ. It can be disabled by setting By default, JMX is enabled to manage ActiveMQ. It can be disabled by setting jmx-management-enabled to false in hornetq-configuration.xml: + >activemq-configuration.xml: -<!-- false to disable JMX management for HornetQ --> +<!-- false to disable JMX management for ActiveMQ --> <jmx-management-enabled>false</jmx-management-enabled> - If JMX is enabled, HornetQ can be managed locally using jconsole. + If JMX is enabled, ActiveMQ can be managed locally using jconsole. Remote connections to JMX are not enabled by default for security reasons. Please refer to properties must be set in run.sh or run.bat scripts). - By default, HornetQ server uses the JMX domain "org.apache.activemq". To manage several - HornetQ servers from the same MBeanServer, the JMX domain can be - configured for each individual HornetQ server by setting jmx-domain - in hornetq-configuration.xml: + By default, ActiveMQ server uses the JMX domain "org.apache.activemq". To manage several + ActiveMQ servers from the same MBeanServer, the JMX domain can be + configured for each individual ActiveMQ server by setting jmx-domain + in activemq-configuration.xml: -<!-- use a specific JMX domain for HornetQ MBeans --> +<!-- use a specific JMX domain for ActiveMQ MBeans --> <jmx-domain>my.org.apache.activemq</jmx-domain>
MBeanServer configuration - When HornetQ is run in standalone, it uses the Java Virtual Machine's When ActiveMQ is run in standalone, it uses the Java Virtual Machine's Platform MBeanServer to register its MBeans. This is configured in JBoss Microcontainer Beans file (see ): @@ -586,12 +586,12 @@ org.apache.activemq.api.jms.management.JMSQueueControl
Example See for an example which shows how to use a remote - connection to JMX and MBean proxies to manage HornetQ. + connection to JMX and MBean proxies to manage ActiveMQ.
Using Management Via Core API - The core management API in HornetQ is called by sending Core messages to a special + The core management API in ActiveMQ is called by sending Core messages to a special address, the management address. Management messages are regular Core messages with well-known properties that the server needs to understand to interact with the management API: @@ -606,7 +606,7 @@ org.apache.activemq.api.jms.management.JMSQueueControl The parameters of the management operation - When such a management message is sent to the management address, HornetQ server will + When such a management message is sent to the management address, ActiveMQ server will handle it, extract the information, invoke the operation on the managed resources and send a management reply to the management message's reply-to address (specified by ClientMessageImpl.REPLYTO_HEADER_NAME). @@ -643,7 +643,7 @@ org.apache.activemq.api.jms.management.JMSQueueControl >exampleQueue: ClientSession session = ... -ClientRequestor requestor = new ClientRequestor(session, "jms.queue.hornetq.management"); +ClientRequestor requestor = new ClientRequestor(session, "jms.queue.activemq.management"); ClientMessage message = session.createMessage(false); ManagementHelper.putAttribute(message, "core.queue.exampleQueue", "messageCount"); session.start(); @@ -660,31 +660,31 @@ System.out.println("There are " + count + " messages in exampleQueue"); Configuring Core Management The management address to send management messages is configured in hornetq-configuration.xml: + >activemq-configuration.xml: -<management-address>jms.queue.hornetq.management</management-address> - By default, the address is jms.queue.hornetq.management (it is +<management-address>jms.queue.activemq.management</management-address> + By default, the address is jms.queue.activemq.management (it is prepended by "jms.queue" so that JMS clients can also send management messages). The management address requires a special user permission manage to be able to receive and handle management messages. This - is also configured in hornetq-configuration.xml: + is also configured in activemq-configuration.xml: <!-- users with the admin role will be allowed to manage --> -<!-- HornetQ using management messages --> -<security-setting match="jms.queue.hornetq.management"> +<!-- ActiveMQ using management messages --> +<security-setting match="jms.queue.activemq.management"> <permission type="manage" roles="admin" /> </security-setting>
Using Management Via JMS - Using JMS messages to manage HornetQ is very similar to using core API. + Using JMS messages to manage ActiveMQ is very similar to using core API. An important difference is that JMS requires a JMS queue to send the messages to (instead of an address for the core API). The management queue is a special queue and needs to be instantiated directly by the client: -Queue managementQueue = HornetQJMSClient.createQueue("hornetq.management"); +Queue managementQueue = ActiveMQJMSClient.createQueue("activemq.management"); All the other steps are the same than for the Core API but they use JMS API instead: @@ -712,7 +712,7 @@ Queue managementQueue = HornetQJMSClient.createQueue("hornetq.management");For example, to know the number of messages in the JMS queue exampleQueue: -Queue managementQueue = HornetQJMSClient.createQueue("hornetq.management"); +Queue managementQueue = ActiveMQJMSClient.createQueue("activemq.management"); QueueSession session = ... QueueRequestor requestor = new QueueRequestor(session, managementQueue); @@ -730,13 +730,13 @@ System.out.println("There are " + count + " messages in exampleQueue"); Example See for an example which shows how to use JMS - messages to manage HornetQ server. + messages to manage ActiveMQ server.
Management Notifications - HornetQ emits notifications to inform listeners of potentially + ActiveMQ emits notifications to inform listeners of potentially interesting events (creation of new resources, security violation, etc.). These notifications can be received by 3 different ways: @@ -767,7 +767,7 @@ System.out.println("There are " + count + " messages in exampleQueue");
Core Messages Notifications - HornetQ defines a special management notification address. Core + ActiveMQ defines a special management notification address. Core queues can be bound to this address so that clients will receive management notifications as Core messages A Core client which wants to receive management notifications must create a core @@ -782,15 +782,15 @@ System.out.println("There are " + count + " messages in exampleQueue"); Configuring The Core Management Notification Address The management notification address to receive management notifications is - configured in hornetq-configuration.xml: + configured in activemq-configuration.xml: -<management-notification-address>hornetq.notifications</management-notification-address> - By default, the address is hornetq.notifications. +<management-notification-address>activemq.notifications</management-notification-address> + By default, the address is activemq.notifications.
JMS Messages Notifications - HornetQ's notifications can also be received using JMS messages. + ActiveMQ's notifications can also be received using JMS messages. It is similar to receiving notifications using Core API but an important difference is that JMS requires a JMS Destination to receive the messages (preferably a Topic). @@ -803,7 +803,7 @@ System.out.println("There are " + count + " messages in exampleQueue");Once the notification topic is created, you can receive messages from it or set a MessageListener: -Topic notificationsTopic = HornetQJMSClient.createTopic("notificationsTopic"); +Topic notificationsTopic = ActiveMQJMSClient.createTopic("notificationsTopic"); Session session = ... MessageConsumer notificationConsumer = session.createConsumer(notificationsTopic); @@ -833,7 +833,7 @@ notificationConsumer.setMessageListener(new MessageListener() Example See for an example which shows how to use a JMS MessageListener to receive management notifications - from HornetQ server. + from ActiveMQ server.
Notification Types and Headers @@ -980,7 +980,7 @@ notificationConsumer.setMessageListener(new MessageListener()
Message Counters Message counters can be used to obtain information on queues over - time as HornetQ keeps a history on queue metrics. + time as ActiveMQ keeps a history on queue metrics. They can be used to show trends on queues. For example, using the management API, it would be possible to query the number of messages in a queue at regular interval. However, this would not be enough to know if the queue is used: the number of @@ -1029,13 +1029,13 @@ notificationConsumer.setMessageListener(new MessageListener() By default, message counters are disabled as it might have a small negative effect on memory. To enable message counters, you can set it to true in hornetq-configuration.xml: + >activemq-configuration.xml: <message-counter-enabled>true</message-counter-enabled> Message counters keeps a history of the queue metrics (10 days by default) and samples all the queues at regular interval (10 seconds by default). If message counters are enabled, these values should be configured to suit your messaging use case in - hornetq-configuration.xml: + activemq-configuration.xml: <!-- keep history for a week --> <message-counter-max-day-history>7</message-counter-max-day-history> @@ -1044,7 +1044,7 @@ notificationConsumer.setMessageListener(new MessageListener() Message counters can be retrieved using the Management API. For example, to retrieve message counters on a JMS Queue using JMX: -// retrieve a connection to HornetQ's MBeanServer +// retrieve a connection to ActiveMQ's MBeanServer MBeanServerConnection mbsc = ... JMSQueueControlMBean queueControl = (JMSQueueControl)MBeanServerInvocationHandler.newProxyInstance(mbsc, on, @@ -1065,10 +1065,10 @@ messageCounter.getMessageCountDelta());
- Administering HornetQ Resources Using The JBoss AS Admin Console - Its possible to create and configure HornetQ resources via the admin console within the JBoss Application Server. + Administering ActiveMQ Resources Using The JBoss AS Admin Console + Its possible to create and configure ActiveMQ resources via the admin console within the JBoss Application Server. The Admin Console will allow you to create destinations (JMS Topics and Queues) and JMS Connection Factories. - Once logged in to the admin console you will see a JMS Manager item in the left hand tree. All HornetQ resources + Once logged in to the admin console you will see a JMS Manager item in the left hand tree. All ActiveMQ resources will be configured via this. This will have a child items for JMS Queues, Topics and Connection Factories, clicking on each node will reveal which resources are currently available. The following sections explain how to create and configure each resource in turn. diff --git a/docs/user-manual/en/message-expiry.xml b/docs/user-manual/en/message-expiry.xml index e4d1f3762d..f4d66ee487 100644 --- a/docs/user-manual/en/message-expiry.xml +++ b/docs/user-manual/en/message-expiry.xml @@ -18,23 +18,23 @@ + %BOOK_ENTITIES; ]> Message Expiry Messages can be set with an optional time to live when sending them. - HornetQ will not deliver a message to a consumer after it's time to live has been exceeded. + ActiveMQ will not deliver a message to a consumer after it's time to live has been exceeded. If the message hasn't been delivered by the time that time to live is reached the server can discard it. - HornetQ's addresses can be assigned a expiry address so that, when messages are expired, + ActiveMQ's addresses can be assigned a expiry address so that, when messages are expired, they are removed from the queue and sent to the expiry address. Many different queues can be bound to an expiry address. These expired messages can later be consumed for further inspection.
Message Expiry - Using HornetQ Core API, you can set an expiration time directly on the message: + Using ActiveMQ Core API, you can set an expiration time directly on the message: // message will expire in 5000ms from now message.setExpiration(System.currentTimeMillis() + 5000); @@ -79,7 +79,7 @@ producer.setTimeToLive(5000); A reaper thread will periodically inspect the queues to check if messages have expired. The reaper thread can be configured with the following properties in hornetq-configuration.xml + >activemq-configuration.xml message-expiry-scan-period diff --git a/docs/user-manual/en/message-grouping.xml b/docs/user-manual/en/message-grouping.xml index ce4e04c718..e739996750 100644 --- a/docs/user-manual/en/message-grouping.xml +++ b/docs/user-manual/en/message-grouping.xml @@ -18,7 +18,7 @@ + %BOOK_ENTITIES; ]> @@ -28,7 +28,7 @@ Messages in a message group share the same group id, i.e. they have same group identifier property (JMSXGroupID for JMS, _HQ_GROUP_ID for HornetQ Core API). + >_HQ_GROUP_ID for ActiveMQ Core API). Messages in a message group are always consumed by the same consumer, even if there @@ -79,8 +79,8 @@ message.setStringProperty("JMSXGroupID", "Group-0"); producer.send(message); Alternatively, you can set autogroup to true on the HornetQConnectonFactory which will pick a random unique id. This can also be - set in the hornetq-jms.xml file like this: + >ActiveMQConnectonFactory which will pick a random unique id. This can also be + set in the activemq-jms.xml file like this: <connection-factory name="ConnectionFactory"> <connectors> @@ -94,7 +94,7 @@ Alternatively you can set the group id via the connection factory. All messages sent with producers created via this connection factory will set the JMSXGroupID to the specified value on all messages sent. To configure the - group id set it on the connection factory in the hornetq-jms.xml config + group id set it on the connection factory in the activemq-jms.xml config file as follows <connection-factory name="ConnectionFactory"> @@ -132,7 +132,7 @@ local handler that actually makes the decision as to what route should be used, all the other remote handlers converse with this. Here is a sample config for both types of handler, this should be configured in the hornetq-configuration.xml + >activemq-configuration.xml file. <grouping-handler name="my-grouping-handler"> <type>LOCAL</type> @@ -201,7 +201,7 @@
Clustered Grouping Example See for an example of how to configure - message groups with a HornetQ cluster + message groups with a ActiveMQ cluster
diff --git a/docs/user-manual/en/messaging-concepts.xml b/docs/user-manual/en/messaging-concepts.xml index 241fd98608..f1f4853531 100644 --- a/docs/user-manual/en/messaging-concepts.xml +++ b/docs/user-manual/en/messaging-concepts.xml @@ -18,12 +18,12 @@ + %BOOK_ENTITIES; ]> Messaging Concepts - HornetQ is an asynchronous messaging system, an example of ActiveMQ is an asynchronous messaging system, an example of Message Oriented Middleware , we'll just call them messaging systems in the remainder of this book. @@ -141,7 +141,7 @@
Transactions Messaging systems typically support the sending and acknowledgement of multiple - messages in a single local transaction. HornetQ also supports the sending and + messages in a single local transaction. ActiveMQ also supports the sending and acknowledgement of message as part of a large global transaction - using the Java mapping of XA: JTA.
@@ -175,7 +175,7 @@ JMS does not define a standard wire format - it only defines a programmatic API so JMS clients and servers from different vendors cannot directly interoperate since each will use the vendor's own internal wire protocol. - HornetQ provides a fully compliant JMS 1.1 and JMS 2.0 API. + ActiveMQ provides a fully compliant JMS 1.1 and JMS 2.0 API.
System specific APIs @@ -184,7 +184,7 @@ functionality to be exposed to the client application. API's like JMS are not normally rich enough to expose all the extra features that most messaging systems provide. - HornetQ provides its own core client API for clients to use if they wish to have + ActiveMQ provides its own core client API for clients to use if they wish to have access to functionality over and above that accessible via the JMS API.
@@ -201,7 +201,7 @@ protocol. The advantage of a REST approach with HTTP is in its simplicity and the fact the internet is already tuned to deal with HTTP optimally. - Please see for using HornetQ's RESTful interface. + Please see for using ActiveMQ's RESTful interface.
STOMP @@ -211,7 +211,7 @@ systems. It defines a wire format, so theoretically any Stomp client can work with any messaging system that supports Stomp. Stomp clients are available in many different programming languages. - Please see for using STOMP with HornetQ. + Please see for using STOMP with ActiveMQ.
AMQP @@ -219,8 +219,8 @@ interoperable messaging. It also defines a wire format, so any AMQP client can work with any messaging system that supports AMQP. AMQP clients are available in many different programming languages. - HornetQ implements the AMQP 1.0 - specification. Any client that supports the 1.0 specification will be able to interact with HornetQ. + ActiveMQ implements the AMQP 1.0 + specification. Any client that supports the 1.0 specification will be able to interact with ActiveMQ.
@@ -228,7 +228,7 @@ High Availability (HA) means that the system should remain operational after failure of one or more of the servers. The degree of support for HA varies between various messaging systems. - HornetQ provides automatic failover where your sessions are automatically reconnected + ActiveMQ provides automatic failover where your sessions are automatically reconnected to the backup server on event of live server failure. For more information on HA, please see .
@@ -241,10 +241,10 @@ Degrees of support for clusters varies between messaging systems, with some systems having fairly basic clusters with the cluster members being hardly aware of each other. - HornetQ provides very configurable state-of-the-art clustering model where messages + ActiveMQ provides very configurable state-of-the-art clustering model where messages can be intelligently load balanced between the servers in the cluster, according to the number of consumers on each node, and whether they are ready for messages. - HornetQ also has the ability to automatically redistribute messages between nodes of a + ActiveMQ also has the ability to automatically redistribute messages between nodes of a cluster to prevent starvation on any particular node. For full details on clustering, please see .
@@ -256,9 +256,9 @@ A bridge normally consumes from a queue on one server and forwards messages to another queue on a different server. Bridges cope with unreliable connections, automatically reconnecting when the connections becomes available again. - HornetQ bridges can be configured with filter expressions to only forward certain + ActiveMQ bridges can be configured with filter expressions to only forward certain messages, and transformation can also be hooked in. - HornetQ also allows routing between queues to be configured in server side + ActiveMQ also allows routing between queues to be configured in server side configuration. This allows complex routing networks to be set up forwarding or copying messages from one destination to another, forming a global network of interconnected brokers. diff --git a/docs/user-manual/en/notice.xml b/docs/user-manual/en/notice.xml index 5ed879bd2d..798c27d547 100644 --- a/docs/user-manual/en/notice.xml +++ b/docs/user-manual/en/notice.xml @@ -17,7 +17,7 @@ + %BOOK_ENTITIES; ]> diff --git a/docs/user-manual/en/paging.xml b/docs/user-manual/en/paging.xml index ba82cb0f23..5affad628a 100644 --- a/docs/user-manual/en/paging.xml +++ b/docs/user-manual/en/paging.xml @@ -17,19 +17,19 @@ + %BOOK_ENTITIES; ]> Paging - HornetQ transparently supports huge queues containing millions of messages while the + ActiveMQ transparently supports huge queues containing millions of messages while the server is running with limited memory. In such a situation it's not possible to store all of the queues in memory at any one - time, so HornetQ transparently pages messages into and out of memory as + time, so ActiveMQ transparently pages messages into and out of memory as they are needed, thus allowing massive queues with a low memory footprint. - HornetQ will start paging messages to disk, when the size of all messages in memory for an + ActiveMQ will start paging messages to disk, when the size of all messages in memory for an address exceeds a configured maximum size. - By default, HornetQ does not page messages - this must be explicitly configured to + By default, ActiveMQ does not page messages - this must be explicitly configured to activate it.
Page Files @@ -46,11 +46,11 @@ Configuration You can configure the location of the paging folder Global paging parameters are specified on the main configuration file (hornetq-configuration.xml). + >activemq-configuration.xml). <configuration xmlns="urn:activemq" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="urn:hornetq /schema/activemq-configuration.xsd"> + xsi:schemaLocation="urn:activemq /schema/activemq-configuration.xsd"> ... <paging-directory>/somewhere/paging-directory</paging-directory> ... @@ -71,7 +71,7 @@
paging-directory - Where page files are stored. HornetQ will create one folder for + Where page files are stored. ActiveMQ will create one folder for each address being paged under this configured location. data/paging @@ -93,7 +93,7 @@
Configuration Configuration is done at the address settings, done at the main configuration file - (hornetq-configuration.xml). + (activemq-configuration.xml). <address-settings> <address-setting match="jms.someaddress"> @@ -211,6 +211,6 @@
Example See for an example which shows how to use paging - with HornetQ. + with ActiveMQ.
diff --git a/docs/user-manual/en/perf-tuning.xml b/docs/user-manual/en/perf-tuning.xml index da0c2ede70..7866d82d0d 100644 --- a/docs/user-manual/en/perf-tuning.xml +++ b/docs/user-manual/en/perf-tuning.xml @@ -18,12 +18,12 @@ + %BOOK_ENTITIES; ]> Performance Tuning - In this chapter we'll discuss how to tune HornetQ for optimum performance. + In this chapter we'll discuss how to tune ActiveMQ for optimum performance.
Tuning persistence @@ -105,7 +105,7 @@ incur a lot more overhead in persisting them to storage. - Batch many sends or acknowledgements in a single transaction. HornetQ will + Batch many sends or acknowledgements in a single transaction. ActiveMQ will only require a network round trip on the commit, not on every send or acknowledgement. @@ -113,7 +113,7 @@
Other Tunings - There are various other places in HornetQ where we can perform some tuning: + There are various other places in ActiveMQ where we can perform some tuning: Use Asynchronous Send Acknowledgements. If you need to send durable messages @@ -132,17 +132,17 @@ Disable security. You may get a small performance boost by disabling security by setting the security-enabled parameter to false in hornetq-configuration.xml. + >false in activemq-configuration.xml. Disable persistence. If you don't need message persistence, turn it off altogether by setting persistence-enabled to false in - hornetq-configuration.xml. + activemq-configuration.xml. Sync transactions lazily. Setting journal-sync-transactional to false in - hornetq-configuration.xml can give you better + activemq-configuration.xml can give you better transactional persistent performance at the expense of some possibility of loss of transactions on failure. See for more information. @@ -150,7 +150,7 @@ Sync non transactional lazily. Setting journal-sync-non-transactional to false in - hornetq-configuration.xml can give you better + activemq-configuration.xml can give you better non-transactional persistent performance at the expense of some possibility of loss of durable messages on failure. See for more information. @@ -158,7 +158,7 @@ Send messages non blocking. Setting block-on-durable-send and block-on-non-durable-send to false in - hornetq-jms.xml (if you're using JMS and JNDI) or + activemq-jms.xml (if you're using JMS and JNDI) or directly on the ServerLocator. This means you don't have to wait a whole network round trip for every message sent. See for more information. @@ -168,7 +168,7 @@ effectively disables consumer flow control. - Socket NIO vs Socket Old IO. By default HornetQ uses old (blocking) on the + Socket NIO vs Socket Old IO. By default ActiveMQ uses old (blocking) on the server and the client side (see the chapter on configuring transports for more information ). NIO is much more scalable but can give you some latency hit compared to old blocking IO. If you need to be @@ -218,11 +218,11 @@ serveruser hard nofile 20000 Use batch-delay and set direct-deliver - to false for the best throughput for very small messages. HornetQ comes with a + to false for the best throughput for very small messages. ActiveMQ comes with a preconfigured connector/acceptor pair (netty-throughput) in - hornetq-configuration.xml and JMS connection factory + activemq-configuration.xml and JMS connection factory (ThroughputConnectionFactory) in hornetq-jms.xmlwhich can be used to give the very best + >activemq-jms.xmlwhich can be used to give the very best throughput, especially for small messages. See the for more information on this. @@ -240,7 +240,7 @@ serveruser hard nofile 20000 >-XX:+UseParallelOldGC on Sun JDKs. - Memory settings. Give as much memory as you can to the server. HornetQ can run + Memory settings. Give as much memory as you can to the server. ActiveMQ can run in low memory by using paging (described in ) but if it can run with all queues in RAM this will improve performance. The amount of memory you require will depend on the size and number of your queues and the @@ -272,7 +272,7 @@ serveruser hard nofile 20000 Some popular libraries such as the Spring JMS Template are known to use these anti-patterns. If you're using Spring JMS Template and you're getting - poor performance you know why. Don't blame HornetQ! The Spring JMS Template + poor performance you know why. Don't blame ActiveMQ! The Spring JMS Template can only safely be used in an app server which caches JMS sessions (e.g. using JCA), and only then for sending messages. It cannot be safely be used for synchronously consuming messages, even in an app server. diff --git a/docs/user-manual/en/persistence.xml b/docs/user-manual/en/persistence.xml index 14d107894f..5ab28d98fd 100644 --- a/docs/user-manual/en/persistence.xml +++ b/docs/user-manual/en/persistence.xml @@ -18,17 +18,17 @@ + %BOOK_ENTITIES; ]> Persistence - In this chapter we will describe how persistence works with HornetQ and how to configure + In this chapter we will describe how persistence works with ActiveMQ and how to configure it. - HornetQ ships with a high performance journal. Since HornetQ handles its own persistence, + ActiveMQ ships with a high performance journal. Since ActiveMQ handles its own persistence, rather than relying on a database or other 3rd party persistence engine it is very highly optimised for the specific messaging use cases. - A HornetQ journal is an append only journal. It consists of a set of + A ActiveMQ journal is an append only journal. It consists of a set of files on disk. Each file is pre-created to a fixed size and initially filled with padding. As operations are performed on the server, e.g. add message, update message, delete message, records are appended to the journal. When one journal file is full we move to the next @@ -42,16 +42,16 @@ by minimising the number of disk cylinders the file is using, we can minimise the amount of disk head movement, since an entire disk cylinder is accessible simply by the disk rotating - the head does not have to move. - As delete records are added to the journal, HornetQ has a sophisticated file garbage + As delete records are added to the journal, ActiveMQ has a sophisticated file garbage collection algorithm which can determine if a particular journal file is needed any more - i.e. has all its data been deleted in the same or other files. If so, the file can be reclaimed and re-used. - HornetQ also has a compaction algorithm which removes dead space from the journal and + ActiveMQ also has a compaction algorithm which removes dead space from the journal and compresses up the data so it takes up less files on disk. The journal also fully supports transactional operation if required, supporting both local and XA transactions. The majority of the journal is written in Java, however we abstract out the interaction - with the actual file system to allow different pluggable implementations. HornetQ ships with + with the actual file system to allow different pluggable implementations. ActiveMQ ships with two implementations: @@ -63,7 +63,7 @@ Linux Asynchronous IO The second implementation uses a thin native code wrapper to talk to the Linux - asynchronous IO library (AIO). With AIO, HornetQ will be called back when the data + asynchronous IO library (AIO). With AIO, ActiveMQ will be called back when the data has made it to disk, allowing us to avoid explicit syncs altogether and simply send back confirmation of completion when AIO informs us that the data has been persisted. @@ -80,7 +80,7 @@ libaio is part of the kernel project. - The standard HornetQ core server uses two instances of the journal: + The standard ActiveMQ core server uses two instances of the journal: Bindings journal. @@ -89,7 +89,7 @@ such as id sequence counters. The bindings journal is always a NIO journal as it is typically low throughput compared to the message journal. - The files on this journal are prefixed as hornetq-bindings. + The files on this journal are prefixed as activemq-bindings. Each file has a bindings extension. File size is 1048576, and it is located at the bindings folder. @@ -101,7 +101,7 @@ Any JMS Resources created via the management API will be persisted to this journal. Any resources configured via configuration files will not. The JMS Journal will only be created if JMS is being used. - The files on this journal are prefixed as hornetq-jms. Each + The files on this journal are prefixed as activemq-jms. Each file has a jms extension. File size is 1048576, and it is located at the bindings folder. @@ -109,26 +109,26 @@ Message journal. This journal instance stores all message related data, including the message themselves and also duplicate-id caches. - By default HornetQ will try and use an AIO journal. If AIO is not available, e.g. + By default ActiveMQ will try and use an AIO journal. If AIO is not available, e.g. the platform is not Linux with the correct kernel version or AIO has not been installed then it will automatically fall back to using Java NIO which is available on any Java platform. - The files on this journal are prefixed as hornetq-data. Each + The files on this journal are prefixed as activemq-data. Each file has a hq extension. File size is by the default 10485760 (configurable), and it is located at the journal folder. - For large messages, HornetQ persists them outside the message journal. This is discussed + For large messages, ActiveMQ persists them outside the message journal. This is discussed in . - HornetQ can also be configured to page messages to disk in low memory situations. This is + ActiveMQ can also be configured to page messages to disk in low memory situations. This is discussed in . - If no persistence is required at all, HornetQ can also be configured not to persist any + If no persistence is required at all, ActiveMQ can also be configured not to persist any data at all to storage as discussed in .
Configuring the bindings journal The bindings journal is configured using the following attributes in hornetq-configuration.xml + >activemq-configuration.xml bindings-directory @@ -151,7 +151,7 @@
Configuring the message journal The message journal is configured using the following attributes in hornetq-configuration.xml + >activemq-configuration.xml journal-directory @@ -179,18 +179,18 @@ Choosing NIO chooses the Java NIO journal. Choosing AIO chooses the Linux asynchronous IO journal. If you choose AIO but are not running Linux or you do not have - libaio installed then HornetQ will detect this and automatically fall back to + libaio installed then ActiveMQ will detect this and automatically fall back to using NIO. journal-sync-transactional - If this is set to true then HornetQ will make sure all transaction data is + If this is set to true then ActiveMQ will make sure all transaction data is flushed to disk on transaction boundaries (commit, prepare and rollback). The default value is true. journal-sync-non-transactional - If this is set to true then HornetQ will make sure non transactional message + If this is set to true then ActiveMQ will make sure non transactional message data (sends and acknowledgements) are flushed to disk each time. The default value for this is true. @@ -201,8 +201,8 @@ journal-min-files - The minimum number of files the journal will maintain. When HornetQ starts and - there is no initial message data, HornetQ will pre-create The minimum number of files the journal will maintain. When ActiveMQ starts and + there is no initial message data, ActiveMQ will pre-create journal-min-files number of files. Creating journal files and filling them with padding is a fairly expensive operation and we want to minimise doing this at run-time as files get filled. By @@ -295,7 +295,7 @@
Installing AIO - The Java NIO journal gives great performance, but If you are running HornetQ using + The Java NIO journal gives great performance, but If you are running ActiveMQ using Linux Kernel 2.6 or later, we highly recommend you use the AIO journal for the very best persistence performance. It's not possible to use the AIO journal under other operating systems or earlier @@ -309,11 +309,11 @@ apt-get install libaio
- Configuring HornetQ for Zero Persistence + Configuring ActiveMQ for Zero Persistence In some situations, zero persistence is sometimes required for a messaging system. - Configuring HornetQ to perform zero persistence is straightforward. Simply set the + Configuring ActiveMQ to perform zero persistence is straightforward. Simply set the parameter persistence-enabled in hornetq-configuration.xml to false. + >activemq-configuration.xml to false. Please note that if you set this parameter to false, then zero persistence will occur. That means no bindings data, message data, large message data, duplicate id caches or paging data will be persisted. @@ -321,21 +321,21 @@
Import/Export the Journal Data You may want to inspect the existent records on each one of the journals used by - HornetQ, and you can use the export/import tool for that purpose. The export/import are - classes located at the hornetq-core.jar, you can export the journal as a text file by + ActiveMQ, and you can use the export/import tool for that purpose. The export/import are + classes located at the activemq-core.jar, you can export the journal as a text file by using this command: - java -cp hornetq-core.jar org.apache.activemq.core.journal.impl.ExportJournal + java -cp activemq-core.jar org.apache.activemq.core.journal.impl.ExportJournal <JournalDirectory> <JournalPrefix> <FileExtension> <FileSize> <FileOutput> To import the file as binary data on the journal (Notice you also require netty.jar): - java -cp hornetq-core.jar:netty.jar org.apache.activemq.core.journal.impl.ImportJournal + java -cp activemq-core.jar:netty.jar org.apache.activemq.core.journal.impl.ImportJournal <JournalDirectory> <JournalPrefix> <FileExtension> <FileSize> <FileInput> JournalDirectory: Use the configured folder for your selected folder. Example: - ./hornetq/data/journal + ./activemq/data/journal JournalPrefix: Use the prefix for your selected journal, as discussed diff --git a/docs/user-manual/en/pre-acknowledge.xml b/docs/user-manual/en/pre-acknowledge.xml index 81abbe9c7d..5208e91365 100644 --- a/docs/user-manual/en/pre-acknowledge.xml +++ b/docs/user-manual/en/pre-acknowledge.xml @@ -18,7 +18,7 @@ + %BOOK_ENTITIES; ]> @@ -35,11 +35,11 @@ DUPS_OK_ACKNOWLEDGE - HornetQ supports two additional modes: PRE_ACKNOWLEDGE and INDIVIDUAL_ACKNOWLEDGE + ActiveMQ supports two additional modes: PRE_ACKNOWLEDGE and INDIVIDUAL_ACKNOWLEDGE In some cases you can afford to lose messages in event of failure, so it would make sense to acknowledge the message on the server before delivering it to the client. - This extra mode is supported by HornetQ and will call it + This extra mode is supported by ActiveMQ and will call it pre-acknowledge mode. The disadvantage of acknowledging on the server before delivery is that the message will be lost if the system crashes after acknowledging the message on the server @@ -58,7 +58,7 @@
Using PRE_ACKNOWLEDGE - This can be configured in the hornetq-jms.xml file on the This can be configured in the activemq-jms.xml file on the connection factory like this: <connection-factory name="ConnectionFactory"> @@ -71,12 +71,12 @@ <pre-acknowledge>true</pre-acknowledge> </connection-factory> Alternatively, to use pre-acknowledgement mode using the JMS API, create a JMS Session - with the HornetQSession.PRE_ACKNOWLEDGE constant. + with the ActiveMQSession.PRE_ACKNOWLEDGE constant. // messages will be acknowledge on the server *before* being delivered to the client -Session session = connection.createSession(false, HornetQJMSConstants.PRE_ACKNOWLEDGE); +Session session = connection.createSession(false, ActiveMQJMSConstants.PRE_ACKNOWLEDGE); Or you can set pre-acknowledge directly on the HornetQConnectionFactory instance using the setter method. + >ActiveMQConnectionFactory instance using the setter method. To use pre-acknowledgement mode using the core API you can set it directly on the ClientSessionFactory instance using the setter method.
@@ -84,7 +84,7 @@ Session session = connection.createSession(false, HornetQJMSConstants.PRE_ACKNOW Individual Acknowledge A valid use-case for individual acknowledgement would be when you need to have your own scheduling and you don't know when your message processing will be finished. You should prefer having one consumer per thread worker but this is not possible in some circumstances depending on how complex is your processing. For that you can use the individual Acknowledgement. - You basically setup Individual ACK by creating a session with the acknowledge mode with HornetQJMSConstants.INDIVIDUAL_ACKNOWLEDGE. Individual ACK inherits all the semantics from Client Acknowledge, + You basically setup Individual ACK by creating a session with the acknowledge mode with ActiveMQJMSConstants.INDIVIDUAL_ACKNOWLEDGE. Individual ACK inherits all the semantics from Client Acknowledge, with the exception the message is individually acked. Please note, that to avoid confusion on MDB processing, Individual ACKNOWLEDGE is not supported through MDBs (or the inbound resource adapter). this is because you have to finish the process of your message inside the MDB. diff --git a/docs/user-manual/en/preface.xml b/docs/user-manual/en/preface.xml index 2c1483b3de..2e914673cd 100644 --- a/docs/user-manual/en/preface.xml +++ b/docs/user-manual/en/preface.xml @@ -18,36 +18,36 @@ + %BOOK_ENTITIES; ]> Preface - What is HornetQ? + What is ActiveMQ? - HornetQ is an open source project to build a multi-protocol, embeddable, very high + ActiveMQ is an open source project to build a multi-protocol, embeddable, very high performance, clustered, asynchronous messaging system. - HornetQ is an example of Message Oriented Middleware (MoM). For a description of + ActiveMQ is an example of Message Oriented Middleware (MoM). For a description of MoMs and other messaging concepts please see the . - For answers to more questions about what HornetQ is and what it isn't please visit - the FAQs wiki + For answers to more questions about what ActiveMQ is and what it isn't please visit + the FAQs wiki page. - Why use HornetQ? Here are just a few of the reasons: + Why use ActiveMQ? Here are just a few of the reasons: - 100% open source software. HornetQ is licensed using the Apache Software License v + 100% open source software. ActiveMQ is licensed using the Apache Software License v 2.0 to minimise barriers to adoption. - HornetQ is designed with usability in mind. + ActiveMQ is designed with usability in mind. Written in Java. Runs on any platform with a Java 6+ runtime, that's everything @@ -63,7 +63,7 @@ and others you won't find anywhere else. - Elegant, clean-cut design with minimal third party dependencies. Run HornetQ + Elegant, clean-cut design with minimal third party dependencies. Run ActiveMQ stand-alone, run it in integrated in your favourite JEE application server, or run it embedded inside your own product. It's up to you. @@ -80,7 +80,7 @@ For a full list of features, please see the features wiki + url="http://www.jboss.org/community/wiki/ActiveMQFeatures">features wiki page . diff --git a/docs/user-manual/en/project-info.xml b/docs/user-manual/en/project-info.xml index 7e3ca973ca..a642c0498e 100644 --- a/docs/user-manual/en/project-info.xml +++ b/docs/user-manual/en/project-info.xml @@ -18,17 +18,17 @@ + %BOOK_ENTITIES; ]> Project Information - The official HornetQ project page is http://hornetq.org/. + The official ActiveMQ project page is http://activemq.org/.
Software Download The software can be download from the Download page:http://hornetq.org/downloads.html + url="http://activemq.org/downloads.html">http://activemq.org/downloads.html
Project Information @@ -36,41 +36,41 @@ Please take a look at our project wiki + url="http://www.jboss.org/community/wiki/ActiveMQ">wiki If you have any user questions please use our user + url="https://community.jboss.org/en/activemq">user forum If you have development related questions, please use our developer forum - Pop in and chat to us in our Pop in and chat to us in our IRC channel - Our project blog + Our project blog - Follow us on twitter + Follow us on twitter - HornetQ Git repository is https://github.com/hornetq/hornetq + ActiveMQ Git repository is https://github.com/activemq/activemq All release tags are available from https://github.com/hornetq/hornetq/tags + url="https://github.com/activemq/activemq/tags" + >https://github.com/activemq/activemq/tags - Red Hat kindly employs developers to work full time on HornetQ, they are: + Red Hat kindly employs developers to work full time on ActiveMQ, they are: Clebert Suconic (project lead) @@ -84,7 +84,7 @@ Justin Bertram - And many thanks to all our contributors, both old and new who helped create HornetQ, + And many thanks to all our contributors, both old and new who helped create ActiveMQ, for a full list of the people who made it happen, take a look at our team page.
diff --git a/docs/user-manual/en/queue-attributes.xml b/docs/user-manual/en/queue-attributes.xml index 1c12befc43..93bb227f26 100644 --- a/docs/user-manual/en/queue-attributes.xml +++ b/docs/user-manual/en/queue-attributes.xml @@ -18,7 +18,7 @@ + %BOOK_ENTITIES; ]> @@ -30,7 +30,7 @@ Predefined Queues Queues can be predefined via configuration at a core level or at a JMS level. Firstly let's look at a JMS level. - The following shows a queue predefined in the hornetq-jms.xml + The following shows a queue predefined in the activemq-jms.xml configuration file. <queue name="selectorQueue"> @@ -50,7 +50,7 @@ The durable element specifies whether the queue will be persisted. This again is optional and defaults to true if omitted. Secondly a queue can be predefined at a core level in the hornetq-configuration.xml file. The following is an example. + >activemq-configuration.xml
file. The following is an example.
<queues> <queue name="jms.queue.selectorQueue"> @@ -95,7 +95,7 @@ Configuring Queues Via Address Settings There are some attributes that are defined against an address wildcard rather than a specific queue. Here an example of an address-setting entry that - would be found in the hornetq-configuration.xml file. + would be found in the activemq-configuration.xml file. <address-settings> <address-setting match="jms.queue.exampleQueue"> diff --git a/docs/user-manual/en/rest.xml b/docs/user-manual/en/rest.xml index 712cfcdd7c..947d7165dc 100644 --- a/docs/user-manual/en/rest.xml +++ b/docs/user-manual/en/rest.xml @@ -19,8 +19,8 @@ REST Interface - The HornetQ REST interface allows you to leverage the reliability - and scalability features of HornetQ over a simple REST/HTTP interface. + The ActiveMQ REST interface allows you to leverage the reliability + and scalability features of ActiveMQ over a simple REST/HTTP interface. Messages are produced and consumed by sending and receiving simple HTTP messages that contain the content you want to push around. For instance, here's a simple example of posting an order to an order processing queue @@ -40,7 +40,7 @@ Content-Type: application/xml As you can see, we're just posting some arbitrary XML document to a URL. When the XML is received on the server is it processed - within HornetQ as a JMS message and distributed through core HornetQ. + within ActiveMQ as a JMS message and distributed through core ActiveMQ. Simple and easy. Consuming messages from a queue or topic looks very similar. We'll discuss the entire interface in detail later in this docbook. @@ -49,7 +49,7 @@ Content-Type: application/xml
Goals of REST Interface - Why would you want to use HornetQ's REST interface? What are the + Why would you want to use ActiveMQ's REST interface? What are the goals of the REST interface? @@ -59,10 +59,10 @@ Content-Type: application/xml - Zero client footprint. We want HornetQ to be usable by any + Zero client footprint. We want ActiveMQ to be usable by any client/programming language that has an adequate HTTP client library. You shouldn't have to download, install, and configure a - special library to interact with HornetQ. + special library to interact with ActiveMQ. @@ -72,7 +72,7 @@ Content-Type: application/xml RESTful the HTTP uniform interface provides all the interoperability you need to communicate between different languages, platforms, and even messaging implementations that choose to implement the same - RESTful interface as HornetQ (i.e. the + RESTful interface as ActiveMQ (i.e. the REST-* effort.) @@ -81,13 +81,13 @@ Content-Type: application/xml No envelope (e.g. SOAP) or feed (e.g. Atom) format requirements. You shouldn't have to learn, use, or parse a specific XML document format in order to send and receive messages through - HornetQ's REST interface. + ActiveMQ's REST interface. Leverage the reliability, scalability, and clustering features - of HornetQ on the back end without sacrificing the simplicity of a + of ActiveMQ on the back end without sacrificing the simplicity of a REST interface. @@ -98,22 +98,22 @@ Content-Type: application/xml
Installation and Configuration - HornetQ's REST interface is installed as a Web archive (WAR). It + ActiveMQ's REST interface is installed as a Web archive (WAR). It depends on the RESTEasy project and can currently only run within a servlet container. Installing - the HornetQ REST interface is a little bit different depending whether - HornetQ is already installed and configured for your environment (e.g. - you're deploying within JBoss AS 7) or you want the HornetQ REST - WAR to startup and manage the HornetQ server (e.g. you're deploying + the ActiveMQ REST interface is a little bit different depending whether + ActiveMQ is already installed and configured for your environment (e.g. + you're deploying within JBoss AS 7) or you want the ActiveMQ REST + WAR to startup and manage the ActiveMQ server (e.g. you're deploying within something like Apache Tomcat).
Installing Within Pre-configured Environment - This section should be used when you want to use the HornetQ REST - interface in an environment that already has HornetQ installed and + This section should be used when you want to use the ActiveMQ REST + interface in an environment that already has ActiveMQ installed and running, e.g. JBoss AS 7. You must create a Web archive (.WAR) file with the following web.xml settings: @@ -146,7 +146,7 @@ Content-Type: application/xml </web-app> Within your WEB-INF/lib directory you must have the - hornetq-rest.jar file. If RESTEasy is not installed within your + activemq-rest.jar file. If RESTEasy is not installed within your environment, you must add the RESTEasy jar files within the lib directory as well. Here's a sample Maven pom.xml that can build your WAR for this case. @@ -186,7 +186,7 @@ Content-Type: application/xml <dependencies> <dependency> <groupId>org.apache.activemq.rest</groupId> - <artifactId>hornetq-rest</artifactId> + <artifactId>activemq-rest</artifactId> <version>2.3.0-SNAPSHOT</version> </dependency> </dependencies> @@ -218,8 +218,8 @@ Content-Type: application/xml It is worth noting that when deploying a WAR in a Java EE application server like AS7 the URL for the resulting application will include the name of the WAR by default. For example, if you've constructed a WAR as described above - named "hornetq-rest.war" then clients will access it at, e.g. - http://localhost:8080/hornetq-rest/[queues|topics]. We'll see more about + named "activemq-rest.war" then clients will access it at, e.g. + http://localhost:8080/activemq-rest/[queues|topics]. We'll see more about this later. @@ -231,13 +231,13 @@ Content-Type: application/xml
- Bootstrapping HornetQ Along with REST + Bootstrapping ActiveMQ Along with REST - You can bootstrap HornetQ within your WAR as well. To do this, you - must have the HornetQ core and JMS jars along with Netty, Resteasy, and - the HornetQ REST jar within your WEB-INF/lib. You must also have a - hornetq-configuration.xml, hornetq-jms.xml, and hornetq-users.xml config - files within WEB-INF/classes. The examples that come with the HornetQ + You can bootstrap ActiveMQ within your WAR as well. To do this, you + must have the ActiveMQ core and JMS jars along with Netty, Resteasy, and + the ActiveMQ REST jar within your WEB-INF/lib. You must also have a + activemq-configuration.xml, activemq-jms.xml, and activemq-users.xml config + files within WEB-INF/classes. The examples that come with the ActiveMQ REST distribution show how to do this. You must also add an additional listener to your web.xml file. Here's an example: @@ -252,7 +252,7 @@ Content-Type: application/xml <listener> <listener-class> - org.apache.activemq.rest.integration.HornetqBootstrapListener + org.apache.activemq.rest.integration.ActiveMQBootstrapListener </listener-class> </listener> @@ -276,7 +276,7 @@ Content-Type: application/xml </web-app> Here's a Maven pom.xml file for creating a WAR for this - environment. Make sure your hornetq configuration files are within the + environment. Make sure your activemq configuration files are within the src/main/resources directory so that they are stuffed within the WAR's WEB-INF/classes directory! @@ -313,7 +313,7 @@ Content-Type: application/xml <dependencies> <dependency> <groupId>org.apache.activemq</groupId> - <artifactId>hornetq-core</artifactId> + <artifactId>activemq-core</artifactId> <version>2.3.0-SNAPSHOT</version> </dependency> <dependency> @@ -323,7 +323,7 @@ Content-Type: application/xml </dependency> <dependency> <groupId>org.apache.activemq</groupId> - <artifactId>hornetq-jms</artifactId> + <artifactId>activemq-jms</artifactId> <version>2.3.0-SNAPSHOT</version> </dependency> <dependency> @@ -333,7 +333,7 @@ Content-Type: application/xml </dependency> <dependency> <groupId>org.apache.activemq.rest</groupId> - <artifactId>hornetq-rest</artifactId> + <artifactId>activemq-rest</artifactId> <version>2.3.0-SNAPSHOT</version> </dependency> <dependency> @@ -353,7 +353,7 @@ Content-Type: application/xml
REST Configuration - The HornetQ REST implementation does have some configuration + The ActiveMQ REST implementation does have some configuration options. These are configured via XML configuration file that must be in your WEB-INF/classes directory. You must set the web.xml context-param rest.messaging.config.file to specify the name of the @@ -380,15 +380,15 @@ Content-Type: application/xml - server-in-vm-id. The HornetQ REST - impl uses the IN-VM transport to communicate with HornetQ. + server-in-vm-id. The ActiveMQ REST + impl uses the IN-VM transport to communicate with ActiveMQ. It uses the default server id, which is "0". use-link-headers. By default, all links (URLs) are published using custom headers. You can - instead have the HornetQ REST implementation publish links + instead have the ActiveMQ REST implementation publish links using the Link Header specification instead if you desire. @@ -421,7 +421,7 @@ Content-Type: application/xml producer-session-pool-size. The REST - implementation pools HornetQ sessions for sending messages. + implementation pools ActiveMQ sessions for sending messages. This is the size of the pool. That number of sessions will be created at startup time. @@ -446,9 +446,9 @@ Content-Type: application/xml consumer-window-size. For consumers, - this config option is the same as the HornetQ one of the + this config option is the same as the ActiveMQ one of the same name. It will be used by sessions created by the - HornetQ REST implementation. + ActiveMQ REST implementation. @@ -457,9 +457,9 @@ Content-Type: application/xml
- HornetQ REST Interface Basics + ActiveMQ REST Interface Basics - The HornetQ REST interface publishes a variety of REST resources to + The ActiveMQ REST interface publishes a variety of REST resources to perform various tasks on a queue or topic. Only the top-level queue and topic URI schemes are published to the outside world. You must discover all over resources to interact with by looking for and traversing links. @@ -479,16 +479,16 @@ Content-Type: application/xml /topics/{name} The base of the URI is the base URL of the WAR you deployed the - HornetQ REST server within as defined in the + ActiveMQ REST server within as defined in the Installation and Configuration section of this document. Replace the {name} string within the above URI pattern with the name of the queue or topic you are interested in interacting with. For example if you have configured a JMS topic named "foo" within your - hornetq-jms.xml file, the URI name should be + activemq-jms.xml file, the URI name should be "jms.topic.foo". If you have configured a JMS queue name "bar" within - your hornetq-jms.xml file, the URI name should be - "jms.queue.bar". Internally, HornetQ prepends the "jms.topic" or + your activemq-jms.xml file, the URI name should be + "jms.queue.bar". Internally, ActiveMQ prepends the "jms.topic" or "jms.queue" strings to the name of the deployed destination. Next, perform your HEAD or GET request on this URI. Here's what a request/response would look like. @@ -522,7 +522,7 @@ curl --head http://example.com/queues/jms.queue.bar are an implementation detail. Treat them as opaque and query for them each and every time you initially interact (at boot time) with the server. If you treat all URLs as opaque then you will be isolated from - implementation changes as the HornetQ REST interface evolves over + implementation changes as the ActiveMQ REST interface evolves over time.
@@ -557,7 +557,7 @@ curl --head http://example.com/queues/jms.queue.bar msg-push-consumers. This is a URL for - registering other URLs you want the HornetQ REST server to + registering other URLs you want the ActiveMQ REST server to push messages to. The semantics of this link are described in Pushing Messages. @@ -595,7 +595,7 @@ curl --head http://example.com/queues/jms.queue.bar msg-push-subscriptions. This is a - URL for registering other URLs you want the HornetQ REST + URL for registering other URLs you want the ActiveMQ REST server to push messages to. The semantics of this link are described in Pushing Messages. @@ -610,13 +610,13 @@ curl --head http://example.com/queues/jms.queue.bar Posting Messages This chapter discusses the protocol for posting messages to a queue - or a topic. In HornetQ REST Interface Basics, + or a topic. In ActiveMQ REST Interface Basics, you saw that a queue or topic resource publishes variable custom headers that are links to other RESTful resources. The msg-create header is a URL you can post a message to. Messages are published to a queue or topic by sending a simple HTTP message to the URL published by the msg-create header. The HTTP message contains whatever - content you want to publish to the HornetQ destination. Here's an example + content you want to publish to the ActiveMQ destination. Here's an example scenario: @@ -724,11 +724,11 @@ msg-create-next: http://example.com/queues/jms.queue.bar/create messages to a queue or topic. You may do a POST and never receive a response. Unfortunately, you don't know whether or not the server received the message and so a re-post of the message might cause - duplicates to be posted to the queue or topic. By default, the HornetQ + duplicates to be posted to the queue or topic. By default, the ActiveMQ REST interface is configured to accept and post duplicate messages. You can change this by turning on duplicate message detection by setting the dups-ok config option to false - as described in HornetQ REST Interface Basics. + as described in ActiveMQ REST Interface Basics. When you do this, the initial POST to the msg-create URL will redirect you, using the standard HTTP 307 redirection mechanism to a unique URL to POST to. All other interactions remain the same as @@ -832,10 +832,10 @@ msg-create-next: http://example.com/queues/jms.queue.bar/create/13582001787374 How can this work? As you can see, with each successful response, - the HornetQ REST server returns a uniquely generated URL within the + the ActiveMQ REST server returns a uniquely generated URL within the msg-create-next header. This URL is dedicated to the next new message you want to post. Behind the scenes, the code extracts an identify from - the URL and uses HornetQ's duplicate detection mechanism by setting the + the URL and uses ActiveMQ's duplicate detection mechanism by setting the DUPLICATE_DETECTION_ID property of the JMS message that is actually posted to the system. @@ -844,7 +844,7 @@ msg-create-next: http://example.com/queues/jms.queue.bar/create/13582001787374 -WARN [org.apache.activemq.core.server] (Thread-3 (HornetQ-remoting-threads-HornetQServerImpl::serverUUID=8d6be6f8-5e8b-11e2-80db-51bbde66f473-26319292-267207)) HQ112098: Duplicate message detected - message will not be routed. Message information: +WARN [org.apache.activemq.core.server] (Thread-3 (ActiveMQ-remoting-threads-ActiveMQServerImpl::serverUUID=8d6be6f8-5e8b-11e2-80db-51bbde66f473-26319292-267207)) HQ112098: Duplicate message detected - message will not be routed. Message information: ServerMessage[messageID=20,priority=4, bodySize=1500,expiration=0, durable=true, address=jms.queue.bar,properties=TypedProperties[{http_content$type=application/x-www-form-urlencoded, http_content$length=3, postedAsHttpMessage=true, _HQ_DUPL_ID=42}]]@12835058 An alternative to this approach is to use the msg-create-with-id @@ -877,7 +877,7 @@ msg-create-with-id: http://example.com/queues/jms.queue.bar/create/{id}Persistent Messages By default, posted messages are not durable and will not be - persisted in HornetQ's journal. You can create durable messages by + persisted in ActiveMQ's journal. You can create durable messages by modifying the default configuration as expressed in Chapter 2 so that all messages are persisted when sent. Alternatively, you can set a URL query parameter called durable to true when you post @@ -935,7 +935,7 @@ Content-Type: application/xml important caveats. To start consuming you must create a consumer resource on the server that is dedicated to your client. Now, this pretty much breaks the stateless principle of REST, but after much prototyping, this - is the best way to work most effectively with HornetQ through a REST + is the best way to work most effectively with ActiveMQ through a REST interface. @@ -944,7 +944,7 @@ Content-Type: application/xml response header if you are interacting with a queue, the msg-pull-subscribers response header if you're interacting with a topic. These headers are provided by the main queue or - topic resource discussed in HornetQ REST Interface + topic resource discussed in ActiveMQ REST Interface Basics. Doing an empty POST to one of these URLs will create a consumer resource that follows an auto-acknowledge protocol and, if you are interacting with a topic, creates a temporarily @@ -979,7 +979,7 @@ Content-Type: application/xml selector. This is an optional JMS selector - string. The HornetQ REST interface adds HTTP headers to the + string. The ActiveMQ REST interface adds HTTP headers to the JMS message for REST produced messages. HTTP headers are prefixed with "http_" and every '-' character is converted to a '$'. @@ -1223,7 +1223,7 @@ msg-consume-next: http://example.com/queues/jms.queue.bar/pull-consumers/333/con should retry a post. Also notice, that another new msg-consume-next URL is present. Although it probably is the same URL you used last post, get in the habit of using URLs returned in - response headers as future versions of HornetQ REST might be + response headers as future versions of ActiveMQ REST might be redirecting you or adding additional data to the URL after timeouts like this. @@ -1594,7 +1594,7 @@ http://example.com/queues/jms.queue.bar/pull-consumers/333/acknowledge-next-2

Unless your queue or topic has a high rate of message flowing though it, if you use the pull protocol, you're going to be receiving a lot of 503 responses as you continuously pull the server for new - messages. To alleviate this problem, the HornetQ REST interface provides + messages. To alleviate this problem, the ActiveMQ REST interface provides the Accept-Wait header. This is a generic HTTP request header that is a hint to the server for how long the client is willing to wait for a response from the server. The value of this header @@ -1643,9 +1643,9 @@ msg-consume-next: http://example.com/queues/jms.queue.bar/pull-consumers/333/con
Pushing Messages - You can configure the HornetQ REST server to push messages to a + You can configure the ActiveMQ REST server to push messages to a registered URL either remotely through the REST interface, or by creating - a pre-configured XML file for the HornetQ REST server to load at boot + a pre-configured XML file for the ActiveMQ REST server to load at boot time. @@ -1702,7 +1702,7 @@ msg-consume-next: http://example.com/queues/jms.queue.bar/pull-consumers/333/con will disable the registration if all retries have failed. It will not disable the connection on non-connection-failure issues (like a bad request for instance). In these cases, the dead letter queue logic of - HornetQ will take over. + ActiveMQ will take over. The link element specifies the basis of the @@ -1720,10 +1720,10 @@ msg-consume-next: http://example.com/queues/jms.queue.bar/pull-consumers/333/con destination. The href URL is assumed to be a queue or topic resource of - another HornetQ REST server. The push registration will initially + another ActiveMQ REST server. The push registration will initially do a HEAD request to this URL to obtain a msg-create-with-id header. It will use this header to push new messages to the - HornetQ REST endpoint reliably. Here's an example: + ActiveMQ REST endpoint reliably. Here's an example: @@ -1962,13 +1962,13 @@ Location: http://example.com/topics/jms.topic.bar/push-subscriptions/1-333-1212< Currently you cannot create a temporary queue or topic. To create a queue you do a POST to the relative URL /queues with an XML representation of the queue. The XML syntax is the same queue syntax that you would specify - in hornetq-jms.xml if you were creating a queue there. For example: + in activemq-jms.xml if you were creating a queue there. For example: POST /queues Host: example.com -Content-Type: application/hornetq.jms.queue+xml +Content-Type: application/activemq.jms.queue+xml <queue name="testQueue"> <durable>true</durable> @@ -1978,14 +1978,14 @@ Content-Type: application/hornetq.jms.queue+xml HTTP/1.1 201 Created Location: http://example.com/queues/jms.queue.testQueue - Notice that the Content-Type is application/hornetq.jms.queue+xml. + Notice that the Content-Type is application/activemq.jms.queue+xml. Here's what creating a topic would look like: POST /topics Host: example.com -Content-Type: application/hornetq.jms.topic+xml +Content-Type: application/activemq.jms.topic+xml <topic name="testTopic"> </topic> @@ -1997,23 +1997,23 @@ Location: http://example.com/topics/jms.topic.testTopic
- Securing the HornetQ REST Interface + Securing the ActiveMQ REST Interface
Within JBoss Application server - Securing the HornetQ REST interface is very simple with the JBoss + Securing the ActiveMQ REST interface is very simple with the JBoss Application Server. You turn on authentication for all URLs within your - WAR's web.xml, and let the user Principal to propagate to HornetQ. This - only works if you are using the JBossSecurityManager with HornetQ. See - the HornetQ documentation for more details. + WAR's web.xml, and let the user Principal to propagate to ActiveMQ. This + only works if you are using the JBossSecurityManager with ActiveMQ. See + the ActiveMQ documentation for more details.
Security in other environments - To secure the HornetQ REST interface in other environments you + To secure the ActiveMQ REST interface in other environments you must role your own security by specifying security constraints with your web.xml for every path of every queue and topic you have deployed. Here is a list of URI patterns: @@ -2091,7 +2091,7 @@ Location: http://example.com/topics/jms.topic.testTopic
Mixing JMS and REST - The HornetQ REST interface supports mixing JMS and REST producers + The ActiveMQ REST interface supports mixing JMS and REST producers and consumers. You can send an ObjectMessage through a JMS Producer, and have a REST client consume it. You can have a REST client POST a message to a topic and have a JMS Consumer receive it. Some simple transformations @@ -2101,11 +2101,11 @@ Location: http://example.com/topics/jms.topic.testTopic
JMS Producers - REST Consumers - If you have a JMS producer, the HornetQ REST interface only + If you have a JMS producer, the ActiveMQ REST interface only supports ObjectMessage type. If the JMS producer is aware that there may be REST consumers, it should set a JMS property to specify what Content-Type the Java object should be translated into by REST clients. - The HornetQ REST server will use RESTEasy content handlers + The ActiveMQ REST server will use RESTEasy content handlers (MessageBodyReader/Writers) to transform the Java object to the type desired. Here's an example of a JMS producer setting the content type of the message. @@ -2129,7 +2129,7 @@ message.setStringProperty(org.apache.activemq.rest.HttpHeaderProperty.CONTENT_TY REST Producers - JMS Consumers If you have a REST client producing messages and a JMS consumer, - HornetQ REST has a simple helper class for you to transform the HTTP + ActiveMQ REST has a simple helper class for you to transform the HTTP body to a Java object. Here's some example code: diff --git a/docs/user-manual/en/scheduled-messages.xml b/docs/user-manual/en/scheduled-messages.xml index 509904e9e4..06407bfdd2 100644 --- a/docs/user-manual/en/scheduled-messages.xml +++ b/docs/user-manual/en/scheduled-messages.xml @@ -18,7 +18,7 @@ + %BOOK_ENTITIES; ]> diff --git a/docs/user-manual/en/security.xml b/docs/user-manual/en/security.xml index e9cd18723a..0a2b8c9118 100644 --- a/docs/user-manual/en/security.xml +++ b/docs/user-manual/en/security.xml @@ -18,26 +18,26 @@ + %BOOK_ENTITIES; ]> Security - This chapter describes how security works with HornetQ and how you can configure it. To + This chapter describes how security works with ActiveMQ and how you can configure it. To disable security completely simply set the security-enabled property to - false in the hornetq-configuration.xml file. + false in the activemq-configuration.xml file. For performance reasons security is cached and invalidated every so long. To change this period set the property security-invalidation-interval, which is in milliseconds. The default is 10000 ms.
Role based security for addresses - HornetQ contains a flexible role-based security model for applying security to queues, + ActiveMQ contains a flexible role-based security model for applying security to queues, based on their addresses. - As explained in , HornetQ core consists mainly of sets of + As explained in , ActiveMQ core consists mainly of sets of queues bound to addresses. A message is sent to an address and the server looks up the set of queues that are bound to that address, the server then routes the message to those set of queues. - HornetQ allows sets of permissions to be defined against the queues based on their + ActiveMQ allows sets of permissions to be defined against the queues based on their address. An exact match on the address can be used or a wildcard match can be used using the wildcard characters '#' and '*'. Seven different permissions can be given to the set of queues which match the address. @@ -77,7 +77,7 @@ the user has any of those roles, he/she will be granted that permission for that set of addresses. Let's take a simple example, here's a security block from hornetq-configuration.xml or hornetq-queues.xml + >activemq-configuration.xml or activemq-queues.xml file: <security-setting match="globalqueues.europe.#"> @@ -101,7 +101,7 @@ can send messages to these addresses or consume messages from queues bound to an address that starts with the string "globalqueues.europe." The mapping between a user and what roles they have is handled by the security - manager. HornetQ ships with a user manager that reads user credentials from a file on + manager. ActiveMQ ships with a user manager that reads user credentials from a file on disk, and can also plug into JAAS or JBoss Application Server security. For more information on configuring the security manager, please see . @@ -135,23 +135,23 @@
Secure Sockets Layer (SSL) Transport When messaging clients are connected to servers, or servers are connected to other - servers (e.g. via bridges) over an untrusted network then HornetQ allows that traffic to + servers (e.g. via bridges) over an untrusted network then ActiveMQ allows that traffic to be encrypted using the Secure Sockets Layer (SSL) transport. For more information on configuring the SSL transport, please see .
Basic user credentials - HornetQ ships with a security manager implementation that reads user credentials, i.e. + ActiveMQ ships with a security manager implementation that reads user credentials, i.e. user names, passwords and role information from an xml file on the classpath called - hornetq-users.xml. This is the default security manager. + activemq-users.xml. This is the default security manager. If you wish to use this security manager, then users, passwords and roles can easily be added into this file. Let's take a look at an example file: <configuration xmlns="urn:activemq" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="urn:hornetq ../schemas/activemq-users.xsd "> + xsi:schemaLocation="urn:activemq ../schemas/activemq-users.xsd "> <defaultuser name="guest" password="guest"> <role name="guest"/> @@ -185,23 +185,23 @@
Changing the security manager If you do not want to use the default security manager then you can specify a - different one by editing the file hornetq-beans.xml (or hornetq-jboss-beans.xml if you're running JBoss Application Server) and - changing the class for the HornetQSecurityManager bean. + different one by editing the file activemq-beans.xml (or activemq-jboss-beans.xml if you're running JBoss Application Server) and + changing the class for the ActiveMQSecurityManager bean. Let's take a look at a snippet from the default beans file: -<bean name="HornetQSecurityManager" class="org.apache.activemq.spi.core.security.HornetQSecurityManagerImpl"> +<bean name="ActiveMQSecurityManager" class="org.apache.activemq.spi.core.security.ActiveMQSecurityManagerImpl"> <start ignored="true"/> <stop ignored="true"/> </bean> - The class org.apache.activemq.spi.core.security.HornetQSecurityManagerImpl + The class org.apache.activemq.spi.core.security.ActiveMQSecurityManagerImpl is the default security manager that is used by the standalone server. - HornetQ ships with two other security manager implementations you can use + ActiveMQ ships with two other security manager implementations you can use off-the-shelf; one a JAAS security manager and another for integrating with JBoss Application Sever security, alternatively you could write your own implementation by - implementing the org.apache.activemq.spi.core.security.HornetQSecurityManager + implementing the org.apache.activemq.spi.core.security.ActiveMQSecurityManager interface, and specifying the classname of your implementation in the file hornetq-beans.xml (or hornetq-jboss-beans.xml if + >activemq-beans.xml (or activemq-jboss-beans.xml if you're running JBoss Application Server). These two implementations are discussed in the next two sections.
@@ -214,7 +214,7 @@ you need to specify the security manager as a JAASSecurityManager in the beans file. Here's an example: -<bean name="HornetQSecurityManager" class="org.apache.activemq.integration.jboss.security.JAASSecurityManager"> +<bean name="ActiveMQSecurityManager" class="org.apache.activemq.integration.jboss.security.JAASSecurityManager"> <start ignored="true"/> <stop ignored="true"/> @@ -243,27 +243,27 @@
Example - See for an example which shows how HornetQ can be + See for an example which shows how ActiveMQ can be configured to use JAAS.
JBoss AS Security Manager - The JBoss AS security manager is used when running HornetQ inside the JBoss + The JBoss AS security manager is used when running ActiveMQ inside the JBoss Application server. This allows tight integration with the JBoss Application Server's security model. The class name of this security manager is org.apache.activemq.integration.jboss.security.JBossASSecurityManager - Take a look at one of the default hornetq-jboss-beans.xml files for + Take a look at one of the default activemq-jboss-beans.xml files for JBoss Application Server that are bundled in the distribution for an example of how this is configured.
Configuring Client Login JBoss can be configured to allow client login, basically this is when a JEE component such as a Servlet or EJB sets security credentials on the current security context and these are used throughout the call. - If you would like these credentials to be used by HornetQ when sending or consuming messages then - set allowClientLogin to true. This will bypass HornetQ authentication and propagate the - provided Security Context. If you would like HornetQ to authenticate using the propagated security then set the + If you would like these credentials to be used by ActiveMQ when sending or consuming messages then + set allowClientLogin to true. This will bypass ActiveMQ authentication and propagate the + provided Security Context. If you would like ActiveMQ to authenticate using the propagated security then set the authoriseOnClientLogin to true also. There is more info on using the JBoss client login module here @@ -273,7 +273,7 @@
Changing the Security Domain - The name of the security domain used by the JBoss AS security manager defaults to java:/jaas/hornetq + The name of the security domain used by the JBoss AS security manager defaults to java:/jaas/activemq . This can be changed by specifying securityDomainName (e.g. java:/jaas/myDomain).
diff --git a/docs/user-manual/en/send-guarantees.xml b/docs/user-manual/en/send-guarantees.xml index a89d6461bb..aeca337874 100644 --- a/docs/user-manual/en/send-guarantees.xml +++ b/docs/user-manual/en/send-guarantees.xml @@ -18,14 +18,14 @@ + %BOOK_ENTITIES; ]> Guarantees of sends and commits
Guarantees of Transaction Completion - When committing or rolling back a transaction with HornetQ, the request to commit or + When committing or rolling back a transaction with ActiveMQ, the request to commit or rollback is sent to the server, and the call will block on the client side until a response has been received from the server that the commit or rollback was executed. @@ -41,11 +41,11 @@ storage by the time the call to commit or rollback returns. Setting this parameter to false can improve performance at the expense of some loss of transaction durability. - This parameter is set in hornetq-configuration.xml + This parameter is set in activemq-configuration.xml
Guarantees of Non Transactional Message Sends - If you are sending messages to a server using a non transacted session, HornetQ can be + If you are sending messages to a server using a non transacted session, ActiveMQ can be configured to block the call to send until the message has definitely reached the server, and a response has been sent back to the client. This can be configured individually for durable and non-durable messages, and is determined by the @@ -72,14 +72,14 @@ your network, rather than the bandwidth of your network. For better performance we recommend either batching many messages sends together in a transaction since with a transactional session, only the commit / rollback blocks not every send, or, using - HornetQ's advanced asynchronous send acknowledgements feature + ActiveMQ's advanced asynchronous send acknowledgements feature described in . If you are using JMS and you're using the JMS service on the server to load your JMS connection factory instances into JNDI then these parameters can be configured in - hornetq-jms.xml using the elements activemq-jms.xml using the elements block-on-durable-send and block-on-non-durable-send. If you're using JMS but not using JNDI then - you can set these values directly on the HornetQConnectionFactory + you can set these values directly on the ActiveMQConnectionFactory instance using the appropriate setter methods. If you're using core you can set these values directly on the ClientSessionFactory instance using the appropriate setter @@ -95,7 +95,7 @@
Guarantees of Non Transactional Acknowledgements If you are acknowledging the delivery of a message at the client side using a non - transacted session, HornetQ can be configured to block the call to acknowledge until the + transacted session, ActiveMQ can be configured to block the call to acknowledge until the acknowledge has definitely reached the server, and a response has been sent back to the client. This is configured with the parameter BlockOnAcknowledge. If this is set to true then all calls to acknowledge on non transacted @@ -108,7 +108,7 @@ Asynchronous Send Acknowledgements If you are using a non transacted session but want a guarantee that every message sent to the server has reached it, then, as discussed in , you can configure HornetQ to block the call to + linkend="non-transactional-sends"/>, you can configure ActiveMQ to block the call to send until the server has received the message, persisted it and sent back a response. This works well but has a severe performance penalty - each call to send needs to block for at least the time of a network round trip (RTT) - the performance of sending is thus @@ -124,8 +124,8 @@ * 1024 * 1024 / 8) / 1500 = 89478 messages per second if messages are sent without blocking! These figures aren't an exact science but you can clearly see that being limited by network RTT can have serious effect on performance. - To remedy this, HornetQ provides an advanced new feature called asynchronous - send acknowledgements. With this feature, HornetQ can be configured to + To remedy this, ActiveMQ provides an advanced new feature called asynchronous + send acknowledgements. With this feature, ActiveMQ can be configured to send messages without blocking in one direction and asynchronously getting acknowledgement from the server that the messages were received in a separate stream. By de-coupling the send from the acknowledgement of the send, the system is not limited by @@ -142,7 +142,7 @@ Then, you just send messages as normal using your ClientSession, and as messages reach the server, the server will send back an acknowledgement of the send asynchronously, and some time later you are - informed at the client side by HornetQ calling your handler's sendAcknowledged(ClientMessage message) method, passing in a reference to the message that was sent. To enable asynchronous send acknowledgements you must make sure confirmation-window-size is set to a positive integer value, e.g. 10MiB diff --git a/docs/user-manual/en/slow-consumers.xml b/docs/user-manual/en/slow-consumers.xml index aef287d1b9..78f4bc1114 100644 --- a/docs/user-manual/en/slow-consumers.xml +++ b/docs/user-manual/en/slow-consumers.xml @@ -18,12 +18,12 @@ + %BOOK_ENTITIES; ]> Detecting Slow Consumers - In this section we will discuss how HornetQ can be configured to deal with slow consumers. A slow consumer with + In this section we will discuss how ActiveMQ can be configured to deal with slow consumers. A slow consumer with a server-side queue (e.g. JMS topic subscriber) can pose a significant problem for broker performance. If messages build up in the consumer's server-side queue then memory will begin filling up and the broker may enter paging mode which would impact performance negatively. However, criteria can be set so that consumers which don't diff --git a/docs/user-manual/en/spring-integration.xml b/docs/user-manual/en/spring-integration.xml index 2c02972c48..c69016a0d7 100644 --- a/docs/user-manual/en/spring-integration.xml +++ b/docs/user-manual/en/spring-integration.xml @@ -20,27 +20,27 @@ + %BOOK_ENTITIES; ]> Spring Integration - HornetQ provides a simple bootstrap class, + ActiveMQ provides a simple bootstrap class, org.apache.activemq.integration.spring.SpringJmsBootstrap, for - integration with Spring. To use it, you configure HornetQ as you always + integration with Spring. To use it, you configure ActiveMQ as you always would, through its various configuration files like - hornetq-configuration.xml, - hornetq-jms.xml, and - hornetq-users.xml. The Spring helper class starts the - HornetQ server and adds any factories or destinations configured within - hornetq-jms.xml directly into the namespace of the Spring - context. Let's take this hornetq-jms.xml file for + activemq-configuration.xml, + activemq-jms.xml, and + activemq-users.xml. The Spring helper class starts the + ActiveMQ server and adds any factories or destinations configured within + activemq-jms.xml directly into the namespace of the Spring + context. Let's take this activemq-jms.xml file for instance: <configuration xmlns="urn:activemq" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="urn:hornetq /schema/activemq-jms.xsd"> + xsi:schemaLocation="urn:activemq /schema/activemq-jms.xsd"> <!--the connection factory used by the example--> <connection-factory name="ConnectionFactory"> <connectors> @@ -82,7 +82,7 @@ </beans> As you can see, the listenerContainer bean references the components defined - in the hornetq-jms.xml file. The + in the activemq-jms.xml file. The SpringJmsBootstrap class extends the EmbeddedJMS class talked about in and the same defaults and diff --git a/docs/user-manual/en/thread-pooling.xml b/docs/user-manual/en/thread-pooling.xml index e78b1b01fe..59fede9b3a 100644 --- a/docs/user-manual/en/thread-pooling.xml +++ b/docs/user-manual/en/thread-pooling.xml @@ -18,22 +18,22 @@ + %BOOK_ENTITIES; ]> Thread management - This chapter describes how HornetQ uses and pools threads and how you can manage + This chapter describes how ActiveMQ uses and pools threads and how you can manage them. First we'll discuss how threads are managed and used on the server side, then we'll look at the client side.
Server-Side Thread Management - Each HornetQ Server maintains a single thread pool for general use, and a scheduled + Each ActiveMQ Server maintains a single thread pool for general use, and a scheduled thread pool for scheduled use. A Java scheduled thread pool cannot be configured to use a standard thread pool, otherwise we could use a single thread pool for both scheduled and non scheduled activity. - A separate thread pool is also used to service connections. HornetQ can use "old" + A separate thread pool is also used to service connections. ActiveMQ can use "old" (blocking) IO or "new" (non-blocking) IO also called NIO. Both of these options use a separate thread pool, but each of them behaves uniquely. Since old IO requires a thread per connection its thread pool is unbounded. The thread @@ -49,7 +49,7 @@ since it has no remaining threads to do anything else. However, even an unbounded thread pool can run into trouble if it becomes too large. If you require the server to handle many concurrent connections you should use NIO, not old IO. - When using new IO (NIO), HornetQ will, by default, cap its thread pool at three times + When using new IO (NIO), ActiveMQ will, by default, cap its thread pool at three times the number of cores (or hyper-threads) as reported by Runtime.getRuntime().availableProcessors() for processing incoming packets. To override this value, you can set the number of threads by specifying the parameter @@ -63,7 +63,7 @@ that require running periodically or with delays. It maps internally to a java.util.concurrent.ScheduledThreadPoolExecutor instance. The maximum number of thread used by this pool is configure in hornetq-configuration.xml with the activemq-configuration.xml with the scheduled-thread-pool-max-size parameter. The default value is 5 threads. A small number of threads is usually sufficient for this pool. @@ -74,7 +74,7 @@ server side. It maps internally to a java.util.concurrent.ThreadPoolExecutor instance. The maximum number of thread used by this pool is configure in hornetq-configuration.xml with the activemq-configuration.xml with the thread-pool-max-size parameter. If a value of -1 is used this signifies that the thread pool has no upper bound and new threads will be created on demand if there are not enough @@ -105,21 +105,21 @@ Asynchronous IO Asynchronous IO has a thread pool for receiving and dispatching events out of the native layer. You will find it on a thread dump with the prefix - HornetQ-AIO-poller-pool. HornetQ uses one thread per opened file on the journal + ActiveMQ-AIO-poller-pool. ActiveMQ uses one thread per opened file on the journal (there is usually one). There is also a single thread used to invoke writes on libaio. We do that to avoid context switching on libaio that would cause performance issues. You will find this - thread on a thread dump with the prefix HornetQ-AIO-writer-pool. + thread on a thread dump with the prefix ActiveMQ-AIO-writer-pool.
Client-Side Thread Management - On the client side, HornetQ maintains a single static scheduled thread pool and a + On the client side, ActiveMQ maintains a single static scheduled thread pool and a single static general thread pool for use by all clients using the same classloader in that JVM instance. The static scheduled thread pool has a maximum size of 5 threads, and the general purpose thread pool has an unbounded maximum size. - If required HornetQ can also be configured so that each If required ActiveMQ can also be configured so that each ClientSessionFactory instance does not use these static pools but instead maintains its own scheduled and general purpose pool. Any sessions created from that ClientSessionFactory will use those pools instead. @@ -127,7 +127,7 @@ simply use the appropriate setter methods immediately after creation, for example: -ServerLocator locator = HornetQClient.createServerLocatorWithoutHA(...) +ServerLocator locator = ActiveMQClient.createServerLocatorWithoutHA(...) ClientSessionFactory myFactory = locator.createClientSessionFactory(); myFactory.setUseGlobalPools(false); myFactory.setScheduledThreadPoolMaxSize(10); @@ -136,9 +136,9 @@ myFactory.setThreadPoolMaxSize(-1); ClientSessionFactory and use it to create the ConnectionFactory instance, for example: -ConnectionFactory myConnectionFactory = HornetQJMSClient.createConnectionFactory(myFactory); - If you're using JNDI to instantiate HornetQConnectionFactory - instances, you can also set these parameters in the hornetq-jms.xml +ConnectionFactory myConnectionFactory = ActiveMQJMSClient.createConnectionFactory(myFactory); + If you're using JNDI to instantiate ActiveMQConnectionFactory + instances, you can also set these parameters in the activemq-jms.xml file where you describe your connection factory, for example: <connection-factory name="ConnectionFactory"> diff --git a/docs/user-manual/en/tools.xml b/docs/user-manual/en/tools.xml index 12bf70e5ce..372b59049d 100644 --- a/docs/user-manual/en/tools.xml +++ b/docs/user-manual/en/tools.xml @@ -18,14 +18,14 @@ + %BOOK_ENTITIES; ]> Tools - HornetQ ships with several helpful command line tools. All tools are available from the hornetq-tools-<version>-jar-with-dependencies.jar. - As the name suggests, this Java archive contains HornetQ along with all of its dependencies. This is done to + ActiveMQ ships with several helpful command line tools. All tools are available from the activemq-tools-<version>-jar-with-dependencies.jar. + As the name suggests, this Java archive contains ActiveMQ along with all of its dependencies. This is done to simplify the execution of the tools by eliminating the need so specify a classpath. These tools are: @@ -34,7 +34,7 @@ are the paths to the directories where the bindings and message journals are stored, respectively. For example: - java -jar hornetq-tools-<version>-jar-with-dependencies.jar print-data /home/user/hornetq/data/bindings /home/user/hornetq/data/journal + java -jar activemq-tools-<version>-jar-with-dependencies.jar print-data /home/user/activemq/data/bindings /home/user/activemq/data/journal print-pages. Used for low-level inspection of paged message data. It takes two @@ -42,7 +42,7 @@ paths to the directories where paged messages and the message journals are stored, respectively. For example: - java -jar hornetq-tools-<version>-jar-with-dependencies.jar print-pages /home/user/hornetq/data/paging-directory /home/user/hornetq/data/journal + java -jar activemq-tools-<version>-jar-with-dependencies.jar print-pages /home/user/activemq/data/paging-directory /home/user/activemq/data/journal export. Used for exporting all binding and message data (including paged and large @@ -65,7 +65,7 @@ Here's an example: - java -jar hornetq-tools-<version>-jar-with-dependencies.jar export /home/user/hornetq/data/bindings-directory /home/user/hornetq/data/journal-directory /home/user/hornetq/data/paging-directory /home/user/hornetq/data/large-messages + java -jar activemq-tools-<version>-jar-with-dependencies.jar export /home/user/activemq/data/bindings-directory /home/user/activemq/data/journal-directory /home/user/activemq/data/paging-directory /home/user/activemq/data/large-messages This tool will export directly to standard out so if the data needs to be stored in a file please redirect as appropriate for the operation system in use. Also, please note that the export tool is single threaded so depending on the size of the journal it could take awhile to complete. @@ -74,7 +74,7 @@ import. Used for importing data from an XML document generated by the export tool. The import tool reads the XML document and connects - to a HornetQ server via Netty to import all the data. It takes 5 parameters: + to a ActiveMQ server via Netty to import all the data. It takes 5 parameters: @@ -88,7 +88,7 @@ - port - the port where HornetQ is listening. + port - the port where ActiveMQ is listening. transactional - a boolean flag to indicate whether or not to @@ -108,7 +108,7 @@ Here's an example: - java -jar hornetq-tools-<version>-jar-with-dependencies.jar import /home/user/exportData.xml 127.0.0.1 5445 false false + java -jar activemq-tools-<version>-jar-with-dependencies.jar import /home/user/exportData.xml 127.0.0.1 5445 false false Like the export tool the import tool is single threaded so depending on the size of the XML file it may take awhile for the process to complete. diff --git a/docs/user-manual/en/transaction-config.xml b/docs/user-manual/en/transaction-config.xml index 4f0905e3a8..df77172e88 100644 --- a/docs/user-manual/en/transaction-config.xml +++ b/docs/user-manual/en/transaction-config.xml @@ -18,22 +18,22 @@ + %BOOK_ENTITIES; ]> Resource Manager Configuration - HornetQ has its own Resource Manager for handling the lifespan of JTA transactions. When a + ActiveMQ has its own Resource Manager for handling the lifespan of JTA transactions. When a transaction is started the resource manager is notified and keeps a record of the transaction and its current state. It is possible in some cases for a transaction to be started but then forgotten about. Maybe the client died and never came back. If this happens then the transaction will just sit there indefinitely. - To cope with this HornetQ can, if configured, scan for old transactions and rollback any + To cope with this ActiveMQ can, if configured, scan for old transactions and rollback any it finds. The default for this is 3000000 milliseconds (5 minutes), i.e. any transactions older than 5 minutes are removed. This timeout can be changed by editing the transaction-timeout property in hornetq-configuration.xml (value must be in milliseconds). + >transaction-timeout property in activemq-configuration.xml (value must be in milliseconds). The property transaction-timeout-scan-period configures how often, in milliseconds, to scan for old transactions. - Please note that HornetQ will not unilaterally rollback any XA transactions in a prepared state - this must be heuristically rolled + Please note that ActiveMQ will not unilaterally rollback any XA transactions in a prepared state - this must be heuristically rolled back via the management API if you are sure they will never be resolved by the transaction manager. diff --git a/docs/user-manual/en/undelivered-messages.xml b/docs/user-manual/en/undelivered-messages.xml index ec76c5d30f..c429fec9f5 100644 --- a/docs/user-manual/en/undelivered-messages.xml +++ b/docs/user-manual/en/undelivered-messages.xml @@ -18,7 +18,7 @@ + %BOOK_ENTITIES; ]> @@ -62,7 +62,7 @@ <max-redelivery-delay>50000</max-redelivery-delay> </address-setting> - If a redelivery-delay is specified, HornetQ will wait this delay + If a redelivery-delay is specified, ActiveMQ will wait this delay before redelivering the messages. By default, there is no redelivery delay (redelivery-delayis set to 0). @@ -89,7 +89,7 @@ attempts, the message is removed from the queue and send instead to a dead letter address. Any such messages can then be diverted to queue(s) where they can later be perused by the system administrator for action to be taken. - HornetQ's addresses can be assigned a dead letter address. Once the messages have been + ActiveMQ's addresses can be assigned a dead letter address. Once the messages have been unsuccessfully delivered for a given number of attempts, they are removed from the queue and sent to the dead letter address. These dead letter messages can later be consumed for further inspection. @@ -138,7 +138,7 @@
Delivery Count Persistence - In normal use, HornetQ does not update delivery count persistently + In normal use, ActiveMQ does not update delivery count persistently until a message is rolled back (i.e. the delivery count is not updated before the message is delivered to the consumer). In most messaging use cases, the messages are consumed, acknowledged and forgotten as soon as they are @@ -150,10 +150,10 @@ not have been reflected in the delivery count. During the recovery phase, the server will not have knowledge of that and will deliver the message with redelivered set to false while it should be true. - As this behavior breaks strict JMS semantics, HornetQ allows to persist delivery count + As this behavior breaks strict JMS semantics, ActiveMQ allows to persist delivery count before message delivery but disabled it by default for performance implications. To enable it, set persist-delivery-count-before-delivery to true in hornetq-configuration.xml: + >true in activemq-configuration.xml: <persist-delivery-count-before-delivery>true</persist-delivery-count-before-delivery>
diff --git a/docs/user-manual/en/using-core.xml b/docs/user-manual/en/using-core.xml index 38f3d3ab41..2065a4bafe 100644 --- a/docs/user-manual/en/using-core.xml +++ b/docs/user-manual/en/using-core.xml @@ -18,7 +18,7 @@ Using Core - HornetQ core is a completely JMS-agnostic messaging system with its own non-JMS API. We + ActiveMQ core is a completely JMS-agnostic messaging system with its own non-JMS API. We call this the core API. If you don't want to use JMS you can use the core API directly. The core API provides all the functionality of JMS but without much of the complexity. It also provides features that @@ -62,12 +62,12 @@ Messages can be specified with a priority value between 0 and 9. 0 - represents the lowest priority and 9 represents the highest. HornetQ will + represents the lowest priority and 9 represents the highest. ActiveMQ will attempt to deliver higher priority messages before lower priority ones. - Messages can be specified with an optional expiry time. HornetQ will not + Messages can be specified with an optional expiry time. ActiveMQ will not deliver messages after its expiry time has been exceeded. @@ -75,7 +75,7 @@ message was sent. - HornetQ also supports the sending/consuming of very large messages - much + ActiveMQ also supports the sending/consuming of very large messages - much larger than can fit in available RAM at any one time. @@ -122,7 +122,7 @@ In JMS terms think of a ServerLocator in the same way you would a JMS Connection Factory. ServerLocator instances are created using the HornetQClient factory class. + >ActiveMQClient factory class.
ClientSessionFactory @@ -145,7 +145,7 @@ ClientSession instances can be registered with an optional SendAcknowledgementHandler. This allows your client code to be notified asynchronously when sent messages have successfully reached the server. - This unique HornetQ feature, allows you to have full guarantees that sent messages + This unique ActiveMQ feature, allows you to have full guarantees that sent messages have reached the server without having to block on each message sent until a response is received. Blocking on each messages sent is costly since it requires a network round trip for each message sent. By not blocking and receiving send @@ -186,7 +186,7 @@ queue for the consumer, creating the consumer and starting it. -ServerLocator locator = HornetQClient.createServerLocatorWithoutHA(new TransportConfiguration( +ServerLocator locator = ActiveMQClient.createServerLocatorWithoutHA(new TransportConfiguration( InVMConnectorFactory.class.getName())); // In this simple example, we just use one session for both producing and receiving diff --git a/docs/user-manual/en/using-jms.xml b/docs/user-manual/en/using-jms.xml index 6845db4cef..2c2dce7736 100644 --- a/docs/user-manual/en/using-jms.xml +++ b/docs/user-manual/en/using-jms.xml @@ -18,24 +18,24 @@ + %BOOK_ENTITIES; ]> Using JMS - Although HornetQ provides a JMS agnostic messaging API, many users will be more + Although ActiveMQ provides a JMS agnostic messaging API, many users will be more comfortable using JMS. JMS is a very popular API standard for messaging, and most messaging systems provide a JMS API. If you are completely new to JMS we suggest you follow the Sun JMS tutorial - a full JMS tutorial is out of scope for this guide. - HornetQ also ships with a wide range of examples, many of which demonstrate JMS API usage. + ActiveMQ also ships with a wide range of examples, many of which demonstrate JMS API usage. A good place to start would be to play around with the simple JMS Queue and Topic example, but we also provide examples for many other parts of the JMS API. A full description of the examples is available in . In this section we'll go through the main steps in configuring the server for JMS and creating a simple JMS program. We'll also show how to configure and use JNDI, and also how - to use JMS with HornetQ without using any JNDI. + to use JMS with ActiveMQ without using any JNDI.
A simple ordering system For this chapter we're going to use a very simple ordering system as our example. It is @@ -52,7 +52,7 @@
JMS Server Configuration - The file hornetq-jms.xml on the server classpath contains any JMS + The file activemq-jms.xml on the server classpath contains any JMS Queue, Topic and ConnectionFactory instances that we wish to create and make available to lookup via the JNDI. A JMS ConnectionFactory object is used by the client to make connections to the @@ -65,7 +65,7 @@ <configuration xmlns="urn:activemq" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="urn:hornetq ../schemas/activemq-jms.xsd "> + xsi:schemaLocation="urn:activemq ../schemas/activemq-jms.xsd "> <connection-factory name="ConnectionFactory"> <connectors> @@ -86,13 +86,13 @@ The JMS connection factory references a connector called netty. This is a reference to a connector object deployed in - the main core configuration file hornetq-configuration.xml which + the main core configuration file activemq-configuration.xml which defines the transport and parameters used to actually connect to the server.
Connection Factory Types - The JMS API doc provides several connection factories for applications. HornetQ JMS users + The JMS API doc provides several connection factories for applications. ActiveMQ JMS users can choose to configure the types for their connection factories. Each connection factory has a signature attribute and a xa parameter, the combination of which determines the type of the factory. Attribute signature @@ -151,7 +151,11 @@ <configuration xmlns="urn:activemq" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" +<<<<<<< HEAD xsi:schemaLocation="urn:hornetq ../schemas/activemq-jms.xsd "> +======= + xsi:schemaLocation="urn:activemq ../schemas/activemq-jms.xsd "> +>>>>>>> 198a239... ACTIVEMQ6-9 Clean up docs <connection-factory name="ConnectionFactory" signature="queue"> <xa>true</xa> @@ -184,13 +188,13 @@ java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces In the default standalone configuration, JNDI server ports are configured in the file - hornetq-beans.xml by setting properties on the activemq-beans.xml by setting properties on the JNDIServer bean: <bean name="StandaloneServer" class="org.apache.activemq.jms.server.impl.StandaloneNamingServer"> <constructor> <parameter> - <inject bean="HornetQServer"/> + <inject bean="ActiveMQServer"/> </parameter> </constructor> <property name="port">${jnp.port:1099}</property> @@ -204,8 +208,8 @@ java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaceslocalhost! - The JNDIServer bean must be defined only when HornetQ is running in - stand-alone mode. When HornetQ is integrated to JBoss Application + The JNDIServer bean must be defined only when ActiveMQ is running in + stand-alone mode. When ActiveMQ is integrated to JBoss Application Server, JBoss AS will provide a ready-to-use JNDI server without any additional configuration. @@ -254,21 +258,21 @@ System.out.println("Got order: " + receivedMessage.getText()); JNDI, in some cases a JNDI server is not available and you still want to use JMS, or you just think "Why do I need JNDI? Why can't I just instantiate these objects directly?" - With HornetQ you can do exactly that. HornetQ supports the direct instantiation of JMS + With ActiveMQ you can do exactly that. ActiveMQ supports the direct instantiation of JMS Queue, Topic and ConnectionFactory instances, so you don't have to use JNDI at all. For a full working example of direct instantiation please see the JMS examples in . Here's our simple example, rewritten to not use JNDI at all: - We create the JMS ConnectionFactory object via the HornetQJMSClient Utility class, + We create the JMS ConnectionFactory object via the ActiveMQJMSClient Utility class, note we need to provide connection parameters and specify which transport we are using, for more information on connectors please see . TransportConfiguration transportConfiguration = new TransportConfiguration(NettyConnectorFactory.class.getName()); -ConnectionFactory cf = HornetQJMSClient.createConnectionFactoryWithoutHA(JMSFactoryType.CF,transportConfiguration); - We also create the JMS Queue object via the HornetQJMSClient Utility class: - Queue orderQueue = HornetQJMSClient.createQueue("OrderQueue"); +ConnectionFactory cf = ActiveMQJMSClient.createConnectionFactoryWithoutHA(JMSFactoryType.CF,transportConfiguration); + We also create the JMS Queue object via the ActiveMQJMSClient Utility class: + Queue orderQueue = ActiveMQJMSClient.createQueue("OrderQueue"); Next we create a JMS connection using the connection factory: Connection connection = cf.createConnection(); And we create a non transacted JMS Session, with AUTO_ACKNOWLEDGE acknowledge diff --git a/docs/user-manual/en/using-server.xml b/docs/user-manual/en/using-server.xml index 4f202bc05c..d6edac9d93 100644 --- a/docs/user-manual/en/using-server.xml +++ b/docs/user-manual/en/using-server.xml @@ -18,16 +18,16 @@ + %BOOK_ENTITIES; ]> Using the Server - This chapter will familiarise you with how to use the HornetQ server. + This chapter will familiarise you with how to use the ActiveMQ server. We'll show where it is, how to start and stop it, and we'll describe the directory layout and what all the files are and what they do. - For the remainder of this chapter when we talk about the HornetQ server we mean the - HornetQ standalone server, in its default configuration with a JMS Service and JNDI service + For the remainder of this chapter when we talk about the ActiveMQ server we mean the + ActiveMQ standalone server, in its default configuration with a JMS Service and JNDI service enabled. When running embedded in JBoss Application Server the layout may be slightly different but by-and-large will be the same. @@ -35,19 +35,19 @@ Starting and Stopping the standalone server In the distribution you will find a directory called bin. cd into that directory and you will find a Unix/Linux script called - hornetq and a Windows script called hornetq.cmd. - To start the HornetQ instance on Unix/Linux type ./hornetq run - To start the HornetQ instance on Windows type hornetq.cmd run + activemq and a Windows script called activemq.cmd. + To start the ActiveMQ instance on Unix/Linux type ./activemq run + To start the ActiveMQ instance on Windows type activemq.cmd run These scripts are very simple and basically just set-up the classpath and some JVM parameters and bootstrap the server using Airline. - To stop the HornetQ instance you will use the same hornetq script. - To run on Unix/Linux type ./hornetq stop - To run on Windows type hornetq.cmd stop - Please note that HornetQ requires a Java 6 or later runtime to run. + To stop the ActiveMQ instance you will use the same activemq script. + To run on Unix/Linux type ./activemq stop + To run on Windows type activemq.cmd stop + Please note that ActiveMQ requires a Java 6 or later runtime to run. By default the config/non-clustered/bootstrap.xml configuration is used. The configuration can be changed e.g. by running - ./hornetq run -- xml:../config/clustered/bootstrap.xml or another config of + ./activemq run -- xml:../config/clustered/bootstrap.xml or another config of your choosing.
@@ -55,7 +55,7 @@ The run scripts set some JVM settings for tuning the garbage collection policy and heap size. We recommend using a parallel garbage collection algorithm to smooth out latency and minimise large GC pauses. - By default HornetQ runs in a maximum of 1GiB of RAM. To increase the memory settings + By default ActiveMQ runs in a maximum of 1GiB of RAM. To increase the memory settings change the -Xms and -Xmx memory settings as you would for any Java program. If you wish to add any more JVM arguments or tune the existing ones, the run scripts @@ -91,7 +91,7 @@
System properties - HornetQ can take a system property on the command line for configuring logging. + ActiveMQ can take a system property on the command line for configuring logging. For more information on configuring logging, please see .
@@ -101,31 +101,31 @@ by default) references the specific broker configuration files.
- hornetq-configuration.xml. This is the main HornetQ + activemq-configuration.xml. This is the main ActiveMQ configuration file. All the parameters in this file are described in . Please see for more information on this file. - hornetq-queues.xml. This file contains predefined queues, + activemq-queues.xml. This file contains predefined queues, queue settings and security settings. The file is optional - all this - configuration can also live in hornetq-configuration.xml. In + configuration can also live in activemq-configuration.xml. In fact, the default configuration sets do not have a hornetq-queues.xml file. The purpose of allowing queues to be + >activemq-queues.xml file. The purpose of allowing queues to be configured in these files is to allow you to manage your queue configuration over many files instead of being forced to maintain it in a single file. There - can be many hornetq-queues.xml files on the classpath. All + can be many activemq-queues.xml files on the classpath. All will be loaded if found. - hornetq-users.xml HornetQ ships with a basic security + activemq-users.xml ActiveMQ ships with a basic security manager implementation which obtains user credentials from the hornetq-users.xml file. This file contains user, password and + >activemq-users.xml file. This file contains user, password and role information. For more information on security, please see . - hornetq-jms.xml The distro configuration by default + activemq-jms.xml The distro configuration by default includes a server side JMS service which mainly deploys JMS Queues, Topics and ConnectionFactorys from this file into JNDI. If you're not using JMS, or you don't need to deploy JMS objects on the server side, then you don't need this @@ -135,7 +135,7 @@ The property file-deployment-enabled in the hornetq-configuration.xml configuration when set to false means that + >activemq-configuration.xml configuration when set to false means that the other configuration files are not loaded. This is true by default. It is also possible to use system property substitution in all the configuration @@ -144,15 +144,15 @@ <connector name="netty"> <factory-class>org.apache.activemq.core.remoting.impl.netty.NettyConnectorFactory</factory-class> - <param key="host" value="${hornetq.remoting.netty.host:localhost}"/> - <param key="port" value="${hornetq.remoting.netty.port:5445}"/> + <param key="host" value="${activemq.remoting.netty.host:localhost}"/> + <param key="port" value="${activemq.remoting.netty.port:5445}"/> </connector> Here you can see we have replaced 2 values with system properties hornetq.remoting.netty.host and hornetq.remoting.netty.port. These values will be replaced by the value + >activemq.remoting.netty.host and activemq.remoting.netty.port. These values will be replaced by the value found in the system property if there is one, if not they default back to localhost or 5445 respectively. It is also possible to not supply a default. i.e. ${hornetq.remoting.netty.host}, however the system property + >${activemq.remoting.netty.host}, however the system property must be supplied in that case.
@@ -161,10 +161,10 @@ The bootstrap file is very simple. Let's take a look at an example: -<broker xmlns="http://hornetq.org/schema"> +<broker xmlns="http://activemq.org/schema"> - <file:core configuration="${hornetq.home}/config/stand-alone/non-clustered/hornetq-configuration.xml"></core> - <file:jms configuration="${hornetq.home}/config/stand-alone/non-clustered/hornetq-jms.xml"></jms> + <file:core configuration="${activemq.home}/config/stand-alone/non-clustered/activemq-configuration.xml"></core> + <file:jms configuration="${activemq.home}/config/stand-alone/non-clustered/activemq-jms.xml"></jms> <basic-security/> @@ -182,7 +182,7 @@ jms This deploys any JMS Objects such as JMS Queues, Topics and ConnectionFactory - instances from the hornetq-jms.xml file specified. It also + instances from the activemq-jms.xml file specified. It also provides a simple management API for manipulating JMS Objects. On the whole it just translates and delegates its work to the core server. If you don't need to deploy JMS Queues, Topics and ConnectionFactories from server side configuration @@ -197,10 +197,10 @@
The main configuration file. - The configuration for the HornetQ core server is contained in hornetq-configuration.xml. This is what the FileConfiguration bean uses + The configuration for the ActiveMQ core server is contained in activemq-configuration.xml. This is what the FileConfiguration bean uses to configure the messaging server. - There are many attributes which you can configure HornetQ. In most cases the defaults + There are many attributes which you can configure ActiveMQ. In most cases the defaults will do fine, in fact every attribute can be defaulted which means a file with a single empty configuration element is a valid configuration file. The different configuration will be explained throughout the manual or you can refer to the diff --git a/docs/user-manual/en/vertx-integration.xml b/docs/user-manual/en/vertx-integration.xml index 5a9ef9acf6..f9d8efc5d9 100644 --- a/docs/user-manual/en/vertx-integration.xml +++ b/docs/user-manual/en/vertx-integration.xml @@ -18,7 +18,7 @@ + %BOOK_ENTITIES; ]> @@ -26,13 +26,13 @@ Vert.x is a lightweight, high performance application platform for the JVM that's designed for modern mobile, web, and enterprise applications. Vert.x provides a distributed event bus that allows messages to be sent across vert.x instances and clients. You can now redirect and persist any vert.x messages - to HornetQ and route those messages to a specified vertx address by configuring HornetQ vertx incoming and outgoing + to ActiveMQ and route those messages to a specified vertx address by configuring ActiveMQ vertx incoming and outgoing vertx connector services.
Configuring a Vertx Incoming Connector Service - Vertx Incoming Connector services receive messages from vertx event bus and route them to a HornetQ queue. + Vertx Incoming Connector services receive messages from vertx event bus and route them to a ActiveMQ queue. Such a service can be configured as follows: <connector-service name="vertx-incoming-connector"> @@ -46,7 +46,7 @@ Shown are the required params for the connector service: - queue. The name of the HornetQ queue to send message to. + queue. The name of the ActiveMQ queue to send message to. As well as these required paramaters there are the following optional parameters @@ -61,7 +61,7 @@ quorum-size. The quorum size of the target vertx instance. - ha-group. The name of the ha-group of target vertx instance. Default is hornetq. + ha-group. The name of the ha-group of target vertx instance. Default is activemq. vertx-address. The vertx address to listen to. default is org.apache.activemq. @@ -71,7 +71,7 @@
Configuring a Vertx Outgoing Connector Service - Vertx Outgoing Connector services fetch vertx messages from a HornetQ queue and put them to vertx event bus. + Vertx Outgoing Connector services fetch vertx messages from a ActiveMQ queue and put them to vertx event bus. Such a service can be configured as follows: <connector-service name="vertx-outgoing-connector"> @@ -86,7 +86,7 @@ Shown are the required params for the connector service: - queue. The name of the HornetQ queue to fetch message from. + queue. The name of the ActiveMQ queue to fetch message from. As well as these required paramaters there are the following optional parameters @@ -101,7 +101,7 @@ quorum-size. The quorum size of the target vertx instance. - ha-group. The name of the ha-group of target vertx instance. Default is hornetq. + ha-group. The name of the ha-group of target vertx instance. Default is activemq. vertx-address. The vertx address to put messages to. default is org.apache.activemq. diff --git a/docs/user-manual/en/wildcard-routing.xml b/docs/user-manual/en/wildcard-routing.xml index 44f0f75953..9e5ff70be7 100644 --- a/docs/user-manual/en/wildcard-routing.xml +++ b/docs/user-manual/en/wildcard-routing.xml @@ -19,13 +19,13 @@ + %BOOK_ENTITIES; ]> Routing Messages With Wild Cards - HornetQ allows the routing of messages via wildcard addresses. + ActiveMQ allows the routing of messages via wildcard addresses. If a queue is created with an address of say queue.news.# then it will receive any messages sent to addresses that match this, for instance queue.news.europe or queue.news.usa or In JMS terminology this allows "topic hierarchies" to be created. To enable this functionality set the property wild-card-routing-enabled - in the hornetq-configuration.xml file to true. This is + in the activemq-configuration.xml file to true. This is true by default. For more information on the wild card syntax take a look at chapter, also see + %BOOK_ENTITIES; ]> - Understanding the HornetQ Wildcard Syntax - HornetQ uses a specific syntax for representing wildcards in security settings, + Understanding the ActiveMQ Wildcard Syntax + ActiveMQ uses a specific syntax for representing wildcards in security settings, address settings and when creating consumers. The syntax is similar to that used by AMQP. - A HornetQ wildcard expression contains words delimited by the character 'A ActiveMQ wildcard expression contains words delimited by the character '.' (full stop). The special characters '#' and '*' also have special meaning and can take the place of a word. diff --git a/docs/user-manual/pom.xml b/docs/user-manual/pom.xml index 1ba86e81c9..dfe1df01db 100644 --- a/docs/user-manual/pom.xml +++ b/docs/user-manual/pom.xml @@ -32,8 +32,8 @@ en - HornetQ_User_Manual - HornetQ User Manual + ActiveMQ_User_Manual + ActiveMQ User Manual diff --git a/examples/jms/activemq-jms-examples-common/common.css b/examples/jms/activemq-jms-examples-common/common.css index 333ea01bfd..453e0c92b8 100644 --- a/examples/jms/activemq-jms-examples-common/common.css +++ b/examples/jms/activemq-jms-examples-common/common.css @@ -1,5 +1,4 @@ body { - background: url(images/hornetQ-banner_final.png) top left no-repeat; } h1 { diff --git a/examples/jms/activemq-jms-examples-common/images/hornetQ-banner_final.png b/examples/jms/activemq-jms-examples-common/images/hornetQ-banner_final.png deleted file mode 100644 index 6388dff1f54ed19ddff7a755fd3957c839198734..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 109633 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