Remove references to HornetQ in doc and Comments
This commit is contained in:
parent
2fbd5d7356
commit
4a6b980fed
8
NOTICE
8
NOTICE
|
@ -1,14 +1,14 @@
|
|||
HornetQ
|
||||
ActiveMQ
|
||||
Copyright 2009 Red Hat, Inc. Licensed under the Apache License, version 2.0.
|
||||
Unless required by applicable law, HornetQ is distributed on
|
||||
Unless required by applicable law, ActiveMQ is distributed on
|
||||
an "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, either express or
|
||||
implied, including the implied warranties of TITLE, NON-INFRINGEMENT,
|
||||
MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
Certain portions of HornetQ are based on code made available
|
||||
Certain portions of ActiveMQ are based on code made available
|
||||
under the GNU Lesser General Public License, version 2.1 or later
|
||||
(http://www.fsf.org/licensing/licenses/lgpl.html).
|
||||
"JBoss" and "Red Hat" are trademarks of Red Hat, Inc. and/or its
|
||||
affiliates, registered in the U.S. and other countries. Your
|
||||
permissions under the licensing terms governing HornetQ do
|
||||
permissions under the licensing terms governing ActiveMQ do
|
||||
not include a license, express or implied, to any Red Hat trademark.
|
|
@ -18,12 +18,12 @@ Assuming current version is ``X.Y.Z-SNAPSHOT``
|
|||
|
||||
0. Update the release notes.
|
||||
1. Prepare a single commit changing all version tags in all pom's.
|
||||
2. tag this commit locally by 'git tag -a HornetQ_X_Y_Z_Final -m "release for x.y.z.Final' or what ever the version is
|
||||
2. tag this commit locally by 'git tag -a ActiveMQ_X_Y_Z_Final -m "release for x.y.z.Final' or what ever the version is
|
||||
3. remember to update the version in the main pom, think of a cool name if you can
|
||||
4. update the hornetq-maven-plugin plugin in the main pom to one that is released, if needed release a new version of the plugin.
|
||||
5. Either use ``git revert`` to create a new commit reverting the commit with the version changes. Or change again all versions to ``R.S.T-SNAPSHOT``.
|
||||
6. push both commits with version changes together, including them in the same _pull-request_.
|
||||
7. push the committed tag upstream 'git push upstream HornetQ_X_Y_Z_Final'
|
||||
7. push the committed tag upstream 'git push upstream ActiveMQ_X_Y_Z_Final'
|
||||
8. download and unpack the tag from github
|
||||
9. firstly upload the maven artifacts to the staged repository 'mvn -Pmaven-release deploy' (you will need the repository details in your settings.xml'
|
||||
10. go to nexus (https://repository.jboss.org/nexus/index.html), log in, select staging repositories, select the staging profile that you uploaded and close it.
|
||||
|
@ -55,7 +55,7 @@ If everything is ok then release by:
|
|||
|
||||
if there is a problem
|
||||
|
||||
1. delete the tag locally 'git tag -d HornetQ_X_Y_Z_Final"
|
||||
2. delete the tag remotely 'git push origin :refs/tags/HornetQ_X_Y_Z_Final"
|
||||
1. delete the tag locally 'git tag -d ActiveMQ_X_Y_Z_Final"
|
||||
2. delete the tag remotely 'git push origin :refs/tags/ActiveMQ_X_Y_Z_Final"
|
||||
3. go to nexus and drop the profile
|
||||
4. fix what's broken and start again
|
||||
|
|
|
@ -3,6 +3,6 @@
|
|||
| |_| |/ _ \| '__| '_ \ / _ \ __| | | |
|
||||
| _ | (_) | | | | | | __/ |_| |_| |
|
||||
|_| |_|\___/|_| |_| |_|\___|\__|\__\_\
|
||||
HornetQ ${project.version}
|
||||
ActiveMQ ${project.version}
|
||||
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
|
||||
This is a simple tutorial on compiling libHornetQLibAIO.so
|
||||
This is a simple tutorial on compiling libActiveMQLibAIO.so
|
||||
|
||||
DEPENDENCIES
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@ Copyright 2009 Red Hat, Inc.
|
|||
</head>
|
||||
|
||||
<body bgcolor="white">
|
||||
<h1>HornetQ Resource Adaptor</h1>
|
||||
<h1>ActiveMQ Resource Adaptor</h1>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -8,8 +8,8 @@
|
|||
<xsd:element name="server-in-vm-id" type="xsd:string" minOccurs="0" maxOccurs="1">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
The HornetQ REST implementation uses the IN-VM transport to communicate
|
||||
with HornetQ. It uses the default server id, which is "0".
|
||||
The ActiveMQ REST implementation uses the IN-VM transport to communicate
|
||||
with ActiveMQ. It uses the default server id, which is "0".
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
</xsd:element>
|
||||
|
@ -17,7 +17,7 @@
|
|||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
By default, all links (URLs) are published using custom headers.
|
||||
You can instead have the HornetQ REST implementation publish links
|
||||
You can instead have the ActiveMQ REST implementation publish links
|
||||
using the Link Header specification instead if you desire.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
|
@ -57,7 +57,7 @@
|
|||
<xsd:element name="producer-session-pool-size" type="xsd:int" minOccurs="0" maxOccurs="1">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
The REST implementation pools HornetQ sessions for sending messages.
|
||||
The REST implementation pools ActiveMQ sessions for sending messages.
|
||||
This is the size of the pool. That number of sessions will be created
|
||||
at startup time.
|
||||
</xsd:documentation>
|
||||
|
@ -90,8 +90,8 @@
|
|||
<xsd:element name="consumer-window-size" type="xsd:int" minOccurs="0" maxOccurs="1">
|
||||
<xsd:annotation>
|
||||
<xsd:documentation>
|
||||
For consumers, this config option is the same as the HornetQ one of the
|
||||
same name. It will be used by sessions created by the HornetQ REST
|
||||
For consumers, this config option is the same as the ActiveMQ one of the
|
||||
same name. It will be used by sessions created by the ActiveMQ REST
|
||||
implementation.
|
||||
</xsd:documentation>
|
||||
</xsd:annotation>
|
||||
|
|
|
@ -10,4 +10,4 @@
|
|||
## implied. See the License for the specific language governing
|
||||
## permissions and limitations under the License.
|
||||
## ---------------------------------------------------------------------------
|
||||
class=org.apache.activemq.spi.core.security.HornetQSecurityManagerImpl
|
||||
class=org.apache.activemq.spi.core.security.ActiveMQSecurityManagerImpl
|
|
@ -26,7 +26,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.journal.level=INFO
|
||||
logger.org.apache.activemq.utils.level=INFO
|
||||
|
|
|
@ -3,20 +3,20 @@
|
|||
<head>
|
||||
<meta content="text/html; charset=ISO-8859-1"
|
||||
http-equiv="content-type">
|
||||
<title>HornetQ 2.4.1.Final Release Notes</title>
|
||||
<title>ActiveMQ 2.4.1.Final Release Notes</title>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<h1>Release Notes - HornetQ - Version 2.4.1 Final</h1>
|
||||
<h1>Release Notes - ActiveMQ - Version 2.4.1 Final</h1>
|
||||
|
||||
<br>
|
||||
|
||||
<h2>22th January 2014</h2>
|
||||
|
||||
These are the release notes for HornetQ 2.4.1.Final<br><br>
|
||||
These are the release notes for ActiveMQ 2.4.1.Final<br><br>
|
||||
|
||||
For full description of the contents please see the
|
||||
<a href="https://issues.jboss.org/secure/ReleaseNote.jspa?version=12323863&styleName=Html&projectId=12310830&Create=Create&atl_token=AQZJ-FV3A-N91S-UDEU|b93a9de57630404d8d3e4728027e899036f5eaab|lout">HornetQ project JIRA</a>.<br><br>
|
||||
<a href="https://issues.jboss.org/secure/ReleaseNote.jspa?version=12323863&styleName=Html&projectId=12310830&Create=Create&atl_token=AQZJ-FV3A-N91S-UDEU|b93a9de57630404d8d3e4728027e899036f5eaab|lout">ActiveMQ project JIRA</a>.<br><br>
|
||||
|
||||
2.4.1.Final is a patch release built on 2.4.0.Final.
|
||||
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
-->
|
||||
|
||||
<!DOCTYPE authorgroup PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "HornetQ_Design_Guide.ent">
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "ActiveMQ_Design_Guide.ent">
|
||||
%BOOK_ENTITIES;
|
||||
]>
|
||||
<authorgroup>
|
||||
|
|
|
@ -13,17 +13,17 @@
|
|||
-->
|
||||
|
||||
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE bookinfo PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "HornetQ_Design_Guide.ent">
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "ActiveMQ_Design_Guide.ent">
|
||||
%BOOK_ENTITIES;
|
||||
]>
|
||||
<bookinfo id="HornetQ_QuickStart_Guide">
|
||||
<title>HornetQ Design Guide</title>
|
||||
<bookinfo id="ActiveMQ_QuickStart_Guide">
|
||||
<title>ActiveMQ Design Guide</title>
|
||||
<subtitle>Putting the buzz in messaging</subtitle>
|
||||
<productname>HornetQ</productname>
|
||||
<productname>ActiveMQ</productname>
|
||||
<edition>2.1.0</edition>
|
||||
<pubsnumber>1</pubsnumber>
|
||||
<abstract>
|
||||
<para>This Design guide is to help current and future developers how HornetQ's architectures are designed to
|
||||
<para>This Design guide is to help current and future developers how ActiveMQ's architectures are designed to
|
||||
help the future development and maintenance of the project</para>
|
||||
</abstract>
|
||||
<corpauthor>
|
||||
|
@ -32,7 +32,7 @@
|
|||
<imagedata fileref="images/hornetQ_logo_600px.png" format="PNG"/>
|
||||
</imageobject>
|
||||
<textobject>
|
||||
<phrase>HornetQ Logo</phrase>
|
||||
<phrase>ActiveMQ Logo</phrase>
|
||||
</textobject>
|
||||
</inlinemediaobject>
|
||||
</corpauthor>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<!ENTITY PRODUCT "HornetQ">
|
||||
<!ENTITY BOOKID "HornetQ_Design_Guide">
|
||||
<!ENTITY PRODUCT "ActiveMQ">
|
||||
<!ENTITY BOOKID "ActiveMQ_Design_Guide">
|
||||
<!ENTITY YEAR "2011">
|
||||
<!ENTITY HOLDER "Red Hat Inc.">
|
||||
<!ENTITY semi ";">
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
-->
|
||||
|
||||
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "HornetQ_Design_Guide.ent">
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "ActiveMQ_Design_Guide.ent">
|
||||
%BOOK_ENTITIES;
|
||||
|
||||
]>
|
||||
|
|
|
@ -14,11 +14,11 @@
|
|||
-->
|
||||
|
||||
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "HornetQ_Design_Guide.ent">
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "ActiveMQ_Design_Guide.ent">
|
||||
%BOOK_ENTITIES;
|
||||
]>
|
||||
|
||||
<chapter id="about">
|
||||
<title>About HornetQ</title>
|
||||
<para>What is HornetQ?</para>
|
||||
<title>About ActiveMQ</title>
|
||||
<para>What is ActiveMQ?</para>
|
||||
</chapter>
|
|
@ -18,7 +18,7 @@
|
|||
<!-- ============================================================================= -->
|
||||
|
||||
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "HornetQ_Design_Guide.ent">
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "ActiveMQ_Design_Guide.ent">
|
||||
%BOOK_ENTITIES;
|
||||
]>
|
||||
<chapter id="introduction">
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
-->
|
||||
|
||||
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "HornetQ_Design_Guide.ent">
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "ActiveMQ_Design_Guide.ent">
|
||||
%BOOK_ENTITIES;
|
||||
]>
|
||||
|
||||
|
|
|
@ -25,8 +25,8 @@
|
|||
|
||||
<properties>
|
||||
<translation>en</translation>
|
||||
<docname>HornetQ_Design_Guide</docname>
|
||||
<bookname>HornetQ Design Guide</bookname>
|
||||
<docname>ActiveMQ_Design_Guide</docname>
|
||||
<bookname>ActiveMQ Design Guide</bookname>
|
||||
</properties>
|
||||
|
||||
<repositories>
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
-->
|
||||
|
||||
<!DOCTYPE authorgroup PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "HornetQ_EAP_Manual.ent">
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "ActiveMQ_EAP_Manual.ent">
|
||||
%BOOK_ENTITIES;
|
||||
]>
|
||||
<authorgroup>
|
||||
|
|
|
@ -14,17 +14,17 @@
|
|||
|
||||
<!-- This document was created with Syntext Serna Free. -->
|
||||
<!DOCTYPE bookinfo PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "HornetQ_EAP_Manual.ent">
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "ActiveMQ_EAP_Manual.ent">
|
||||
%BOOK_ENTITIES;
|
||||
]>
|
||||
<bookinfo id="HornetQ_EAP_Manual">
|
||||
<title>HornetQ Eap Manual</title>
|
||||
<bookinfo id="ActiveMQ_EAP_Manual">
|
||||
<title>ActiveMQ Eap Manual</title>
|
||||
<subtitle>Putting the buzz in messaging</subtitle>
|
||||
<productname>HornetQ</productname>
|
||||
<productname>ActiveMQ</productname>
|
||||
<edition>2.1.0</edition>
|
||||
<pubsnumber>1</pubsnumber>
|
||||
<abstract>
|
||||
<para>This is a guide to using HornetQ within EAP</para>
|
||||
<para>This is a guide to using ActiveMQ within EAP</para>
|
||||
</abstract>
|
||||
<corpauthor>
|
||||
<inlinemediaobject>
|
||||
|
@ -32,7 +32,7 @@
|
|||
<imagedata fileref="images/hornetQ_logo_600px.png" format="PNG"/>
|
||||
</imageobject>
|
||||
<textobject>
|
||||
<phrase>HornetQ Logo</phrase>
|
||||
<phrase>ActiveMQ Logo</phrase>
|
||||
</textobject>
|
||||
</inlinemediaobject>
|
||||
</corpauthor>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<!ENTITY PRODUCT "HornetQ">
|
||||
<!ENTITY BOOKID "HornetQ_EAP_Manual">
|
||||
<!ENTITY PRODUCT "ActiveMQ">
|
||||
<!ENTITY BOOKID "ActiveMQ_EAP_Manual">
|
||||
<!ENTITY YEAR "2011">
|
||||
<!ENTITY HOLDER "Red Hat Inc.">
|
||||
<!ENTITY semi ";">
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
<!-- This document was created with Syntext Serna Free. -->
|
||||
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "HornetQ_EAP_Manual.ent">
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "ActiveMQ_EAP_Manual.ent">
|
||||
%BOOK_ENTITIES;
|
||||
|
||||
]>
|
||||
|
|
|
@ -14,14 +14,14 @@
|
|||
-->
|
||||
|
||||
<chapter id="clusters">
|
||||
<title>HornetQ and EAP Cluster Configuration</title>
|
||||
<title>ActiveMQ and EAP Cluster Configuration</title>
|
||||
<section>
|
||||
<title>Configuring Failover</title>
|
||||
<para>
|
||||
This chapter explains how to configure HornetQ within EAP with live backup-groups. Currently in this version
|
||||
HornetQ only supports shared store for backup nodes so we assume that in the rest of this chapter.
|
||||
This chapter explains how to configure ActiveMQ within EAP with live backup-groups. Currently in this version
|
||||
ActiveMQ only supports shared store for backup nodes so we assume that in the rest of this chapter.
|
||||
</para>
|
||||
<para>There are 2 main ways to configure HornetQ servers to have a backup server:</para>
|
||||
<para>There are 2 main ways to configure ActiveMQ servers to have a backup server:</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>Colocated. This is when an EAP instance has both a live and backup(s) running.</para>
|
||||
|
@ -206,7 +206,7 @@
|
|||
are created from the Journal when the backup server becomes live.
|
||||
</para>
|
||||
<para>
|
||||
Firstly we need to define a new HornetQ Server that EAP will deploy. We do this by creating a new
|
||||
Firstly we need to define a new ActiveMQ Server that EAP will deploy. We do this by creating a new
|
||||
<literal>hornetq-jboss-beans.xml</literal>
|
||||
configuration. We will place this under a new directory
|
||||
<literal>hornetq-backup1</literal>
|
||||
|
@ -228,7 +228,7 @@
|
|||
|
||||
|
||||
<!-- The core server -->
|
||||
<bean name="BackupHornetQServer" class="org.apache.activemq.core.server.impl.HornetQServerImpl">
|
||||
<bean name="BackupActiveMQServer" class="org.apache.activemq.core.server.impl.ActiveMQServerImpl">
|
||||
<constructor>
|
||||
<parameter>
|
||||
<inject bean="BackupConfiguration"/>
|
||||
|
@ -237,7 +237,7 @@
|
|||
<inject bean="MBeanServer"/>
|
||||
</parameter>
|
||||
<parameter>
|
||||
<inject bean="HornetQSecurityManager"/>
|
||||
<inject bean="ActiveMQSecurityManager"/>
|
||||
</parameter>
|
||||
</constructor>
|
||||
<start ignored="true"/>
|
||||
|
@ -248,7 +248,7 @@
|
|||
<bean name="BackupJMSServerManager" class="org.apache.activemq.jms.server.impl.JMSServerManagerImpl">
|
||||
<constructor>
|
||||
<parameter>
|
||||
<inject bean="BackupHornetQServer"/>
|
||||
<inject bean="BackupActiveMQServer"/>
|
||||
</parameter>
|
||||
</constructor>
|
||||
</bean>
|
||||
|
@ -263,7 +263,7 @@
|
|||
server which we will place in the same directory.
|
||||
</para>
|
||||
<para>
|
||||
After that we just configure a new HornetQ Server and JMS server.
|
||||
After that we just configure a new ActiveMQ Server and JMS server.
|
||||
</para>
|
||||
<note>
|
||||
<para>
|
||||
|
@ -386,7 +386,7 @@
|
|||
The second thing you can see is we have added a
|
||||
<literal>jmx-domain</literal>
|
||||
attribute, this is used when
|
||||
adding objects, such as the HornetQ server and JMS server to jmx, we change this from the default
|
||||
adding objects, such as the ActiveMQ server and JMS server to jmx, we change this from the default
|
||||
<literal>org.apache.activemq</literal>
|
||||
to avoid naming clashes with the live server
|
||||
</para>
|
||||
|
@ -429,7 +429,7 @@
|
|||
</para>
|
||||
<para>
|
||||
The Broadcast groups, Discovery group and cluster configurations are as per normal, details of these
|
||||
can be found in the HornetQ user manual.
|
||||
can be found in the ActiveMQ user manual.
|
||||
</para>
|
||||
<note>
|
||||
<para>notice the commented out <literal>max-hops</literal> in the cluster connection, set this to 0 if
|
||||
|
@ -480,7 +480,7 @@
|
|||
<graphic fileref="images/simple-dedicated.jpg" align="center" format="jpg" scale="30"/>
|
||||
</para>
|
||||
<para>
|
||||
Here you can see how this works with remote JMS clients. Once failover occurs the HornetQ backup Server takes
|
||||
Here you can see how this works with remote JMS clients. Once failover occurs the ActiveMQ backup Server takes
|
||||
running within another eap instance takes over as live.
|
||||
</para>
|
||||
<para>
|
||||
|
@ -495,7 +495,7 @@
|
|||
makes no sense to host any applications in it. However you can host applications on the server running the live
|
||||
hornetq server. If failure occurs to an live hornetq server then remote jms clients will failover as previously
|
||||
explained however what happens to any messages meant for or sent from JEE components. Well when the backup comes
|
||||
live, messages will be distributed to and from the backup server over HornetQ cluster connections and handled
|
||||
live, messages will be distributed to and from the backup server over ActiveMQ cluster connections and handled
|
||||
appropriately.
|
||||
</para>
|
||||
<para>
|
||||
|
@ -506,7 +506,7 @@
|
|||
<graphic fileref="images/simple-dedicated-jca-remote.jpg" align="center" format="jpg" scale="30"/>
|
||||
</para>
|
||||
<para>
|
||||
Here you can see that all the Application (via JCA) will be serviced by a HornetQ server in its own eap instance.
|
||||
Here you can see that all the Application (via JCA) will be serviced by a ActiveMQ server in its own eap instance.
|
||||
</para>
|
||||
<section>
|
||||
<title>Configuration of dedicated Live and backup</title>
|
||||
|
|
|
@ -25,8 +25,8 @@
|
|||
|
||||
<properties>
|
||||
<translation>en</translation>
|
||||
<docname>HornetQ_EAP_Manual</docname>
|
||||
<bookname>HornetQ EAP Manual</bookname>
|
||||
<docname>ActiveMQ_EAP_Manual</docname>
|
||||
<bookname>ActiveMQ EAP Manual</bookname>
|
||||
</properties>
|
||||
|
||||
<repositories>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<!DOCTYPE authorgroup PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "HornetQ_QuickStart_Guide.ent">
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "ActiveMQ_QuickStart_Guide.ent">
|
||||
%BOOK_ENTITIES;
|
||||
]>
|
||||
<authorgroup>
|
||||
|
|
|
@ -1,16 +1,16 @@
|
|||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<!-- This document was created with Syntext Serna Free. --><!DOCTYPE bookinfo PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "HornetQ_QuickStart_Guide.ent">
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "ActiveMQ_QuickStart_Guide.ent">
|
||||
%BOOK_ENTITIES;
|
||||
]>
|
||||
<bookinfo id="HornetQ_QuickStart_Guide">
|
||||
<title>HornetQ QuickStart Guide</title>
|
||||
<bookinfo id="ActiveMQ_QuickStart_Guide">
|
||||
<title>ActiveMQ QuickStart Guide</title>
|
||||
<subtitle>Putting the buzz in messaging</subtitle>
|
||||
<productname>HornetQ</productname>
|
||||
<productname>ActiveMQ</productname>
|
||||
<edition>2.1.0</edition>
|
||||
<pubsnumber>1</pubsnumber>
|
||||
<abstract>
|
||||
<para>This Quickstart guide will help you get HornetQ up and running in a few minutes and will explain the basics needed
|
||||
<para>This Quickstart guide will help you get ActiveMQ up and running in a few minutes and will explain the basics needed
|
||||
to get started.</para>
|
||||
</abstract>
|
||||
<corpauthor>
|
||||
|
@ -19,7 +19,7 @@
|
|||
<imagedata fileref="images/hornetQ_logo_600px.png" format="PNG"/>
|
||||
</imageobject>
|
||||
<textobject>
|
||||
<phrase>HornetQ Logo</phrase>
|
||||
<phrase>ActiveMQ Logo</phrase>
|
||||
</textobject>
|
||||
</inlinemediaobject>
|
||||
</corpauthor>
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<!ENTITY PRODUCT "HornetQ">
|
||||
<!ENTITY BOOKID "HornetQ_QuickStart_Guide">
|
||||
<!ENTITY PRODUCT "ActiveMQ">
|
||||
<!ENTITY BOOKID "ActiveMQ_QuickStart_Guide">
|
||||
<!ENTITY YEAR "2011">
|
||||
<!ENTITY HOLDER "Red Hat Inc.">
|
||||
<!ENTITY semi ";">
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
|
||||
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "HornetQ_QuickStart_Guide.ent">
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "ActiveMQ_QuickStart_Guide.ent">
|
||||
%BOOK_ENTITIES;
|
||||
|
||||
]>
|
||||
|
|
|
@ -19,32 +19,32 @@
|
|||
<!-- ============================================================================= -->
|
||||
|
||||
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "HornetQ_QuickStart_Guide.ent">
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "ActiveMQ_QuickStart_Guide.ent">
|
||||
%BOOK_ENTITIES;
|
||||
]>
|
||||
|
||||
<chapter id="about">
|
||||
<title>About HornetQ</title>
|
||||
<para>What is HornetQ?</para>
|
||||
<title>About ActiveMQ</title>
|
||||
<para>What is ActiveMQ?</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>HornetQ is an open source project to build a multi-protocol, embeddable, very high
|
||||
<para>ActiveMQ is an open source project to build a multi-protocol, embeddable, very high
|
||||
performance, clustered, asynchronous messaging system.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>For answers to more questions about what HornetQ is and what it isn't please visit
|
||||
the <ulink url="http://www.jboss.org/community/wiki/HornetQGeneralFAQs">FAQs wiki
|
||||
<para>For answers to more questions about what ActiveMQ is and what it isn't please visit
|
||||
the <ulink url="http://www.jboss.org/community/wiki/ActiveMQGeneralFAQs">FAQs wiki
|
||||
page</ulink>.</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
<para>Why use HornetQ? Here are just a few of the reasons:</para>
|
||||
<para>Why use ActiveMQ? Here are just a few of the reasons:</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>100% open source software. HornetQ is licenced using the Apache Software License v2.0
|
||||
<para>100% open source software. ActiveMQ is licenced using the Apache Software License v2.0
|
||||
to minimise barriers to adoption.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>HornetQ is designed with usability in mind.</para>
|
||||
<para>ActiveMQ is designed with usability in mind.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>Written in Java. Runs on any platform with a Java 6+ runtime, that's everything
|
||||
|
@ -60,7 +60,7 @@
|
|||
and others you won't find anywhere else.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>Elegant, clean-cut design with minimal third party dependencies. Run HornetQ
|
||||
<para>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.</para>
|
||||
</listitem>
|
||||
|
@ -77,7 +77,7 @@
|
|||
</listitem>
|
||||
<listitem>
|
||||
<para>For a full list of features, please see the <ulink
|
||||
url="http://www.jboss.org/community/wiki/HornetQFeatures">features wiki
|
||||
url="http://www.jboss.org/community/wiki/ActiveMQFeatures">features wiki
|
||||
page</ulink> .</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
|
|
|
@ -18,12 +18,12 @@
|
|||
<!-- ============================================================================= -->
|
||||
|
||||
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "HornetQ_QuickStart_Guide.ent">
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "ActiveMQ_QuickStart_Guide.ent">
|
||||
%BOOK_ENTITIES;
|
||||
]>
|
||||
<chapter id="download">
|
||||
<title>Download</title>
|
||||
<para>The official HornetQ project page is <ulink url="http://hornetq.org/"
|
||||
<para>The official ActiveMQ project page is <ulink url="http://hornetq.org/"
|
||||
>http://hornetq.org/</ulink>.</para>
|
||||
<section id="download.software">
|
||||
<title>Software Download</title>
|
||||
|
@ -37,7 +37,7 @@
|
|||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>Please take a look at our project <ulink
|
||||
url="http://www.jboss.org/community/wiki/HornetQ">wiki</ulink></para>
|
||||
url="http://www.jboss.org/community/wiki/ActiveMQ">wiki</ulink></para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>If you have any user questions please use our <ulink
|
||||
|
@ -60,7 +60,7 @@
|
|||
<para>Follow us on <ulink url="http://twitter.com/hornetq">twitter</ulink></para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>HornetQ Git repository is <ulink
|
||||
<para>ActiveMQ Git repository is <ulink
|
||||
url="https://github.com/hornetq/hornetq"
|
||||
>https://github.com/hornetq/hornetq</ulink></para>
|
||||
</listitem>
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
<!-- ============================================================================= -->
|
||||
|
||||
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "HornetQ_QuickStart_Guide.ent">
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "ActiveMQ_QuickStart_Guide.ent">
|
||||
%BOOK_ENTITIES;
|
||||
]>
|
||||
<chapter id="examples">
|
||||
|
@ -66,7 +66,7 @@
|
|||
[INFO] Scanning for projects...
|
||||
[INFO]
|
||||
[INFO] ------------------------------------------------------------------------
|
||||
[INFO] Building HornetQ JMS Queue Example 2.3.0.BETA-SNAPSHOT
|
||||
[INFO] Building ActiveMQ JMS Queue Example 2.3.0.BETA-SNAPSHOT
|
||||
[INFO] ------------------------------------------------------------------------
|
||||
[INFO]
|
||||
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ hornetq-jms-queue-example ---
|
||||
|
@ -106,29 +106,29 @@
|
|||
[file:/home/andy/projects/hornetq-master/examples/jms/queue/target/classes/hornetq/server0/]
|
||||
Apr 17, 2013 10:51:01 AM org.apache.activemq.core.deployers.impl.FileConfigurationParser parseMainConfig
|
||||
WARN: HQ222018: AIO was not located on this platform, it will fall back to using pure Java NIO. If your platform is Linux, install LibAIO to enable the AIO journal
|
||||
Apr 17, 2013 10:51:01 AM org.apache.activemq.core.server.impl.HornetQServerImpl start
|
||||
INFO: HQ221000: live server is starting with configuration HornetQ Configuration (clustered=false,backup=false,sharedStore=true,journalDirectory=/home/andy/projects/hornetq-master/examples/jms/queue/target//server0/data/messaging/journal,bindingsDirectory=/home/andy/projects/hornetq-master/examples/jms/queue/target//server0/data/messaging/bindings,largeMessagesDirectory=/home/andy/projects/hornetq-master/examples/jms/queue/target//server0/data/messaging/largemessages,pagingDirectory=/home/andy/projects/hornetq-master/examples/jms/queue/target//server0/data/messaging/paging)
|
||||
Apr 17, 2013 10:51:01 AM org.apache.activemq.core.server.impl.HornetQServerImpl$SharedStoreLiveActivation run
|
||||
Apr 17, 2013 10:51:01 AM org.apache.activemq.core.server.impl.ActiveMQServerImpl start
|
||||
INFO: HQ221000: live server is starting with configuration ActiveMQ Configuration (clustered=false,backup=false,sharedStore=true,journalDirectory=/home/andy/projects/hornetq-master/examples/jms/queue/target//server0/data/messaging/journal,bindingsDirectory=/home/andy/projects/hornetq-master/examples/jms/queue/target//server0/data/messaging/bindings,largeMessagesDirectory=/home/andy/projects/hornetq-master/examples/jms/queue/target//server0/data/messaging/largemessages,pagingDirectory=/home/andy/projects/hornetq-master/examples/jms/queue/target//server0/data/messaging/paging)
|
||||
Apr 17, 2013 10:51:01 AM org.apache.activemq.core.server.impl.ActiveMQServerImpl$SharedStoreLiveActivation run
|
||||
INFO: HQ221006: Waiting to obtain live lock
|
||||
Apr 17, 2013 10:51:01 AM org.apache.activemq.core.persistence.impl.journal.JournalStorageManager <init>
|
||||
INFO: HQ221013: Using NIO Journal
|
||||
Apr 17, 2013 10:51:01 AM org.apache.activemq.core.server.impl.HornetQServerImpl initialisePart1
|
||||
WARN: HQ222007: Security risk! HornetQ is running with the default cluster admin user and default password. Please see the HornetQ user guide, cluster chapter, for instructions on how to change this.
|
||||
Apr 17, 2013 10:51:01 AM org.apache.activemq.core.server.impl.ActiveMQServerImpl initialisePart1
|
||||
WARN: HQ222007: Security risk! ActiveMQ is running with the default cluster admin user and default password. Please see the ActiveMQ user guide, cluster chapter, for instructions on how to change this.
|
||||
Apr 17, 2013 10:51:01 AM org.apache.activemq.core.server.impl.FileLockNodeManager startLiveNode
|
||||
INFO: HQ221034: Waiting to obtain live lock
|
||||
Apr 17, 2013 10:51:01 AM org.apache.activemq.core.server.impl.FileLockNodeManager startLiveNode
|
||||
INFO: HQ221035: Live Server Obtained live lock
|
||||
Apr 17, 2013 10:51:02 AM org.apache.activemq.core.server.impl.HornetQServerImpl deployQueue
|
||||
Apr 17, 2013 10:51:02 AM org.apache.activemq.core.server.impl.ActiveMQServerImpl deployQueue
|
||||
INFO: HQ221003: trying to deploy queue jms.queue.exampleQueue
|
||||
Apr 17, 2013 10:51:02 AM org.apache.activemq.core.remoting.impl.netty.NettyAcceptor start
|
||||
INFO: HQ221020: Started Netty Acceptor version 3.6.2.Final-c0d783c localhost:5445 for CORE protocol
|
||||
Apr 17, 2013 10:51:02 AM org.apache.activemq.core.server.impl.HornetQServerImpl$SharedStoreLiveActivation run
|
||||
Apr 17, 2013 10:51:02 AM org.apache.activemq.core.server.impl.ActiveMQServerImpl$SharedStoreLiveActivation run
|
||||
INFO: HQ221007: Server is now live
|
||||
Apr 17, 2013 10:51:02 AM org.apache.activemq.core.server.impl.HornetQServerImpl start
|
||||
INFO: HQ221001: HornetQ Server version 2.3.0.SNAPSHOT (black'n'yellow, 123) [a57893ff-7783-11e2-9787-07ca142fc9f7]
|
||||
Apr 17, 2013 10:51:02 AM org.apache.activemq.core.server.impl.ActiveMQServerImpl start
|
||||
INFO: HQ221001: ActiveMQ Server version 2.3.0.SNAPSHOT (black'n'yellow, 123) [a57893ff-7783-11e2-9787-07ca142fc9f7]
|
||||
[INFO]
|
||||
[INFO] --- hornetq-maven-plugin:1.1.1-SNAPSHOT:runClient (runClient) @ hornetq-jms-queue-example ---
|
||||
Apr 17, 2013 10:51:02 AM org.apache.activemq.common.example.HornetQExample getContext
|
||||
Apr 17, 2013 10:51:02 AM org.apache.activemq.common.example.ActiveMQExample getContext
|
||||
INFO: using jnp://localhost:1099 for jndi
|
||||
Sent message: This is a text message
|
||||
Received message: This is a text message
|
||||
|
@ -141,8 +141,8 @@ example complete
|
|||
[INFO] --- hornetq-maven-plugin:1.1.1-SNAPSHOT:stop (stop) @ hornetq-jms-queue-example ---
|
||||
Apr 17, 2013 10:51:03 AM org.apache.activemq.core.server.management.impl.ManagementServiceImpl stop
|
||||
WARN: HQ222113: On ManagementService stop, there are 1 unexpected registered MBeans: [core.acceptor.netty-acceptor]
|
||||
Apr 17, 2013 10:51:03 AM org.apache.activemq.core.server.impl.HornetQServerImpl stop
|
||||
INFO: HQ221002: HornetQ Server version 2.3.0.SNAPSHOT (black'n'yellow, 123) [a57893ff-7783-11e2-9787-07ca142fc9f7] stopped
|
||||
Apr 17, 2013 10:51:03 AM org.apache.activemq.core.server.impl.ActiveMQServerImpl stop
|
||||
INFO: HQ221002: ActiveMQ Server version 2.3.0.SNAPSHOT (black'n'yellow, 123) [a57893ff-7783-11e2-9787-07ca142fc9f7] stopped
|
||||
[INFO] ------------------------------------------------------------------------
|
||||
[INFO] BUILD SUCCESS
|
||||
[INFO] ------------------------------------------------------------------------
|
||||
|
@ -152,7 +152,7 @@ INFO: HQ221002: HornetQ Server version 2.3.0.SNAPSHOT (black'n'yellow, 123) [a57
|
|||
[INFO] ------------------------------------------------------------------------
|
||||
|
||||
</programlisting>
|
||||
<para>Congratulations! You have successfully run your first HornetQ example. Try some of the
|
||||
<para>Congratulations! You have successfully run your first ActiveMQ example. Try some of the
|
||||
others.</para>
|
||||
</section>
|
||||
<section id="examples.messaging">
|
||||
|
@ -172,7 +172,7 @@ INFO: HQ221002: HornetQ Server version 2.3.0.SNAPSHOT (black'n'yellow, 123) [a57
|
|||
[INFO] Scanning for projects...
|
||||
[INFO]
|
||||
[INFO] ------------------------------------------------------------------------
|
||||
[INFO] Building HornetQ JEE MDB Example 2.3.0.BETA-SNAPSHOT
|
||||
[INFO] Building ActiveMQ JEE MDB Example 2.3.0.BETA-SNAPSHOT
|
||||
[INFO] ------------------------------------------------------------------------
|
||||
[INFO]
|
||||
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ hornetq-jee-mdb-bmt-example ---
|
||||
|
@ -235,8 +235,8 @@ INFO: Starting container with: [/home/andy/devtools/jdk1.6.0_25//bin/java, -Djbo
|
|||
10:58:05,831 INFO [org.jboss.ws.common.management.AbstractServerConfig] (MSC service thread 1-4) JBoss Web Services - Stack CXF Server 4.0.2.GA
|
||||
10:58:05,943 INFO [org.apache.coyote.http11.Http11Protocol] (MSC service thread 1-6) Starting Coyote HTTP/1.1 on http-localhost.localdomain-127.0.0.1-8080
|
||||
10:58:05,966 INFO [org.jboss.as.jacorb] (MSC service thread 1-2) JBAS016330: CORBA ORB Service started
|
||||
10:58:05,988 INFO [org.apache.activemq.core.server.impl.HornetQServerImpl] (MSC service thread 1-11) live server is starting with configuration HornetQ Configuration (clustered=false,backup=false,sharedStore=true,journalDirectory=/home/andy/projects/hornetq-master/examples/javaee/mdb-bmt/target/jbossas-node0/standalone/data/messagingjournal,bindingsDirectory=/home/andy/projects/hornetq-master/examples/javaee/mdb-bmt/target/jbossas-node0/standalone/data/messagingbindings,largeMessagesDirectory=/home/andy/projects/hornetq-master/examples/javaee/mdb-bmt/target/jbossas-node0/standalone/data/messaginglargemessages,pagingDirectory=/home/andy/projects/hornetq-master/examples/javaee/mdb-bmt/target/jbossas-node0/standalone/data/messagingpaging)
|
||||
10:58:05,996 INFO [org.apache.activemq.core.server.impl.HornetQServerImpl] (MSC service thread 1-11) Waiting to obtain live lock
|
||||
10:58:05,988 INFO [org.apache.activemq.core.server.impl.ActiveMQServerImpl] (MSC service thread 1-11) live server is starting with configuration ActiveMQ Configuration (clustered=false,backup=false,sharedStore=true,journalDirectory=/home/andy/projects/hornetq-master/examples/javaee/mdb-bmt/target/jbossas-node0/standalone/data/messagingjournal,bindingsDirectory=/home/andy/projects/hornetq-master/examples/javaee/mdb-bmt/target/jbossas-node0/standalone/data/messagingbindings,largeMessagesDirectory=/home/andy/projects/hornetq-master/examples/javaee/mdb-bmt/target/jbossas-node0/standalone/data/messaginglargemessages,pagingDirectory=/home/andy/projects/hornetq-master/examples/javaee/mdb-bmt/target/jbossas-node0/standalone/data/messagingpaging)
|
||||
10:58:05,996 INFO [org.apache.activemq.core.server.impl.ActiveMQServerImpl] (MSC service thread 1-11) Waiting to obtain live lock
|
||||
10:58:06,037 INFO [org.apache.activemq.core.persistence.impl.journal.JournalStorageManager] (MSC service thread 1-11) Using AIO Journal
|
||||
10:58:06,122 INFO [org.jboss.as.jacorb] (MSC service thread 1-14) JBAS016328: CORBA Naming Service started
|
||||
10:58:06,184 INFO [org.jboss.as.connector.subsystems.datasources] (MSC service thread 1-7) JBAS010400: Bound data source [java:jboss/datasources/ExampleDS]
|
||||
|
@ -247,16 +247,16 @@ INFO: Starting container with: [/home/andy/devtools/jdk1.6.0_25//bin/java, -Djbo
|
|||
10:58:06,436 INFO [org.jboss.as.server.deployment.scanner] (MSC service thread 1-16) JBAS015012: Started FileSystemDeploymentService for directory /home/andy/projects/hornetq-master/examples/javaee/mdb-bmt/target/jbossas-node0/standalone/deployments
|
||||
10:58:08,790 INFO [org.apache.activemq.core.remoting.impl.netty.NettyAcceptor] (MSC service thread 1-11) Started Netty Acceptor version 3.2.5.Final-a96d88c localhost.localdomain:5445 for CORE protocol
|
||||
10:58:08,793 INFO [org.apache.activemq.core.remoting.impl.netty.NettyAcceptor] (MSC service thread 1-11) Started Netty Acceptor version 3.2.5.Final-a96d88c localhost.localdomain:5455 for CORE protocol
|
||||
10:58:08,795 INFO [org.apache.activemq.core.server.impl.HornetQServerImpl] (MSC service thread 1-11) Server is now live
|
||||
10:58:08,797 INFO [org.apache.activemq.core.server.impl.HornetQServerImpl] (MSC service thread 1-11) HornetQ Server version 2.2.13.Final (HQ_2_2_13_FINAL_AS7, 122) [5c499e88-9c63-11e2-bfa3-fe5400591699]) started
|
||||
10:58:08,795 INFO [org.apache.activemq.core.server.impl.ActiveMQServerImpl] (MSC service thread 1-11) Server is now live
|
||||
10:58:08,797 INFO [org.apache.activemq.core.server.impl.ActiveMQServerImpl] (MSC service thread 1-11) ActiveMQ Server version 2.2.13.Final (HQ_2_2_13_FINAL_AS7, 122) [5c499e88-9c63-11e2-bfa3-fe5400591699]) started
|
||||
10:58:08,822 INFO [org.jboss.as.messaging] (MSC service thread 1-4) JBAS011601: Bound messaging object to jndi name java:jboss/exported/jms/RemoteConnectionFactory
|
||||
10:58:08,824 INFO [org.jboss.as.messaging] (MSC service thread 1-4) JBAS011601: Bound messaging object to jndi name java:/RemoteConnectionFactory
|
||||
10:58:08,825 INFO [org.jboss.as.messaging] (MSC service thread 1-10) JBAS011601: Bound messaging object to jndi name java:/ConnectionFactory
|
||||
10:58:08,830 INFO [org.apache.activemq.core.server.impl.HornetQServerImpl] (MSC service thread 1-3) trying to deploy queue jms.queue.testQueue
|
||||
10:58:08,830 INFO [org.apache.activemq.core.server.impl.ActiveMQServerImpl] (MSC service thread 1-3) trying to deploy queue jms.queue.testQueue
|
||||
10:58:08,836 INFO [org.jboss.as.messaging] (MSC service thread 1-3) JBAS011601: Bound messaging object to jndi name java:/queue/test
|
||||
10:58:08,840 INFO [org.jboss.as.messaging] (MSC service thread 1-3) JBAS011601: Bound messaging object to jndi name java:jboss/exported/jms/queues/testQueue
|
||||
10:58:08,859 INFO [org.jboss.as.deployment.connector] (MSC service thread 1-9) JBAS010406: Registered connection factory java:/JmsXA
|
||||
10:58:08,866 INFO [org.apache.activemq.ra.HornetQResourceAdapter] (MSC service thread 1-9) HornetQ resource adaptor started
|
||||
10:58:08,866 INFO [org.apache.activemq.ra.ActiveMQResourceAdapter] (MSC service thread 1-9) ActiveMQ resource adaptor started
|
||||
10:58:08,867 INFO [org.jboss.as.connector.services.ResourceAdapterActivatorService$ResourceAdapterActivator] (MSC service thread 1-9) IJ020002: Deployed: file://RaActivatorhornetq-ra
|
||||
10:58:08,870 INFO [org.jboss.as.deployment.connector] (MSC service thread 1-5) JBAS010401: Bound JCA ConnectionFactory [java:/JmsXA]
|
||||
10:58:08,898 INFO [org.jboss.as.server.deployment] (MSC service thread 1-10) JBAS015876: Starting deployment of "ONT001-1.0.war"
|
||||
|
@ -303,8 +303,8 @@ mdb.jar:
|
|||
10:58:12,562 INFO [org.jboss.as.server] (management-handler-thread - 3) JBAS018559: Deployed "mdb.jar"
|
||||
Sent message: This is a text message
|
||||
10:58:13,229 INFO [org.jboss.as.naming] (Remoting "localhost" task-3) JBAS011806: Channel end notification received, closing channel Channel ID 57be4578 (inbound) of Remoting connection 3ac552d5 to /127.0.0.1:58571
|
||||
10:58:13,255 INFO [stdout] (Thread-0 (HornetQ-client-global-threads-1402019528)) message This is a text message received
|
||||
10:58:13,257 INFO [stdout] (Thread-0 (HornetQ-client-global-threads-1402019528)) we're in the middle of a transaction: org.jboss.tm.usertx.client.ServerVMClientUserTransaction@6b04d3c8
|
||||
10:58:13,255 INFO [stdout] (Thread-0 (ActiveMQ-client-global-threads-1402019528)) message This is a text message received
|
||||
10:58:13,257 INFO [stdout] (Thread-0 (ActiveMQ-client-global-threads-1402019528)) we're in the middle of a transaction: org.jboss.tm.usertx.client.ServerVMClientUserTransaction@6b04d3c8
|
||||
10:58:14,292 INFO [org.jboss.as.server.deployment] (MSC service thread 1-5) JBAS015877: Stopped deployment mdb.jar in 33ms
|
||||
10:58:14,413 INFO [org.jboss.as.repository] (management-handler-thread - 1) JBAS014901: Content removed from location /home/andy/projects/hornetq-master/examples/javaee/mdb-bmt/target/jbossas-node0/standalone/data/content/59/7dcdb0f420ed57aea638b2599f7a86eecf6c85/content
|
||||
10:58:14,415 INFO [org.jboss.as.server] (management-handler-thread - 1) JBAS018558: Undeployed "mdb.jar"
|
||||
|
|
|
@ -18,21 +18,21 @@
|
|||
<!-- ============================================================================= -->
|
||||
|
||||
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "HornetQ_QuickStart_Guide.ent">
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "ActiveMQ_QuickStart_Guide.ent">
|
||||
%BOOK_ENTITIES;
|
||||
]>
|
||||
<chapter id="installation">
|
||||
<title>Installation</title>
|
||||
<para>This section describes how to install HornetQ. </para>
|
||||
<para>This section describes how to install ActiveMQ. </para>
|
||||
<section id="installation.prerequisites">
|
||||
<title>Prerequisites</title>
|
||||
<note>
|
||||
<para>HornetQ only runs on Java 7 or later.</para>
|
||||
<para>ActiveMQ only runs on Java 7 or later.</para>
|
||||
</note>
|
||||
<para>By default, HornetQ server runs with 1GiB of memory. If your computer has less memory,
|
||||
<para>By default, ActiveMQ server runs with 1GiB of memory. If your computer has less memory,
|
||||
or you want to run it with more available RAM, modify the value in <literal
|
||||
>bin/run.sh</literal> accordingly.</para>
|
||||
<para>For persistence, HornetQ uses its own fast journal, which you can configure to use
|
||||
<para>For persistence, ActiveMQ uses its own fast journal, which you can configure to use
|
||||
libaio (which is the default when running on Linux) or Java NIO. In order to use the libaio
|
||||
module on Linux, you'll need to install libaio, if it's not already installed.</para>
|
||||
<para>If you're not running on Linux then you don't need to worry about this.</para>
|
||||
|
@ -43,7 +43,7 @@
|
|||
<programlisting>apt-get install libaio</programlisting>
|
||||
</section>
|
||||
<section id="installation.standalone">
|
||||
<title>Stand-alone HornetQ Server</title>
|
||||
<title>Stand-alone ActiveMQ Server</title>
|
||||
<para>After downloading the distribution, unzip it into your chosen directory. At this point
|
||||
it should be possible to <link linkend="running.standalone">run straight out of the
|
||||
box</link>, the following describes the directory structure: </para>
|
||||
|
@ -73,28 +73,28 @@
|
|||
</programlisting>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para><literal>bin</literal> -- binaries and scripts needed to run HornetQ.</para>
|
||||
<para><literal>bin</literal> -- binaries and scripts needed to run ActiveMQ.</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>config</literal> -- configuration files needed to configure HornetQ. This
|
||||
contains configurations to run HornetQ either in stand-alone or inside JBoss AS 4 and 5.
|
||||
<para><literal>config</literal> -- configuration files needed to configure ActiveMQ. This
|
||||
contains configurations to run ActiveMQ either in stand-alone or inside JBoss AS 4 and 5.
|
||||
Please refer to the reference guide for details on configuration. </para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>docs</literal> -- guides and javadocs for HornetQ </para>
|
||||
<para><literal>docs</literal> -- guides and javadocs for ActiveMQ </para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>examples</literal> -- JMS and Java EE examples. Please refer to the
|
||||
'running examples' chapter for details on how to run them. </para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>lib</literal> -- jars and libraries needed to run HornetQ </para>
|
||||
<para><literal>lib</literal> -- jars and libraries needed to run ActiveMQ </para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>licenses</literal> -- licenses for HornetQ </para>
|
||||
<para><literal>licenses</literal> -- licenses for ActiveMQ </para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>schemas</literal> -- XML Schemas used to validate HornetQ configuration
|
||||
<para><literal>schemas</literal> -- XML Schemas used to validate ActiveMQ configuration
|
||||
files</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
|
|
|
@ -18,15 +18,15 @@
|
|||
<!-- ============================================================================= -->
|
||||
|
||||
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "HornetQ_QuickStart_Guide.ent">
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "ActiveMQ_QuickStart_Guide.ent">
|
||||
%BOOK_ENTITIES;
|
||||
]>
|
||||
<chapter id="introduction">
|
||||
<title>Getting Started</title>
|
||||
<para>This short guide explains how to download, install and quickly get started with
|
||||
HornetQ.</para>
|
||||
ActiveMQ.</para>
|
||||
<para>After downloading and installing we highly recommend you run the examples to get
|
||||
acquainted with HornetQ. We ship with over 70 examples demonstrating most of the
|
||||
acquainted with ActiveMQ. We ship with over 70 examples demonstrating most of the
|
||||
features.</para>
|
||||
<para>This guide is not intended to be a replacement for the user manual. The user manual goes
|
||||
into much more depth, so please consult that for further information.</para>
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
<!-- ============================================================================= -->
|
||||
|
||||
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "HornetQ_QuickStart_Guide.ent">
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "ActiveMQ_QuickStart_Guide.ent">
|
||||
%BOOK_ENTITIES;
|
||||
]>
|
||||
|
||||
|
|
|
@ -18,24 +18,24 @@
|
|||
<!-- ============================================================================= -->
|
||||
|
||||
<!DOCTYPE chapter PUBLIC "-//OASIS//DTD DocBook XML V4.5//EN" "http://www.oasis-open.org/docbook/xml/4.5/docbookx.dtd" [
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "HornetQ_QuickStart_Guide.ent">
|
||||
<!ENTITY % BOOK_ENTITIES SYSTEM "ActiveMQ_QuickStart_Guide.ent">
|
||||
%BOOK_ENTITIES;
|
||||
]>
|
||||
<chapter id="running">
|
||||
<title>Starting The Server</title>
|
||||
<section id="running.standalone">
|
||||
<title>Standalone HornetQ</title>
|
||||
<title>Standalone ActiveMQ</title>
|
||||
<para>To run a stand-alone server, open up a shell or command prompt and navigate into the
|
||||
<literal>bin</literal> directory. Then execute <literal>./hornetq run</literal> (or <literal
|
||||
>./hornetq.cmd run</literal> on Windows) and you should see the following output </para>
|
||||
<programlisting>
|
||||
bin$ ./hornetq run
|
||||
|
||||
11:05:06,589 INFO [org.apache.activemq.integration.bootstrap] HQ101000: Starting HornetQ Server
|
||||
11:05:06,589 INFO [org.apache.activemq.integration.bootstrap] HQ101000: Starting ActiveMQ Server
|
||||
...
|
||||
11:05:10,848 INFO [org.apache.activemq.core.server] HQ221001: HornetQ Server version 2.5.0.SNAPSHOT (Wild Hornet, 125) [e32ae252-52ee-11e4-a716-7785dc3013a3]
|
||||
11:05:10,848 INFO [org.apache.activemq.core.server] HQ221001: ActiveMQ Server version 2.5.0.SNAPSHOT (Wild Hornet, 125) [e32ae252-52ee-11e4-a716-7785dc3013a3]
|
||||
</programlisting>
|
||||
<para>HornetQ is now running.</para>
|
||||
<para>ActiveMQ is now running.</para>
|
||||
<para>Both the run and the stop scripts use the config under <literal
|
||||
>config/non-clustered</literal> by default. The configuration can be changed
|
||||
by running <literal>./hornetq run xml:../config/non-clustered/bootstrap.xml</literal> or another config of
|
||||
|
@ -43,8 +43,8 @@
|
|||
<para>The server can be stopped by running <literal>./hornetq stop</literal></para>
|
||||
</section>
|
||||
<section id="running.jboss.Wildfly">
|
||||
<title>HornetQ In Wildfly</title>
|
||||
<para>HornetQ is the Default Messaging Provider in the <ulink
|
||||
<title>ActiveMQ In Wildfly</title>
|
||||
<para>ActiveMQ is the Default Messaging Provider in the <ulink
|
||||
url="http://www.wildfly.org/" >Wildfly Application Server</ulink>
|
||||
To run the server you need to run the standalone-full.xml configuration by running the command './standalone.sh -c standalone-full.xml'.
|
||||
You will see something like:/</para>
|
||||
|
@ -89,7 +89,7 @@
|
|||
14:47:42,471 INFO [org.wildfly.extension.undertow] (MSC service thread 1-7) JBAS017519: Undertow HTTP listener default listening on /127.0.0.1:8080
|
||||
14:47:42,823 INFO [org.jboss.as.server.deployment.scanner] (MSC service thread 1-10) JBAS015012: Started FileSystemDeploymentService for directory /home/andy/projects/wildfly/build/target/wildfly-8.0.0.Beta1-SNAPSHOT/standalone/deployments
|
||||
14:47:42,882 INFO [org.jboss.as.remoting] (MSC service thread 1-16) JBAS017100: Listening on 127.0.0.1:9999
|
||||
14:47:43,037 INFO [org.apache.activemq.core.server] (ServerService Thread Pool -- 58) HQ221000: live server is starting with configuration HornetQ Configuration (clustered=false,backup=false,sharedStore=true,journalDirectory=/home/andy/projects/wildfly/build/target/wildfly-8.0.0.Beta1-SNAPSHOT/standalone/data/messagingjournal,bindingsDirectory=/home/andy/projects/wildfly/build/target/wildfly-8.0.0.Beta1-SNAPSHOT/standalone/data/messagingbindings,largeMessagesDirectory=/home/andy/projects/wildfly/build/target/wildfly-8.0.0.Beta1-SNAPSHOT/standalone/data/messaginglargemessages,pagingDirectory=/home/andy/projects/wildfly/build/target/wildfly-8.0.0.Beta1-SNAPSHOT/standalone/data/messagingpaging)
|
||||
14:47:43,037 INFO [org.apache.activemq.core.server] (ServerService Thread Pool -- 58) HQ221000: live server is starting with configuration ActiveMQ Configuration (clustered=false,backup=false,sharedStore=true,journalDirectory=/home/andy/projects/wildfly/build/target/wildfly-8.0.0.Beta1-SNAPSHOT/standalone/data/messagingjournal,bindingsDirectory=/home/andy/projects/wildfly/build/target/wildfly-8.0.0.Beta1-SNAPSHOT/standalone/data/messagingbindings,largeMessagesDirectory=/home/andy/projects/wildfly/build/target/wildfly-8.0.0.Beta1-SNAPSHOT/standalone/data/messaginglargemessages,pagingDirectory=/home/andy/projects/wildfly/build/target/wildfly-8.0.0.Beta1-SNAPSHOT/standalone/data/messagingpaging)
|
||||
14:47:43,062 INFO [org.apache.activemq.core.server] (ServerService Thread Pool -- 58) HQ221006: Waiting to obtain live lock
|
||||
14:47:43,103 INFO [org.apache.activemq.core.server] (ServerService Thread Pool -- 58) HQ221012: Using AIO Journal
|
||||
14:47:43,313 INFO [org.apache.activemq.core.server] (ServerService Thread Pool -- 58) HQ224067: Adding protocol support CORE
|
||||
|
@ -107,12 +107,12 @@
|
|||
14:47:44,362 INFO [org.apache.activemq.core.server] (ServerService Thread Pool -- 58) HQ221020: Started Netty Acceptor version 3.6.6.Final-90e1eb2 127.0.0.1:5445 for CORE protocol
|
||||
14:47:44,364 INFO [org.apache.activemq.core.server] (ServerService Thread Pool -- 58) HQ221020: Started Netty Acceptor version 3.6.6.Final-90e1eb2 org.apache.activemq.default.servlet:5445 for CORE protocol
|
||||
14:47:44,366 INFO [org.apache.activemq.core.server] (ServerService Thread Pool -- 58) HQ221007: Server is now live
|
||||
14:47:44,366 INFO [org.apache.activemq.core.server] (ServerService Thread Pool -- 58) HQ221001: HornetQ Server version 2.4.0.Beta2 (Andromedian Flyer, 123) [bcc1cd10-2bfb-11e3-ad5f-9f88840f9e1a]
|
||||
14:47:44,366 INFO [org.apache.activemq.core.server] (ServerService Thread Pool -- 58) HQ221001: ActiveMQ Server version 2.4.0.Beta2 (Andromedian Flyer, 123) [bcc1cd10-2bfb-11e3-ad5f-9f88840f9e1a]
|
||||
14:47:44,435 INFO [org.jboss.as.messaging] (ServerService Thread Pool -- 58) JBAS011601: Bound messaging object to jndi name java:/ConnectionFactory
|
||||
14:47:44,437 INFO [org.jboss.as.messaging] (ServerService Thread Pool -- 59) JBAS011601: Bound messaging object to jndi name java:jboss/exported/jms/ServletConnectionFactory
|
||||
14:47:44,439 INFO [org.jboss.as.messaging] (ServerService Thread Pool -- 60) JBAS011601: Bound messaging object to jndi name java:jboss/exported/jms/RemoteConnectionFactory
|
||||
14:47:44,462 INFO [org.jboss.as.connector.deployment] (MSC service thread 1-3) JBAS010406: Registered connection factory java:/JmsXA
|
||||
14:47:44,531 INFO [org.apache.activemq.ra] (MSC service thread 1-3) HornetQ resource adaptor started
|
||||
14:47:44,531 INFO [org.apache.activemq.ra] (MSC service thread 1-3) ActiveMQ resource adaptor started
|
||||
14:47:44,532 INFO [org.jboss.as.connector.services.resourceadapters.ResourceAdapterActivatorService$ResourceAdapterActivator] (MSC service thread 1-3) IJ020002: Deployed: file://RaActivatorhornetq-ra
|
||||
14:47:44,535 INFO [org.jboss.as.connector.deployment] (MSC service thread 1-12) JBAS010401: Bound JCA ConnectionFactory [java:/JmsXA]
|
||||
14:47:44,536 INFO [org.jboss.as.messaging] (MSC service thread 1-15) JBAS011601: Bound messaging object to jndi name java:jboss/DefaultJMSConnectionFactory
|
||||
|
|
|
@ -19,8 +19,8 @@
|
|||
|
||||
<properties>
|
||||
<translation>en</translation>
|
||||
<docname>HornetQ_QuickStart_Guide</docname>
|
||||
<bookname>HornetQ QuickStart Guide</bookname>
|
||||
<docname>ActiveMQ_QuickStart_Guide</docname>
|
||||
<bookname>ActiveMQ QuickStart Guide</bookname>
|
||||
</properties>
|
||||
|
||||
<repositories>
|
||||
|
|
|
@ -19,25 +19,25 @@
|
|||
<!-- ============================================================================= -->
|
||||
|
||||
<chapter id="about">
|
||||
<title>关于HornetQ</title>
|
||||
<para>什么是HornetQ?</para>
|
||||
<title>关于ActiveMQ</title>
|
||||
<para>什么是ActiveMQ?</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>HornetQ是一个开源项目。它的目标是一个多协议、可嵌入、高性能、可集群的异步的消息系统。</para>
|
||||
<para>ActiveMQ是一个开源项目。它的目标是一个多协议、可嵌入、高性能、可集群的异步的消息系统。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>有关HornetQ是什么及不是什么的更多的问题,请访问
|
||||
<ulink url="http://www.jboss.org/community/wiki/HornetQGeneralFAQs">FAQs wiki
|
||||
<para>有关ActiveMQ是什么及不是什么的更多的问题,请访问
|
||||
<ulink url="http://www.jboss.org/community/wiki/ActiveMQGeneralFAQs">FAQs wiki
|
||||
页</ulink>。</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
<para>为什么要使用HornetQ? 以下给出了几个理由:</para>
|
||||
<para>为什么要使用ActiveMQ? 以下给出了几个理由:</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>HornetQ是100%的开源软件。 HornetQ 采用 Apache v 2.0开源协议,对用户的限制最小。</para>
|
||||
<para>ActiveMQ是100%的开源软件。 ActiveMQ 采用 Apache v 2.0开源协议,对用户的限制最小。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>HornetQ的设计强调可用性。</para>
|
||||
<para>ActiveMQ的设计强调可用性。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>采用Java语言编写。可以在任何Java 6+ 的平台上运行。这几乎包括了从Windows到IBM mainframes的每个平台。</para>
|
||||
|
@ -49,11 +49,11 @@
|
|||
<para>功能全面。不仅拥有其它成熟消息产品所具有的全部功能,而且还有很多独特的功能。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>HornetQ的设计遵从了简约的原则。对第三方软件的依赖极少。根据不同的需要,
|
||||
HornetQ可以单独运行,也可以运行于JEE应用服务器中。它还可以嵌入到你自己的应用程序中。</para>
|
||||
<para>ActiveMQ的设计遵从了简约的原则。对第三方软件的依赖极少。根据不同的需要,
|
||||
ActiveMQ可以单独运行,也可以运行于JEE应用服务器中。它还可以嵌入到你自己的应用程序中。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>完美的可获得性。HornetQ提供自动客户端失效备援(automatic client failover)功能,能保证在服务器故障时没有消息丢失或消息重复。</para>
|
||||
<para>完美的可获得性。ActiveMQ提供自动客户端失效备援(automatic client failover)功能,能保证在服务器故障时没有消息丢失或消息重复。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>超级灵活的集群方案。可以控制集群进行消息负载均衡的方式。分布在不同地理位置的各个集群间可以通过非可靠的网络连接形成一个全球网络。
|
||||
|
@ -61,7 +61,7 @@
|
|||
</listitem>
|
||||
<listitem>
|
||||
<para>请访问 <ulink
|
||||
url="http://www.jboss.org/community/wiki/HornetQFeatures">wiki</ulink>来全面了解HornetQ的所有功能介绍。</para>
|
||||
url="http://www.jboss.org/community/wiki/ActiveMQFeatures">wiki</ulink>来全面了解ActiveMQ的所有功能介绍。</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
</chapter>
|
||||
|
|
|
@ -18,11 +18,11 @@
|
|||
<!-- ============================================================================= -->
|
||||
<chapter id="download">
|
||||
<title>下载</title>
|
||||
<para>HornetQ项目的官方地址是 <ulink url="http://hornetq.org/"
|
||||
<para>ActiveMQ项目的官方地址是 <ulink url="http://hornetq.org/"
|
||||
>http://hornetq.org/</ulink>。</para>
|
||||
<section id="download.software">
|
||||
<title>软件下载</title>
|
||||
<para>HornetQ的下载地址是<ulink
|
||||
<para>ActiveMQ的下载地址是<ulink
|
||||
url="http://hornetq.org/downloads.html/"
|
||||
>http://hornetq.org/downloads.html</ulink></para>
|
||||
</section>
|
||||
|
@ -31,11 +31,11 @@
|
|||
<para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>HornetQ的 <ulink
|
||||
url="http://www.jboss.org/community/wiki/HornetQ">wiki</ulink></para>
|
||||
<para>ActiveMQ的 <ulink
|
||||
url="http://www.jboss.org/community/wiki/ActiveMQ">wiki</ulink></para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>如果在使用HornetQ中发生任何问题,可以去我们的 <ulink
|
||||
<para>如果在使用ActiveMQ中发生任何问题,可以去我们的 <ulink
|
||||
url="http://www.jboss.org/index.html?module=bb&op=viewforum&f=312">用户论坛
|
||||
</ulink></para>
|
||||
</listitem>
|
||||
|
@ -55,7 +55,7 @@
|
|||
<para>还可以跟踪我们的<ulink url="http://twitter.com/hornetq">twitter</ulink></para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>HornetQ的Git代码库地址 <ulink
|
||||
<para>ActiveMQ的Git代码库地址 <ulink
|
||||
url="https://github.com/hornetq/hornetq"
|
||||
>https://github.com/hornetq/hornetq</ulink></para>
|
||||
</listitem>
|
||||
|
|
|
@ -17,8 +17,8 @@
|
|||
<!-- permitted by applicable law. -->
|
||||
<!-- ============================================================================= -->
|
||||
<chapter id="examples">
|
||||
<title>运行HornetQ例子</title>
|
||||
<para>在HornetQ的<literal>examples</literal>目录下有两组例子,它们是:</para>
|
||||
<title>运行ActiveMQ例子</title>
|
||||
<para>在ActiveMQ的<literal>examples</literal>目录下有两组例子,它们是:</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>JMS例子 - 这些例子展示的是使用JMS发送与接收消息的功能。</para>
|
||||
|
@ -47,7 +47,7 @@
|
|||
</itemizedlist>
|
||||
<para>在运行每个例子时,都要先启动一个或多个单独的服务器。当例子运行完毕,再将它们停止。</para>
|
||||
<para>做为演示我们这里运行queue例子。其它的例子可以参见用户手册。</para>
|
||||
<para>首先打开一个命令行窗口(shell),进入到HornetQ的 <literal
|
||||
<para>首先打开一个命令行窗口(shell),进入到ActiveMQ的 <literal
|
||||
>examples/jms/queue</literal>目录。</para>
|
||||
<para>敲入命令<literal>./build.sh</literal> (或者在Windows上<literal>build.bat</literal>),你
|
||||
将看到如下的输出:</para>
|
||||
|
@ -78,22 +78,22 @@ a NIO. If your platform is Linux, install LibAIO to enable the AIO journal
|
|||
[java] org.apache.activemq.jms.example.SpawnedJMSServer out:10:41:08,437 WARN @main [Securit
|
||||
yStoreImpl] It has been detected that the cluster admin password which is used to replic
|
||||
ate management operation from one node to the other has not had its password changed fro
|
||||
m the installation default. Please see the HornetQ user guide for instructions o
|
||||
m the installation default. Please see the ActiveMQ user guide for instructions o
|
||||
n how to do this.
|
||||
[java] org.apache.activemq.jms.example.SpawnedJMSServer out:10:41:10,941 INFO @main [HornetQCo
|
||||
[java] org.apache.activemq.jms.example.SpawnedJMSServer out:10:41:10,941 INFO @main [ActiveMQCo
|
||||
nnectionFactory] read only is false
|
||||
[java] org.apache.activemq.jms.example.SpawnedJMSServer out:10:41:10,941 INFO @main [HornetQCo
|
||||
[java] org.apache.activemq.jms.example.SpawnedJMSServer out:10:41:10,941 INFO @main [ActiveMQCo
|
||||
nnectionFactory] read only is false
|
||||
[java] org.apache.activemq.jms.example.SpawnedJMSServer out:10:41:10,941 INFO @main [HornetQCo
|
||||
[java] org.apache.activemq.jms.example.SpawnedJMSServer out:10:41:10,941 INFO @main [ActiveMQCo
|
||||
nnectionFactory] read only is false
|
||||
[java] org.apache.activemq.jms.example.SpawnedJMSServer out:10:41:10,991 WARN @main [JMSServ
|
||||
erManagerImpl] Binding for java:/ConnectionFactory already exists
|
||||
[java] org.apache.activemq.jms.example.SpawnedJMSServer out:10:41:10,991 WARN @main [JMSServ
|
||||
erManagerImpl] Binding for java:/XAConnectionFactory already exists
|
||||
[java] org.apache.activemq.jms.example.SpawnedJMSServer out:10:41:11,241 INFO @main [Messagi
|
||||
ngServerImpl] HornetQ Server version 2.0.0.BETA5 (buzz-buzz, 107) started
|
||||
[java] org.apache.activemq.jms.example.SpawnedJMSServer out:10:41:11,241 INFO @main [HornetQBoot
|
||||
strapServer] HornetQ server started
|
||||
ngServerImpl] ActiveMQ Server version 2.0.0.BETA5 (buzz-buzz, 107) started
|
||||
[java] org.apache.activemq.jms.example.SpawnedJMSServer out:10:41:11,241 INFO @main [ActiveMQBoot
|
||||
strapServer] ActiveMQ server started
|
||||
[java] org.apache.activemq.jms.example.SpawnedJMSServer out:STARTED::
|
||||
[java] 10:41:11,276 INFO @main [JMSExample] using server0/client-jndi.properties f
|
||||
or jndi
|
||||
|
@ -107,7 +107,7 @@ or jndi
|
|||
BUILD SUCCESSFUL
|
||||
Total time: 13 seconds
|
||||
</programlisting>
|
||||
<para>恭喜!你已经成功地运行了你的第一个HornetQ例子。试着运行其它的例子。</para>
|
||||
<para>恭喜!你已经成功地运行了你的第一个ActiveMQ例子。试着运行其它的例子。</para>
|
||||
</section>
|
||||
<section id="examples.messaging">
|
||||
<title>Java EE例子</title>
|
||||
|
|
|
@ -18,15 +18,15 @@
|
|||
<!-- ============================================================================= -->
|
||||
<chapter id="installation">
|
||||
<title>安装</title>
|
||||
<para>本章讲述如何安装HornetQ。</para>
|
||||
<para>本章讲述如何安装ActiveMQ。</para>
|
||||
<section id="installation.prerequisites">
|
||||
<title>准备</title>
|
||||
<note>
|
||||
<para>HornetQ只能在Java 6或以上版本中运行</para>
|
||||
<para>ActiveMQ只能在Java 6或以上版本中运行</para>
|
||||
</note>
|
||||
<para>默认情况下HornetQ运行的内存是1GiB。如果你的电脑内存少于1GiB,或者你希望更多的内存给HornetQ,你
|
||||
<para>默认情况下ActiveMQ运行的内存是1GiB。如果你的电脑内存少于1GiB,或者你希望更多的内存给ActiveMQ,你
|
||||
可以修改 <literal>bin/run.sh</literal>脚本文件。</para>
|
||||
<para>HornetQ有自己的快速日志系统,它能够使用libaio(在Linux上它是默认的)或Java的NIO。
|
||||
<para>ActiveMQ有自己的快速日志系统,它能够使用libaio(在Linux上它是默认的)或Java的NIO。
|
||||
如果要使用libaio,你需要首先在你的Linux上安装它。</para>
|
||||
<para>如果你不在使用Linux,则不需要考虑这个问题。</para>
|
||||
<para>要安装libaio,你可以使用root用户完成以下步骤:</para>
|
||||
|
@ -36,7 +36,7 @@
|
|||
<programlisting>apt-get install libaio</programlisting>
|
||||
</section>
|
||||
<section id="installation.standalone">
|
||||
<title>单独的HornetQ服务器</title>
|
||||
<title>单独的ActiveMQ服务器</title>
|
||||
<para>将软件包下载后,将其解压到你选定的目录下。这里你就可以<link linkend="running.standalone">直接运行了</link>。
|
||||
下面给出了它的目录结构: </para>
|
||||
<programlisting>
|
||||
|
@ -65,35 +65,35 @@
|
|||
</programlisting>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para><literal>bin</literal> -- 运行HornetQ的二进制文件和脚本文件。</para>
|
||||
<para><literal>bin</literal> -- 运行ActiveMQ的二进制文件和脚本文件。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>config</literal> -- HornetQ的配置文件。它包括了单独模式或者运行在
|
||||
<para><literal>config</literal> -- ActiveMQ的配置文件。它包括了单独模式或者运行在
|
||||
JBoss AS 4 或 5中的配置。请参考配置索引来了解配置有详细信息。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>docs</literal> -- HornetQ的文档及Javadoc。 </para>
|
||||
<para><literal>docs</literal> -- ActiveMQ的文档及Javadoc。 </para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>examples</literal> -- JMS and Java EE例子。有关详细信息请参见
|
||||
'running examples'一章。 </para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>lib</literal> -- 运行HornetQ所需要的jar文件和库文件 </para>
|
||||
<para><literal>lib</literal> -- 运行ActiveMQ所需要的jar文件和库文件 </para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>licenses</literal> -- HornetQ的软件协议</para>
|
||||
<para><literal>licenses</literal> -- ActiveMQ的软件协议</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>schemas</literal> -- HornetQ配置文件的XML Schema</para>
|
||||
<para><literal>schemas</literal> -- ActiveMQ配置文件的XML Schema</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
</section>
|
||||
<section id="installation.jboss.as5">
|
||||
<title>HornetQ运行于JBoss应用服务器5.x</title>
|
||||
<para>HornetQ可以部署在<ulink url="http://www.jboss.org/jbossas/">JBoss AS
|
||||
5</ulink>中。目前默认的应用服务器没有安装HornetQ(HornetQ将是JBoss 6的默认JMS提供者),因此
|
||||
你需要为HornetQ创建新的AS 5的配置(profile)。</para>
|
||||
<title>ActiveMQ运行于JBoss应用服务器5.x</title>
|
||||
<para>ActiveMQ可以部署在<ulink url="http://www.jboss.org/jbossas/">JBoss AS
|
||||
5</ulink>中。目前默认的应用服务器没有安装ActiveMQ(ActiveMQ将是JBoss 6的默认JMS提供者),因此
|
||||
你需要为ActiveMQ创建新的AS 5的配置(profile)。</para>
|
||||
<para>创建AS 5新配置的步骤:</para>
|
||||
<orderedlist>
|
||||
<listitem>
|
||||
|
@ -103,7 +103,7 @@
|
|||
<para>设置环境变量<literal>JBOSS_HOME</literal>指向JBoss AS 5的安装目录。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>运行HornetQ的<literal>config/jboss-as-5</literal>下的<literal>./build.sh</literal> (或
|
||||
<para>运行ActiveMQ的<literal>config/jboss-as-5</literal>下的<literal>./build.sh</literal> (或
|
||||
者如果在Windows下运行<literal>build.bat</literal>)。</para>
|
||||
</listitem>
|
||||
</orderedlist>
|
||||
|
@ -111,12 +111,12 @@
|
|||
<itemizedlist>
|
||||
<listitem>
|
||||
<para><literal>default-with-hornetq</literal> -- 这个相当于AS 5的<literal
|
||||
>default</literal>配置但其JMS提供者替换成为HornetQ。在这个配置中的HornetQ
|
||||
>default</literal>配置但其JMS提供者替换成为ActiveMQ。在这个配置中的ActiveMQ
|
||||
是<emphasis>非集群</emphasis>的。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>all-with-hornetq</literal> -- 这个相当于AS 5的<literal
|
||||
>all</literal>配置但其JMS提供者替换成为HornetQ。这个配置中的HornetQ
|
||||
>all</literal>配置但其JMS提供者替换成为ActiveMQ。这个配置中的ActiveMQ
|
||||
是<emphasis>集群</emphasis>的。</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
|
@ -124,8 +124,8 @@
|
|||
<programlisting>$JBOSS_HOME/bin/run.sh -c default-with-hornetq</programlisting>
|
||||
</section>
|
||||
<section id="installation.jboss.as4">
|
||||
<title>HornetQ运行于JBoss应用服务器4.x</title>
|
||||
<para>为了在AS 4中安装HornetQ,你需要创建新的配置(profile)。</para>
|
||||
<title>ActiveMQ运行于JBoss应用服务器4.x</title>
|
||||
<para>为了在AS 4中安装ActiveMQ,你需要创建新的配置(profile)。</para>
|
||||
<para>步骤如下:</para>
|
||||
<orderedlist>
|
||||
<listitem>
|
||||
|
@ -135,7 +135,7 @@
|
|||
<para>设置环境变量<literal>JBOSS_HOME</literal>指向JBoss AS 4的安装目录。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>运行HornetQ的<literal>config/jboss-as-4</literal>下的<literal>./build.sh</literal> (或
|
||||
<para>运行ActiveMQ的<literal>config/jboss-as-4</literal>下的<literal>./build.sh</literal> (或
|
||||
者如果在Windows下运行<literal>build.bat</literal>)。</para>
|
||||
</listitem>
|
||||
</orderedlist>
|
||||
|
@ -143,12 +143,12 @@
|
|||
<itemizedlist>
|
||||
<listitem>
|
||||
<para><literal>default-with-hornetq</literal> -- 这个相当于AS 4的<literal
|
||||
>default</literal>配置但其JMS提供者替换成为HornetQ。在这个配置中的HornetQ
|
||||
>default</literal>配置但其JMS提供者替换成为ActiveMQ。在这个配置中的ActiveMQ
|
||||
是<emphasis>非集群</emphasis>的。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>all-with-hornetq</literal> -- 这个相当于AS 4的<literal
|
||||
>all</literal>配置但其JMS提供者替换成为HornetQ。这个配置中的HornetQ
|
||||
>all</literal>配置但其JMS提供者替换成为ActiveMQ。这个配置中的ActiveMQ
|
||||
是<emphasis>集群</emphasis>的。</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
|
|
|
@ -18,8 +18,8 @@
|
|||
<!-- ============================================================================= -->
|
||||
<chapter id="introduction">
|
||||
<title>快速入手</title>
|
||||
<para>本简短的指南给出了如何下载、安装HornetQ,以及尽快开始使用HornetQ。</para>
|
||||
<para>我们强烈建议当下载安装完成后,运行HornetQ的例子来了解HornetQ。我们有70多个例子来展示几乎
|
||||
所有HornetQ的功能。</para>
|
||||
<para>本指南不能代替用户手册。用户手册包括更加完整和深入的信息,供用户进一步全面掌握HornetQ。</para>
|
||||
<para>本简短的指南给出了如何下载、安装ActiveMQ,以及尽快开始使用ActiveMQ。</para>
|
||||
<para>我们强烈建议当下载安装完成后,运行ActiveMQ的例子来了解ActiveMQ。我们有70多个例子来展示几乎
|
||||
所有ActiveMQ的功能。</para>
|
||||
<para>本指南不能代替用户手册。用户手册包括更加完整和深入的信息,供用户进一步全面掌握ActiveMQ。</para>
|
||||
</chapter>
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
]>
|
||||
<book lang="en">
|
||||
<bookinfo>
|
||||
<title>HornetQ快速指南</title>
|
||||
<title>ActiveMQ快速指南</title>
|
||||
<subtitle>Putting the buzz in messaging</subtitle>
|
||||
</bookinfo>
|
||||
|
||||
|
|
|
@ -19,28 +19,28 @@
|
|||
<chapter id="running">
|
||||
<title>Starting The Server</title>
|
||||
<section id="running.standalone">
|
||||
<title>单独HornetQ</title>
|
||||
<para>要运行单独的HornetQ服务,打开一个命令行窗口,进入到HornetQ的<literal>bin</literal>
|
||||
<title>单独ActiveMQ</title>
|
||||
<para>要运行单独的ActiveMQ服务,打开一个命令行窗口,进入到ActiveMQ的<literal>bin</literal>
|
||||
目录下,执行<literal>./run.sh</literal> (或者在Windows下 <literal
|
||||
>run.bat</literal>)。你将看到如下的输出:</para>
|
||||
<programlisting>
|
||||
bin$ ./run.sh
|
||||
|
||||
15:05:54,108 INFO @main [HornetQBootstrapServer] Starting HornetQ server
|
||||
15:05:54,108 INFO @main [ActiveMQBootstrapServer] Starting ActiveMQ server
|
||||
...
|
||||
15:06:02,566 INFO @main [HornetQServerImpl] HornetQ Server version
|
||||
15:06:02,566 INFO @main [ActiveMQServerImpl] ActiveMQ Server version
|
||||
2.0.0.CR3 (yellowjacket, 111) started
|
||||
</programlisting>
|
||||
<para>这表明HornetQ已经启动并运行了。</para>
|
||||
<para>这表明ActiveMQ已经启动并运行了。</para>
|
||||
<para>默认情况下,不论是启动还是停止脚本都使用<literal>config/stand-alone/non-clustered</literal>
|
||||
下的配置文件。要使用不同的配置目录,可运行<literal>./run.sh ../config/stand-alone/clustered</literal>
|
||||
或者其它选定的目录。同样方法适用于停止脚本。</para>
|
||||
</section>
|
||||
<section id="running.jboss.as5">
|
||||
<title>HornetQ在JBoss AS 5.x中运行</title>
|
||||
<para>要在JBoss AS 5运行HornetQ,你需要创建<link
|
||||
linkend="installation.jboss.as5">安装有HornetQ的AS 5的配置</link>。然后用这个配置启动AS 5。
|
||||
例如,要运行一个带有<emphasis>非集群</emphasis>的HornetQ服务的AS 5,进入<literal
|
||||
<title>ActiveMQ在JBoss AS 5.x中运行</title>
|
||||
<para>要在JBoss AS 5运行ActiveMQ,你需要创建<link
|
||||
linkend="installation.jboss.as5">安装有ActiveMQ的AS 5的配置</link>。然后用这个配置启动AS 5。
|
||||
例如,要运行一个带有<emphasis>非集群</emphasis>的ActiveMQ服务的AS 5,进入<literal
|
||||
>$JBOSS_HOME/bin</literal>目录,然后键入:</para>
|
||||
<programlisting>
|
||||
bin$ ./run.sh -c default-with-hornetq
|
||||
|
@ -49,7 +49,7 @@
|
|||
15:18:35,462 INFO [ServerImpl] Release ID: JBoss (Microcontainer) [5.1.0.GA (build: SVNTag=
|
||||
JBoss_5_1_0_GA date=200905221053)
|
||||
...
|
||||
15:19:30,305 INFO [HornetQServerImpl] HornetQ Server version
|
||||
15:19:30,305 INFO [ActiveMQServerImpl] ActiveMQ Server version
|
||||
2.0.0.CR3 (yellowjacket, 111) started
|
||||
...
|
||||
15:19:43,601 INFO [ServerImpl] JBoss (Microcontainer) [5.1.0.GA (build: SVNTag=
|
||||
|
@ -57,12 +57,12 @@
|
|||
</programlisting>
|
||||
</section>
|
||||
<section id="running.jboss.as4">
|
||||
<title>HornetQ在JBoss AS 4中运行</title>
|
||||
<para>首先按照与JBoss AS 5相同的步骤创建<link linkend="installation.jboss.as4">安装有HornetQ的AS 4配置
|
||||
<title>ActiveMQ在JBoss AS 4中运行</title>
|
||||
<para>首先按照与JBoss AS 5相同的步骤创建<link linkend="installation.jboss.as4">安装有ActiveMQ的AS 4配置
|
||||
</link>然后以相同的方式启动AS。</para>
|
||||
</section>
|
||||
<section id="running.jboss.as6">
|
||||
<title>HornetQ在JBoss AS 6.0中运行</title>
|
||||
<para>从JBoss AS 6.0 M3开始,HornetQ已经是默认的(内建)JMS提供者。所以无需安装即可运行。</para>
|
||||
<title>ActiveMQ在JBoss AS 6.0中运行</title>
|
||||
<para>从JBoss AS 6.0 M3开始,ActiveMQ已经是默认的(内建)JMS提供者。所以无需安装即可运行。</para>
|
||||
</section>
|
||||
</chapter>
|
||||
|
|
|
@ -18,15 +18,15 @@
|
|||
<!-- ============================================================================= -->
|
||||
<chapter id="appserver-integration">
|
||||
<title>Java EE和应用服务器的集成</title>
|
||||
<para>HornetQ可以容易地安装到JBoss 4应用服务器及其以上版本。有关安装的详细说明请参阅快速指南。</para>
|
||||
<para>HornetQ提供了一个JCA适配器,使得它还可以与其它JEE兼容的应用服务器集成。请参阅其它应用服务器的
|
||||
<para>ActiveMQ可以容易地安装到JBoss 4应用服务器及其以上版本。有关安装的详细说明请参阅快速指南。</para>
|
||||
<para>ActiveMQ提供了一个JCA适配器,使得它还可以与其它JEE兼容的应用服务器集成。请参阅其它应用服务器的
|
||||
有关JCA适配器集成的说明来操作。</para>
|
||||
<para>JCA适配器的作用是控制消息流入到消息Bean(MDB),并控制消息从各种JEE模块中发出(如EJB和Servlet)。</para>
|
||||
<para>本章讲述这些JEE模块配置HornetQ的基本信息。</para>
|
||||
<para>本章讲述这些JEE模块配置ActiveMQ的基本信息。</para>
|
||||
<section>
|
||||
<title>配置消息Bean</title>
|
||||
<para>使用HornetQ向MDB传递消息,需要在文件<literal>ra.xml</literal>中配置JCA适配器。该文件在
|
||||
<literal>jms-ra.rar</literal>文件中。默认配置下HornetQ服务使用InVm连接器接收消息。在本章
|
||||
<para>使用ActiveMQ向MDB传递消息,需要在文件<literal>ra.xml</literal>中配置JCA适配器。该文件在
|
||||
<literal>jms-ra.rar</literal>文件中。默认配置下ActiveMQ服务使用InVm连接器接收消息。在本章
|
||||
后面列出了可配置的选项。</para>
|
||||
<para>所有MDB都需要有目标类型和目标的相关配置。下面就是一个使用annotation配置MDB的例子:</para>
|
||||
<programlisting>@MessageDriven(name = "MDBExample",
|
||||
|
@ -41,7 +41,7 @@ public class MDBExample implements MessageListener
|
|||
public void onMessage(Message message)...
|
||||
}</programlisting>
|
||||
<para>上例中配置了MDB从一个队列中接收消息,它的JNDI绑定名为<literal>queue/testQueue</literal>。
|
||||
这个队列必须事先在HornetQ服务器配置文件中配置并部署好的。</para>
|
||||
这个队列必须事先在ActiveMQ服务器配置文件中配置并部署好的。</para>
|
||||
<para><literal>ResourceAdapter</literal> annotation用来指出使用哪个适配器。要使用它必须要引入
|
||||
<literal>org.jboss.ejb3.annotation.ResourceAdapter</literal> (JBoss AS 5.x或以上)。
|
||||
这个类在
|
||||
|
@ -55,10 +55,10 @@ public class MDBExample implements MessageListener
|
|||
</programlisting>你还可以将hornetq-ra.rar改名为jms-ra.rar而不需要任何annotation或额外的部署描述信息。但是你需要
|
||||
编辑<literal>jms-ds.xml</literal>文件,将其中的<literal>rar-name</literal>项改成相应的值。</para>
|
||||
<note>
|
||||
<para>HornetQ是JBoss AS 6默认的JMS提供者。从这个版本开始HornetQ的资源适配器名字是
|
||||
<para>ActiveMQ是JBoss AS 6默认的JMS提供者。从这个版本开始ActiveMQ的资源适配器名字是
|
||||
<literal>jms-ra.rar</literal>,并且你不需要在MDB的annotation中指定它。</para>
|
||||
</note>
|
||||
<para>HornetQ发布包中的所有例子都使用annotation方法。</para>
|
||||
<para>ActiveMQ发布包中的所有例子都使用annotation方法。</para>
|
||||
<section>
|
||||
<title>使用容器管理事务(CMT)</title>
|
||||
<para>当MDB使用容器管理事务时,消息的传递被包含在一个JTA事务中。事务的提交与回滚是由容器来控制的。如果事务
|
||||
|
@ -270,12 +270,12 @@ public class MyMDB implements MessageListener
|
|||
</section>
|
||||
<section>
|
||||
<title>配置JCA适配器</title>
|
||||
<para>通过JCA适配器可以将HornetQ集成到JEE兼容的模块中,如MDB和EJB。它的配置决定了这些模块如何接收和发送消息。</para>
|
||||
<para>HornetQ的JCA适配器是通过<literal>jms-ra.rar</literal>部署的。它的配置文件中其中的
|
||||
<para>通过JCA适配器可以将ActiveMQ集成到JEE兼容的模块中,如MDB和EJB。它的配置决定了这些模块如何接收和发送消息。</para>
|
||||
<para>ActiveMQ的JCA适配器是通过<literal>jms-ra.rar</literal>部署的。它的配置文件中其中的
|
||||
<literal>META-INF/ra.xml</literal>。</para>
|
||||
<para>下面是它的具体配置内容:</para>
|
||||
<programlisting><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>
|
||||
|
@ -292,7 +292,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>
|
||||
|
@ -309,12 +309,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>
|
||||
|
@ -332,7 +332,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>
|
||||
|
@ -357,11 +357,11 @@ public class MyMDB implements MessageListener
|
|||
</orderedlist>
|
||||
<section>
|
||||
<title>适配器的全局参数</title>
|
||||
<para>首先看到的第一个参数是<literal>resourceadapter-class</literal>。这是HornetQ
|
||||
<para>首先看到的第一个参数是<literal>resourceadapter-class</literal>。这是ActiveMQ
|
||||
的适配器类。此参数不可更改。</para>
|
||||
<para>在此之后是可配置的参数。前两个配置适配器所使用的传输。其余的用来配置连接工厂。</para>
|
||||
<note><para>所有连接工厂的参数在没有定义时使用默认值。参数<literal>reconnectAttempts</literal>
|
||||
的默认值取-1,表示如果连接失败,HornetQ会不停地尝试重新连接。这个参数只适用于创建远程
|
||||
的默认值取-1,表示如果连接失败,ActiveMQ会不停地尝试重新连接。这个参数只适用于创建远程
|
||||
连接的情况。如果是InVm连接器,则永远不可能发生连接故障。</para></note>
|
||||
<para>下面给出了每个参数的说明:</para>
|
||||
<table frame="topbot" border="2">
|
||||
|
@ -650,14 +650,14 @@ public class MyMDB implements MessageListener
|
|||
在这个文件中的连接工厂的配置从主要的配置文件<literal>ra.xml</literal>中继承,
|
||||
但是可以在这里重新定义。下面的例子中给出了重新定义的方法。</para>
|
||||
<note>
|
||||
<para>请注意这里的配置只适用于在JBoss应用服务器中安装的HornetQ。如果要在其它JEE应用服务器中
|
||||
使用并配置HornetQ,请参照相应的应用服务器手册。</para>
|
||||
<para>请注意这里的配置只适用于在JBoss应用服务器中安装的ActiveMQ。如果要在其它JEE应用服务器中
|
||||
使用并配置ActiveMQ,请参照相应的应用服务器手册。</para>
|
||||
</note>
|
||||
<programlisting><tx-connection-factory>
|
||||
<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>
|
||||
|
@ -777,8 +777,8 @@ private ConnectionFactory connectionFactory;</programlisting>
|
|||
</table>
|
||||
</section>
|
||||
<section>
|
||||
<title>配置适配器访问单独的HornetQ服务器</title>
|
||||
<para>在有的情况下,消息服务器与应用服务器运行在不同的机器上。这时客户端只需要安装HornetQ的客户端的库文件。本节给出了具体的配置和所需要的jar文件。</para>
|
||||
<title>配置适配器访问单独的ActiveMQ服务器</title>
|
||||
<para>在有的情况下,消息服务器与应用服务器运行在不同的机器上。这时客户端只需要安装ActiveMQ的客户端的库文件。本节给出了具体的配置和所需要的jar文件。</para>
|
||||
<section>
|
||||
<para>你需要配置两个配置文件。一个是MDB所用的内部适配器,另一个是可以创建外部连接的外部适配器。</para>
|
||||
<section>
|
||||
|
@ -797,16 +797,16 @@ private ConnectionFactory connectionFactory;</programlisting>
|
|||
下创建名为
|
||||
<literal>META-INF</literal>
|
||||
的文件夹,然后在些文件夹内创建一个
|
||||
<literal>ra.xml</literal>配置文件。在HornetQ发布包中
|
||||
<literal>ra.xml</literal>配置文件。在ActiveMQ发布包中
|
||||
有一个<literal>ra.xml</literal>模板文件供你使用。
|
||||
</para>
|
||||
<para>要配置MDB接收远程HornetQ服务器的消息,你需要修改<literal>deploy/hornet-ra.rar/META-INF</literal>下面的
|
||||
<para>要配置MDB接收远程ActiveMQ服务器的消息,你需要修改<literal>deploy/hornet-ra.rar/META-INF</literal>下面的
|
||||
<literal>ra.xml</literal>文件,将传输层改为netty连接器(不要使用invm连接器)及其相应的参数。下面
|
||||
是一个配置的例子:
|
||||
</para>
|
||||
|
||||
<programlisting>
|
||||
<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>
|
||||
|
@ -827,7 +827,7 @@ private ConnectionFactory connectionFactory;</programlisting>
|
|||
<title>配置外部适配器</title>
|
||||
<para>你还需要创建一个<literal>hornetq-ds.xml</literal>文件来配置外部连接。该文件需要放置在<literal>deploy</literal>
|
||||
下的任意一个文件夹中。在一相标准的安装中这个文件夹是<literal>horneq</literal> 或者 <literal>hornetq.sar</literal>。
|
||||
当然你可以选择其它文件夹。该文件的名字只要是以<literal>-ds.xml</literal>即可。在HornetQ的发布包中包含有一个模板文件,
|
||||
当然你可以选择其它文件夹。该文件的名字只要是以<literal>-ds.xml</literal>即可。在ActiveMQ的发布包中包含有一个模板文件,
|
||||
它的名字是<literal>jms-ds.xml</literal>,位置就在config文件夹下。
|
||||
</para>
|
||||
<para>下面是一个配置的例子。</para>
|
||||
|
@ -836,19 +836,19 @@ private ConnectionFactory connectionFactory;</programlisting>
|
|||
<jndi-name>RemoteJmsXA</jndi-name>
|
||||
<xa-transaction/>
|
||||
<rar-name>hornetq-ra.rar</rar-name>
|
||||
<connection-definition>org.apache.activemq.ra.HornetQRAConnectionFactory</connection-definition>
|
||||
<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>
|
||||
</programlisting>
|
||||
<para>这个配置同样是连接到运行在本机上的端口为5446的HornetQ服务器。JEE模块可以通过JNDI查找
|
||||
<para>这个配置同样是连接到运行在本机上的端口为5446的ActiveMQ服务器。JEE模块可以通过JNDI查找
|
||||
<literal>java:/RemoteJmsXA</literal>(由<literal>jndi-name</literal>参数定义)。如上节所述,
|
||||
资源适配器根据文件夹下的配置来创建外部连接。</para>
|
||||
<section>
|
||||
<title>依赖的jar文件</title>
|
||||
<para>下面列出了HornetQ所需要的第三方jar文件</para>
|
||||
<para>下面列出了ActiveMQ所需要的第三方jar文件</para>
|
||||
<table frame="topbot" border="2">
|
||||
<title>Jar文件</title>
|
||||
<tgroup cols="3">
|
||||
|
@ -865,17 +865,17 @@ private ConnectionFactory connectionFactory;</programlisting>
|
|||
<tbody>
|
||||
<row>
|
||||
<entry>hornetq-ra.jar</entry>
|
||||
<entry>HornetQ资源适配器文件</entry>
|
||||
<entry>ActiveMQ资源适配器文件</entry>
|
||||
<entry>deploy/hornetq-ra.rar或相应的位置</entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>hornetq-core-client.jar</entry>
|
||||
<entry>HornetQ核心客户类库</entry>
|
||||
<entry>ActiveMQ核心客户类库</entry>
|
||||
<entry>在JBoss的default/lib下或者是$JBOSS_HOME/common/lib下。 </entry>
|
||||
</row>
|
||||
<row>
|
||||
<entry>hornetq-jms-client.jar</entry>
|
||||
<entry>HornetQ的JMS类</entry>
|
||||
<entry>ActiveMQ的JMS类</entry>
|
||||
<entry>同上</entry>
|
||||
</row>
|
||||
<row>
|
||||
|
@ -914,27 +914,27 @@ initialContext = new InitialContext(jndiParameters);</programlisting>
|
|||
或网络崩溃等情况下,事务内所有资源的状态的一致性。有关XA恢复的更多信息请见 <ulink
|
||||
url="http://www.jboss.org/community/wiki/JBossTransactions">JBoss
|
||||
事务</ulink>。</para>
|
||||
<para>当HornetQ与JBoss应用服务器集成时,它可以利用JBoss的事务处理来对消息资源进行恢复。如果消息处理包括
|
||||
<para>当ActiveMQ与JBoss应用服务器集成时,它可以利用JBoss的事务处理来对消息资源进行恢复。如果消息处理包括
|
||||
在一个XA事务中,如果服务器出现故障并重启时,恢复管理器将负责恢复事务,这样其中的消息要么被提交,要么被回滚(取
|
||||
决于事务的处理决定)。</para>
|
||||
<section>
|
||||
<title>XA恢复的配置</title>
|
||||
<para>要想HornetQ具有XA恢复功能,则必须配置恢复管理器连接到HornetQ并恢复其资源。下面的参数必须要加到
|
||||
<para>要想ActiveMQ具有XA恢复功能,则必须配置恢复管理器连接到ActiveMQ并恢复其资源。下面的参数必须要加到
|
||||
<literal>conf/jbossts-properties.xml</literal>文件中的<literal>jta</literal>部分:</para>
|
||||
<programlisting>
|
||||
<properties depends="arjuna" name="jta">
|
||||
...
|
||||
|
||||
<property name="com.arjuna.ats.jta.recovery.XAResourceRecovery.HornetQ1"
|
||||
value="org.apache.activemq.jms.server.recovery.HornetQXAResourceRecovery;[连接配置]"/>
|
||||
<property name="com.arjuna.ats.jta.recovery.XAResourceRecovery.ActiveMQ1"
|
||||
value="org.apache.activemq.jms.server.recovery.ActiveMQXAResourceRecovery;[连接配置]"/>
|
||||
</properties>
|
||||
</programlisting>
|
||||
<para>其中<literal>[连接配置]</literal>包括连接HornetQ节点所必需的信息。
|
||||
<para>其中<literal>[连接配置]</literal>包括连接ActiveMQ节点所必需的信息。
|
||||
它的格式是<literal>[连接工厂类名],[用户名], [密码], [连接参数]</literal>。 </para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para><literal>[连接工厂类名]</literal>指的是<literal>ConnectorFactory</literal>
|
||||
的类名,用来连接HornetQ服务器。其值可以是<literal
|
||||
的类名,用来连接ActiveMQ服务器。其值可以是<literal
|
||||
>org.apache.activemq.core.remoting.impl.invm.InVMConnectorFactory</literal> 或
|
||||
<literal
|
||||
>org.apache.activemq.core.remoting.impl.netty.NettyConnectorFactory</literal></para>
|
||||
|
@ -951,11 +951,11 @@ initialContext = new InitialContext(jndiParameters);</programlisting>
|
|||
</listitem>
|
||||
</itemizedlist>
|
||||
<note>
|
||||
<para>HornetQ必须有一个与<literal>conf/jbossts-properties.xml</literal>中定义的连接器相对应的接受器(acceptor)。</para>
|
||||
<para>ActiveMQ必须有一个与<literal>conf/jbossts-properties.xml</literal>中定义的连接器相对应的接受器(acceptor)。</para>
|
||||
</note>
|
||||
<section>
|
||||
<title>配置参数</title>
|
||||
<para>如果HornetQ配置了一个默认的in-vm接受器:</para>
|
||||
<para>如果ActiveMQ配置了一个默认的in-vm接受器:</para>
|
||||
<programlisting>
|
||||
<acceptor name="in-vm">
|
||||
<factory-class>org.apache.activemq.core.remoting.impl.invm.InVMAcceptorFactory</factory-class>
|
||||
|
@ -965,7 +965,7 @@ initialContext = new InitialContext(jndiParameters);</programlisting>
|
|||
>conf/jbossts-properties.xml</literal>文件中:</para>
|
||||
<programlisting>
|
||||
<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"/>
|
||||
value="org.apache.activemq.jms.server.recovery.ActiveMQXAResourceRecovery;org.apache.activemq.core.remoting.impl.invm.InVMConnectorFactory"/>
|
||||
</programlisting>
|
||||
<para>如果配置了一个netty接受器,并且端口不是默认的:</para>
|
||||
<programlisting>
|
||||
|
@ -978,7 +978,7 @@ initialContext = new InitialContext(jndiParameters);</programlisting>
|
|||
>conf/jbossts-properties.xml</literal>文件中:</para>
|
||||
<programlisting>
|
||||
<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"/>
|
||||
value="org.apache.activemq.jms.server.recovery.ActiveMQXAResourceRecovery;org.apache.activemq.core.remoting.impl.netty.NettyConnectorFactory, , , port=8888"/>
|
||||
</programlisting>
|
||||
<note>
|
||||
<para>注意在没有用户名和密码时,逗号是不能省略的。</para>
|
||||
|
@ -987,9 +987,9 @@ initialContext = new InitialContext(jndiParameters);</programlisting>
|
|||
应为如下所示:</para>
|
||||
<programlisting>
|
||||
<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"/>
|
||||
value="org.apache.activemq.jms.server.recovery.ActiveMQXAResourceRecovery;org.apache.activemq.core.remoting.impl.netty.NettyConnectorFactory, admin, adminpass, port=8888"/>
|
||||
</programlisting>
|
||||
<para>推荐在XA恢复中,将HornetQ配置一个invm接受器,并配置恢复管理器使用invm连接器。</para>
|
||||
<para>推荐在XA恢复中,将ActiveMQ配置一个invm接受器,并配置恢复管理器使用invm连接器。</para>
|
||||
</section>
|
||||
</section>
|
||||
<section>
|
||||
|
|
|
@ -18,21 +18,21 @@
|
|||
<!-- ============================================================================= -->
|
||||
<chapter id="architecture">
|
||||
<title>总体架构</title>
|
||||
<para>本章对HornetQ的总体技术架构进行了概括描述。</para>
|
||||
<para>本章对ActiveMQ的总体技术架构进行了概括描述。</para>
|
||||
<section>
|
||||
<title>核心架构</title>
|
||||
<para>HornetQ的核心是由一组简单Java对象(POJO)构成的。同时在设计HornetQ时将对外部jar包的依赖降到最低限度。
|
||||
实际上HornetQ的核心部分只有一个外部依赖,就是netty.jar。HornetQ使用了其中的用于缓冲的一些类。
|
||||
<para>ActiveMQ的核心是由一组简单Java对象(POJO)构成的。同时在设计ActiveMQ时将对外部jar包的依赖降到最低限度。
|
||||
实际上ActiveMQ的核心部分只有一个外部依赖,就是netty.jar。ActiveMQ使用了其中的用于缓冲的一些类。
|
||||
我们相信这样的理念应该受到用户的欢迎。</para>
|
||||
<para>由于依赖性很小,HornetQ可以非常容易地嵌入到其它应用中,或者加入到一些依赖注入式的框架中,
|
||||
<para>由于依赖性很小,ActiveMQ可以非常容易地嵌入到其它应用中,或者加入到一些依赖注入式的框架中,
|
||||
如JBoss Microcontainer,Spring或Google Guice。</para>
|
||||
<para>每个HornetQ服务器都有自己的超高性能的持久日志(journal)用于消息和其它信息的持久化。</para>
|
||||
<para>每个ActiveMQ服务器都有自己的超高性能的持久日志(journal)用于消息和其它信息的持久化。</para>
|
||||
<para>采用这种独特的高效日志要比采用普通数据库作为持久层的系统拥有更高的性能。</para>
|
||||
<para>通常情况下分布在不同物理机器上的客户端同时访问HornetQ服务器。目前HornetQ提供了两套API供客户端使用:</para>
|
||||
<para>通常情况下分布在不同物理机器上的客户端同时访问ActiveMQ服务器。目前ActiveMQ提供了两套API供客户端使用:</para>
|
||||
<para>
|
||||
<orderedlist>
|
||||
<listitem>
|
||||
<para>核心API。这是一组普通的Java接口,用它可以访问HornetQ的全部功能。</para>
|
||||
<para>核心API。这是一组普通的Java接口,用它可以访问ActiveMQ的全部功能。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>JMS客户端API。这是标准的JMS API。</para>
|
||||
|
@ -40,25 +40,25 @@
|
|||
</orderedlist>
|
||||
</para>
|
||||
<para>实际上JMS API是在核心API的外部加上一层简单的封装。</para>
|
||||
<para>在HornetQ内核是没有JMS的,这样设计的目的是为了支持多个协议。</para>
|
||||
<para>当客户端通过JMS接口访问HornetQ时,所有JMS的操作都被转换成相应的核心API,然后将请求以HornetQ格式发向服务器。</para>
|
||||
<para>HornetQ服务器只接收核心API的访问。</para>
|
||||
<para>在ActiveMQ内核是没有JMS的,这样设计的目的是为了支持多个协议。</para>
|
||||
<para>当客户端通过JMS接口访问ActiveMQ时,所有JMS的操作都被转换成相应的核心API,然后将请求以ActiveMQ格式发向服务器。</para>
|
||||
<para>ActiveMQ服务器只接收核心API的访问。</para>
|
||||
<para>图3.1描述了这些操作。</para>
|
||||
<para>
|
||||
<graphic fileref="images/architecture1.jpg" align="center"/>
|
||||
</para>
|
||||
<para>在图3.1中示出了两个用户访问HornetQ服务器。用户1使用JMS API,用户2使用的是核心API。</para>
|
||||
<para>在图3.1中示出了两个用户访问ActiveMQ服务器。用户1使用JMS API,用户2使用的是核心API。</para>
|
||||
<para>图中清楚的展示出了JMS是如何通过封装(facade)转化为核心API的。</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>将HornetQ嵌入到你的应用程序中</title>
|
||||
<para>如果你的应用程序内部需要消息服务,但同时你又不想将消息服务暴露为单独的HornetQ服务器,你可以在应用中直接将HornetQ实例化。</para>
|
||||
<para>有关嵌入式HornetQ的详细信息请参阅 <xref linkend="embedding-hornetq"
|
||||
<title>将ActiveMQ嵌入到你的应用程序中</title>
|
||||
<para>如果你的应用程序内部需要消息服务,但同时你又不想将消息服务暴露为单独的ActiveMQ服务器,你可以在应用中直接将ActiveMQ实例化。</para>
|
||||
<para>有关嵌入式ActiveMQ的详细信息请参阅 <xref linkend="embedding-hornetq"
|
||||
/>。</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>将HornetQ与JEE应用服务器集成</title>
|
||||
<para>HornetQ提供了标准的JCA适配器,利用它可以将HornetQ轻松地集成到任何一个符合JEE规范的应用服务器或servlet容器中。</para>
|
||||
<title>将ActiveMQ与JEE应用服务器集成</title>
|
||||
<para>ActiveMQ提供了标准的JCA适配器,利用它可以将ActiveMQ轻松地集成到任何一个符合JEE规范的应用服务器或servlet容器中。</para>
|
||||
<para>JEE应用服务品提供了消息Bean(MDB)用于处理来自外部的消息,比如来自JMS系统或邮件系统的消息。</para>
|
||||
<para>最常见的应用应该是用MDB来接收来自JMS系统中的消息了。在JEE规范中规定了JEE应用服务器使用JCA adaptor与JMS消息系统集成,
|
||||
MDB通过这个adaptor来接收消息。</para>
|
||||
|
@ -66,8 +66,8 @@
|
|||
实际上JEE规范中不允许在JEE服务器中不通过JCA而直接访问JMS系统。</para>
|
||||
<para>在EJB中使用消息往往需要连接池或交易,而JCA可以提供这方面的服务,无需额外的开发任务。当然直接访问JMS系统是可能的,
|
||||
但是你将不能利用JCA所提供的这些有用的功能,因此我们不建议使用直接访问的方式。</para>
|
||||
<para>图3.2给出了HornetQ通过JCA adaptor与JEE应用服务器集成的示意图。图中可以看出所有的交互都通过JCA adaptor。</para>
|
||||
<para>图中带有禁止符号的箭头表明的是从EJB会话Bean直接访问HornetQ的情况。由于不通过JCA,这种方法往往造成每次EJB访问HornetQ都要新建一个连接和会话,
|
||||
<para>图3.2给出了ActiveMQ通过JCA adaptor与JEE应用服务器集成的示意图。图中可以看出所有的交互都通过JCA adaptor。</para>
|
||||
<para>图中带有禁止符号的箭头表明的是从EJB会话Bean直接访问ActiveMQ的情况。由于不通过JCA,这种方法往往造成每次EJB访问ActiveMQ都要新建一个连接和会话,
|
||||
使效率大降低。这被视为反设计模式(anti-pattern)。</para>
|
||||
<para>
|
||||
<graphic fileref="images/architecture2.jpg"/>
|
||||
|
@ -75,17 +75,17 @@
|
|||
<para><xref linkend="appserver-integration"/>对如何使用JCA给出了更加详细的描述。</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>HornetQ作为独立的服务(standalone)</title>
|
||||
<para>HornetQ可以部署成为独立的服务器。它可运行于任何JEE应用服务器之外,作为一个独立的服务运行。
|
||||
作为独立服务器运行时,HornetQ消息服务器包括一个核心服务器,一个JMS服务以及一个JNDI服务。</para>
|
||||
<title>ActiveMQ作为独立的服务(standalone)</title>
|
||||
<para>ActiveMQ可以部署成为独立的服务器。它可运行于任何JEE应用服务器之外,作为一个独立的服务运行。
|
||||
作为独立服务器运行时,ActiveMQ消息服务器包括一个核心服务器,一个JMS服务以及一个JNDI服务。</para>
|
||||
<para>JMS服务用来部署服务器端<literal>hornetq-jms.xml</literal>配置文件中的JMS Queue,Topic和ConnectionFactory实例。
|
||||
此外它还提供一组简单的管理接口,通过这些接口可以创建、消毁(destroy)Queue,Topic和ConnectionFactory实例。
|
||||
用于可以通过JMX或连接使用这些接口。JMS服务是单独的服务,它不是HornetQ核心服务。HornetQ的核心不包含JMS相关的服务。
|
||||
用于可以通过JMX或连接使用这些接口。JMS服务是单独的服务,它不是ActiveMQ核心服务。ActiveMQ的核心不包含JMS相关的服务。
|
||||
如果你不需要通过服务器端的xml配置文件部署任何JMS对象,也不需要JMS的管理接口,你可以选择不启动该服务。</para>
|
||||
<para>启动JNDI服务的目的是因为JMS需要通过JNDI来获得Queue,Topic以及ConnectionFactory。如果不需要,也可以选择不启动该服务。</para>
|
||||
<para>HornetQ允许在客户端程序中通过编程来直接创建各种JMS对象和核心对象来代替JNDI查找,所以JNDI不是必需的。
|
||||
HornetQ采用JBoss Microcontainer来引导并实例化服务,并保证模块之间的依赖关系。JBoss Microcontainer是一个轻量级的POJO引导器(bootstrapper)。</para>
|
||||
<para>图3.3给出了HornetQ独立服务器的架构。</para>
|
||||
<para>ActiveMQ允许在客户端程序中通过编程来直接创建各种JMS对象和核心对象来代替JNDI查找,所以JNDI不是必需的。
|
||||
ActiveMQ采用JBoss Microcontainer来引导并实例化服务,并保证模块之间的依赖关系。JBoss Microcontainer是一个轻量级的POJO引导器(bootstrapper)。</para>
|
||||
<para>图3.3给出了ActiveMQ独立服务器的架构。</para>
|
||||
<para>
|
||||
<graphic fileref="images/architecture3.jpg"/>
|
||||
</para>
|
||||
|
|
|
@ -18,15 +18,15 @@
|
|||
<!-- ============================================================================= -->
|
||||
<chapter id="client-classpath">
|
||||
<title>客户端的Classpath</title>
|
||||
<para>HornetQ的<emphasis>客户端Classpath</emphasis>需要有几个jar文件。具体是哪几个要根据客户端
|
||||
<para>ActiveMQ的<emphasis>客户端Classpath</emphasis>需要有几个jar文件。具体是哪几个要根据客户端
|
||||
是需要内核API、JMS和JNDI中的哪些服务来确定。</para>
|
||||
<warning>
|
||||
<para>本章所提及的所有jar文件全部在HorneQ发布包的 <literal>lib</literal>目录下。在使用中一定
|
||||
要确保所有的jar文件属于同一个发布版本。将不同版本的jar混在一起使用可能造成一些难以发现的错误。</para>
|
||||
</warning>
|
||||
<section>
|
||||
<title>使用HornetQ内核的客户端</title>
|
||||
<para>如果客户端只使用HornetQ内核(非JMS客户端),需要将 <literal
|
||||
<title>使用ActiveMQ内核的客户端</title>
|
||||
<para>如果客户端只使用ActiveMQ内核(非JMS客户端),需要将 <literal
|
||||
>hornetq-core-client.jar</literal>和
|
||||
<literal>netty.jar</literal> 放到classpath中。</para>
|
||||
</section>
|
||||
|
@ -41,7 +41,7 @@
|
|||
</section>
|
||||
<section>
|
||||
<title>需要JNDI的JMS客户端</title>
|
||||
<para>如果你的JMS客户端使用JNDI来查找HornetQ单独服务器上的对象,你需要将 <literal>jnp-client.jar</literal> 增加
|
||||
<para>如果你的JMS客户端使用JNDI来查找ActiveMQ单独服务器上的对象,你需要将 <literal>jnp-client.jar</literal> 增加
|
||||
到你的classpath中。</para>
|
||||
</section>
|
||||
</chapter>
|
||||
|
|
|
@ -18,12 +18,12 @@
|
|||
<!-- ============================================================================= -->
|
||||
<chapter id="client-reconnection">
|
||||
<title>客户端重新连接与会话恢复</title>
|
||||
<para>通过配置,HornetQ的客户端在与服务器的连接出现故障时,可以自动地重新建立连接并恢复与服务器的通迅。</para>
|
||||
<para>通过配置,ActiveMQ的客户端在与服务器的连接出现故障时,可以自动地重新建立连接并恢复与服务器的通迅。</para>
|
||||
<section>
|
||||
<title>100%透明的会话恢复(re-attachment)</title>
|
||||
<para>如果网络出现暂时性连接故障,并且服务器没有重启的情况下,当前的会话还会存在服务器中,其状态如同客户端
|
||||
没有断开超过连接TTL<xref linkend="connection-ttl"/>时间。</para>
|
||||
<para>在这种情况下,当客户端重新连接上服务器后,HornetQ自动将客户端和会话与服务器端的会话重新连接起来。整个过程
|
||||
<para>在这种情况下,当客户端重新连接上服务器后,ActiveMQ自动将客户端和会话与服务器端的会话重新连接起来。整个过程
|
||||
对于客户端是完全透明的,在客户端就好像什么都没有发生一样。</para>
|
||||
<para>具体工作原理如下:</para>
|
||||
<para>客户端再向服务器发送命令时,它将每个命令保存到内存的一块缓存中。当连接出现故障时客户端会尝试与该服务
|
||||
|
@ -36,7 +36,7 @@
|
|||
<para>如果使用JMS服务,并且JMS的连接工厂是注册到JNDI的话,相应的参数是<literal
|
||||
>hornetq-jms.xml</literal>文件中的<literal
|
||||
>confirmation-window-size</literal>项。如果你并不将JMS连接工厂注册到JNDI,则你需要在
|
||||
<literal>HornetQConnectionFactory</literal>上使用相应的方法直接设置该参数。</para>
|
||||
<literal>ActiveMQConnectionFactory</literal>上使用相应的方法直接设置该参数。</para>
|
||||
<para>如果使用核心服务,你可以直接在<literal>ClientSessionFactory</literal>实例上直接设置该参数。</para>
|
||||
<para>参数的单位是字节。</para>
|
||||
<para>如果该参数是值设为<literal>-1</literal>,则关闭缓存,即关闭了重新恢复功能,迫使进行重新连接。默认
|
||||
|
@ -45,7 +45,7 @@
|
|||
<section>
|
||||
<title>会话重新连接</title>
|
||||
<para>有时服务器发生故障后进行了重启。这时服务器将丢失所有当前的会话,上面所述的会话恢复就不能做到完全透明了。</para>
|
||||
<para>在这种情况下,HornetQ自动地重新建立连接并<emphasis role="italic">重新创建</emphasis>会话
|
||||
<para>在这种情况下,ActiveMQ自动地重新建立连接并<emphasis role="italic">重新创建</emphasis>会话
|
||||
和接收者。这一过程与向备份服务器进行失效备援(failover)完全一样。</para>
|
||||
<para>客户重新连接的功能还用在其它一些模块上,如核心桥,以使它们能够重新连接到目标服务器上。</para>
|
||||
<para>要全面理解事务性会话和非事务性会话在失效备援/重连接情况下的细节,以及如何保证<emphasis role="italic">
|
||||
|
@ -100,7 +100,7 @@
|
|||
</connection-factory>
|
||||
</programlisting>
|
||||
<para>如果使用JMS但是直接实例化JMS连接工厂,你可以使用适当的方法在 <literal
|
||||
>HornetQConnectionFactory</literal> 对象上直接设置这些参数。</para>
|
||||
>ActiveMQConnectionFactory</literal> 对象上直接设置这些参数。</para>
|
||||
<para>如果使用核心接口直接创建 <literal
|
||||
>ClientSessionFactory</literal>实例,则用它的适当的方法可以设置这些参数。</para>
|
||||
<para>如果客户端重新连接后发现会话已经丢失(如服务器重启或超时),则无法完成恢复。如果在连接上或会话上注册了
|
||||
|
|
|
@ -20,15 +20,15 @@
|
|||
<title>集群</title>
|
||||
<section>
|
||||
<title>集群概述</title>
|
||||
<para>HornetQ集群是由一组HornetQ服务器组成的集合,它们协同合作进行消息处理。集群中每个主节点就是一个
|
||||
HornetQ服务器,它管理自己的连接并处理自己的消息。要将一个HornetQ服务器配置为集群服务器,需要将配置
|
||||
<para>ActiveMQ集群是由一组ActiveMQ服务器组成的集合,它们协同合作进行消息处理。集群中每个主节点就是一个
|
||||
ActiveMQ服务器,它管理自己的连接并处理自己的消息。要将一个ActiveMQ服务器配置为集群服务器,需要将配置
|
||||
文件<literal>activemq-configuration.xml</literal>中<literal>clustered</literal>的值设
|
||||
为<literal>true</literal>。默认值是<literal>false</literal>。</para>
|
||||
<para>要组成一个集群,每个节点都要在其核心配置文件<literal>activemq-configuration.xml</literal>
|
||||
中声明<emphasis>集群连接</emphasis>,用来建立与集群中其它节点的通迅。每两个节点间都是通过内部的一个
|
||||
<emphasis>核心桥</emphasis>(参见<xref linkend="core-bridges" />)连接的。这些连接的建立是
|
||||
透明的--你不需要为每个连接显式地声明一个桥。集群连接的作用是在集群的各个节点间进行负载平衡。</para>
|
||||
<para>HornetQ可以采用不同的拓扑结构来组成集群。本章后面将讲述几种常用的拓扑结构。</para>
|
||||
<para>ActiveMQ可以采用不同的拓扑结构来组成集群。本章后面将讲述几种常用的拓扑结构。</para>
|
||||
<para>我们还将讨论客户端的负载均衡--客户端如何均衡其与集群各节点的连接,以及消息的再分配--在节点间合理
|
||||
的分配消息以避免消息匮乏(starvation)。</para>
|
||||
<para>本章还涉及集群的另一个重要方面--<emphasis>服务器发现</emphasis>,即服务器通过广播的方式将
|
||||
|
@ -58,7 +58,7 @@
|
|||
<para>广播组包括了一系列的连接器对。每个连接器对由主服务器的连接器和备份(可选)服务器连接器信息组成。
|
||||
广播组还定义了所使用的UDP的在址和端口信息。</para>
|
||||
<para>广播组的配置中服务器配置文件<literal
|
||||
>activemq-configuration.xml</literal>中。一个HornetQ服务器可以有多个广播组。所有的广播组
|
||||
>activemq-configuration.xml</literal>中。一个ActiveMQ服务器可以有多个广播组。所有的广播组
|
||||
必需定义在<literal>broadcast-groups</literal>内。</para>
|
||||
<para>让我们来看一个<literal>activemq-configuration.xml</literal>文件中广播组的例子:</para>
|
||||
<programlisting><broadcast-groups>
|
||||
|
@ -115,7 +115,7 @@
|
|||
<para>一个发现组包括了一系列的连接器对--每个连接器对代表一个不同的服务器广播的连接器信息。每当接收一次广播,
|
||||
这个连接对的列表就被更新一次。</para>
|
||||
<para>如果在一定时间内没有收到某个服务器的广播,则其相应的连接器对将从列表中删除。</para>
|
||||
<para>发现组在HornetQ中有两处应用:</para>
|
||||
<para>发现组在ActiveMQ中有两处应用:</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>在创建集群连接时用来判断集群中哪些服务器是可以连接的。</para>
|
||||
|
@ -164,7 +164,7 @@
|
|||
</section>
|
||||
<section id="clusters-discovery.groups.clientside">
|
||||
<title>客户端的发现组</title>
|
||||
<para>现在讨论如何配置HornetQ客户端来发现可以连接的服务器列表。使用JMS时所用的方法与使用核心接口时所用的
|
||||
<para>现在讨论如何配置ActiveMQ客户端来发现可以连接的服务器列表。使用JMS时所用的方法与使用核心接口时所用的
|
||||
方法有所不同。</para>
|
||||
<section>
|
||||
<title>使用JMS时客户端发现的配置方法</title>
|
||||
|
@ -186,7 +186,7 @@
|
|||
final int groupPort = 9876;
|
||||
|
||||
ConnectionFactory jmsConnectionFactory =
|
||||
HornetQJMSClient.createConnectionFactory(groupAddress, groupPort);
|
||||
ActiveMQJMSClient.createConnectionFactory(groupAddress, groupPort);
|
||||
|
||||
Connection jmsConnection1 = jmsConnectionFactory.createConnection();
|
||||
|
||||
|
@ -205,7 +205,7 @@ Connection jmsConnection2 = jmsConnectionFactory.createConnection();</programlis
|
|||
<programlisting>
|
||||
final String groupAddress = "231.7.7.7";
|
||||
final int groupPort = 9876;
|
||||
SessionFactory factory = HornetQClient.createClientSessionFactory(groupAddress, groupPort);
|
||||
SessionFactory factory = ActiveMQClient.createClientSessionFactory(groupAddress, groupPort);
|
||||
ClientSession session1 = factory.createClientSession(...); ClientSession
|
||||
session2 = factory.createClientSession(...);
|
||||
|
||||
|
@ -222,7 +222,7 @@ Connection jmsConnection2 = jmsConnectionFactory.createConnection();</programlis
|
|||
</section>
|
||||
<section>
|
||||
<title>服务器端消息的负载均衡</title>
|
||||
<para>如果集群和各节点间定义了集群连接,HornetQ可以对到达一个节点的消息进行负载均衡。</para>
|
||||
<para>如果集群和各节点间定义了集群连接,ActiveMQ可以对到达一个节点的消息进行负载均衡。</para>
|
||||
<para>举一个简单的例子。一个集群有4个节点,分别称为节点A、B、C和节点D。它们组成了一个
|
||||
<emphasis>对称式集群</emphasis>(有关对称式集群参见<xref linkend="symmetric-cluster" />)。
|
||||
在每个节点上部署了一个名为<literal>OrderQueue</literal>的队列。</para>
|
||||
|
@ -233,14 +233,14 @@ Connection jmsConnection2 = jmsConnectionFactory.createConnection();</programlis
|
|||
<literal>OrderQueue</literal>队列中。这种消息分配完全在服务器端完成,客户端只向节点A发送消息。</para>
|
||||
<para>例如到达节点A的消息可能以下列顺序进行分配:B、D、C、A、B、D、C、A、B、D。具体的顺序取决于节点启动的
|
||||
先后,但是其算法是不变的(即round-robin)。</para>
|
||||
<para>HornetQ集群连接在进行消息负载均衡时,可以配置成统一负载均衡模式,即不管各个节点上有无合适的接收者,一律在
|
||||
<para>ActiveMQ集群连接在进行消息负载均衡时,可以配置成统一负载均衡模式,即不管各个节点上有无合适的接收者,一律在
|
||||
所有节点间进行消息的分配。也可以配置成为智能负载均衡模式,即只将消息分配到有合适接收者的节点上。这两种模式我们
|
||||
都将举例说明。首先我们先介绍一般的集群连接配置。</para>
|
||||
<section id="clusters.cluster-connections">
|
||||
<title>配置集群连接</title>
|
||||
<para>集群连接将一组服务器连接成为一个集群,消息可以在集群的节点之间进行负载均衡。集群连接的配置在
|
||||
<literal>activemq-configuration.xml</literal>文件中的
|
||||
<literal>cluster-connection</literal>内。一个HornetQ服务器可以有零个或多个集群连接。
|
||||
<literal>cluster-connection</literal>内。一个ActiveMQ服务器可以有零个或多个集群连接。
|
||||
下面是一个典型的例子:</para>
|
||||
<programlisting>
|
||||
<cluster-connections>
|
||||
|
@ -262,9 +262,9 @@ Connection jmsConnection2 = jmsConnectionFactory.createConnection();</programlis
|
|||
<para>本例中的集群连接只对发往以<literal>jms</literal>为开始的地址的消息进行负载均衡的
|
||||
处理。这个集群连接实际上能够处理所有JMS队列和话题的订阅中的消息,这是国为所有JMS的队列
|
||||
或订阅都映射到内核中以“jms“开头的队列。</para>
|
||||
<para>这个地址可以为任何值,而且可以配置多个集群连接,每个连接的地址值可以不同。这样HornetQ
|
||||
<para>这个地址可以为任何值,而且可以配置多个集群连接,每个连接的地址值可以不同。这样ActiveMQ
|
||||
可以同时对不同地址同时进行消息的负载均衡。有的地址甚至可能在其它集群的节点中。这也就意谓着
|
||||
一个HornetQ服务器可以同时参与到多个集群中。</para>
|
||||
一个ActiveMQ服务器可以同时参与到多个集群中。</para>
|
||||
<para>要注意别造成多个集群连接的地址互相重复。比如,地址“europe“和”europe.news“就互相重复,
|
||||
就会造成同一个消息会被多个集群连接进行分配,这样有可能发生重复传递。</para>
|
||||
<para>本参数是必须指定的。</para>
|
||||
|
@ -291,16 +291,16 @@ Connection jmsConnection2 = jmsConnectionFactory.createConnection();</programlis
|
|||
的节点分配消息。即不管有没有合适的接收者,消息在所有的节点间轮流分配。</para>
|
||||
<para>如果这个参数设为<literal>true</literal>,则消息就会轮流在每个节点间分配,不管是否
|
||||
节点上有没有相应的接收者(或者有接收者但是具有不匹配的选择器)。注意,如果其它节点中没有
|
||||
与本节点同名的队列,HornetQ不会将消息转发到那些节点中去,不受本参数的限制。</para>
|
||||
<para>如果参数设为<literal>false</literal>, HornetQ中将消息转发到集群中那些有着适合接收者
|
||||
与本节点同名的队列,ActiveMQ不会将消息转发到那些节点中去,不受本参数的限制。</para>
|
||||
<para>如果参数设为<literal>false</literal>, ActiveMQ中将消息转发到集群中那些有着适合接收者
|
||||
的节点中。如果接收者有选择器,则至少有一个选择器与所转发的消息匹配才可,否则不转发。</para>
|
||||
<para>本参数是可选的,默认值是<literal>false</literal>。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>max-hops</literal>。当一个集群连接在确定进行消息负载均衡的节点组时,这些
|
||||
节点不一定是与本节点直接相连的节点。HornetQ可以通过其它HornetQ节点作为中介向那些非直接相
|
||||
节点不一定是与本节点直接相连的节点。ActiveMQ可以通过其它ActiveMQ节点作为中介向那些非直接相
|
||||
连的节点转发消息。</para>
|
||||
<para>这样可以使HornetQ组成更加复杂的拓扑结构并且仍可提供消息的负载均衡。在本章的后面我们还要作
|
||||
<para>这样可以使ActiveMQ组成更加复杂的拓扑结构并且仍可提供消息的负载均衡。在本章的后面我们还要作
|
||||
进一步的讨论。</para>
|
||||
<para>本参数是可选参数,它的默认值是 <literal>1</literal>,表示消息只向直接相连的节点进行负载均衡。</para>
|
||||
</listitem>
|
||||
|
@ -312,22 +312,21 @@ Connection jmsConnection2 = jmsConnectionFactory.createConnection();</programlis
|
|||
</section>
|
||||
<section id="clusters.clusteruser">
|
||||
<title>集群用户的安全信息</title>
|
||||
|
||||
<para>当集群中两个节点建立连接时,HornetQ使用一个集群用户和集群密码。它们定义在
|
||||
<para>当集群中两个节点建立连接时,ActiveMQ使用一个集群用户和集群密码。它们定义在
|
||||
<literal>activemq-configuration.xml</literal>文件中:</para>
|
||||
<programlisting>
|
||||
<cluster-user>HORNETQ.CLUSTER.ADMIN.USER</cluster-user>
|
||||
<cluster-password>CHANGE ME!!</cluster-password>
|
||||
</programlisting>
|
||||
<warning><para>强烈建议在实际应用中不要使用默认的值,否则任意远程客户端会使用这些默认值连接到服务器上。当使用默认值时,
|
||||
HornetQ会检测到并在每次启动的时候给出警告。</para></warning>
|
||||
ActiveMQ会检测到并在每次启动的时候给出警告。</para></warning>
|
||||
</section>
|
||||
</section>
|
||||
<section id="clusters.client.loadbalancing">
|
||||
<title>客户端负载均衡</title>
|
||||
<para>HornetQ的客户端负载均衡使同一个会话工厂每次创建一个会话时,都连接到集群不同的节点上。这样可以使所的有会话
|
||||
<para>ActiveMQ的客户端负载均衡使同一个会话工厂每次创建一个会话时,都连接到集群不同的节点上。这样可以使所的有会话
|
||||
均匀分布在集群的各个节点上,而不会‘拥挤’到某一个节点上。</para>
|
||||
<para>客户端负载均衡的策略是可配置的。HornetQ提供两种现成的负载均衡策略。你也可以实现自己的策略。</para>
|
||||
<para>客户端负载均衡的策略是可配置的。ActiveMQ提供两种现成的负载均衡策略。你也可以实现自己的策略。</para>
|
||||
<para>两种现成的策略是:</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
|
@ -356,14 +355,14 @@ Connection jmsConnection2 = jmsConnectionFactory.createConnection();</programlis
|
|||
</connection-factory>
|
||||
</programlisting>上面的配置将部署一个连接工厂,它的连接负载均衡策略是随机策略。</para>
|
||||
<para>如果使用JMS,但是你在客户端是直接创建连接工厂的实例,那么你需要用相应的方法在<literal
|
||||
>HornetQConnectionFactory</literal>上直接设置:
|
||||
>ActiveMQConnectionFactory</literal>上直接设置:
|
||||
<programlisting>
|
||||
ConnectionFactory jmsConnectionFactory = HornetQJMSClient.createConnectionFactory(...);
|
||||
ConnectionFactory jmsConnectionFactory = ActiveMQJMSClient.createConnectionFactory(...);
|
||||
jmsConnectionFactory.setLoadBalancingPolicyClassName("com.acme.MyLoadBalancingPolicy");
|
||||
</programlisting></para>
|
||||
<para>如果你使用核心接口的话,你要直接在<literal>ClientSessionFactory</literal>上设置策略:
|
||||
<programlisting>
|
||||
ClientSessionFactory factory = HornetQClient.createClientSessionFactory(...);
|
||||
ClientSessionFactory factory = ActiveMQClient.createClientSessionFactory(...);
|
||||
factory.setLoadBalancingPolicyClassName("com.acme.MyLoadBalancingPolicy");
|
||||
</programlisting></para>
|
||||
<para>连接工厂进行负载均衡的服务器组可以有两种方法来确定:</para>
|
||||
|
@ -409,7 +408,7 @@ factory.setLoadBalancingPolicyClassName("com.acme.MyLoadBalancingPolicy");
|
|||
<literal>activemq-configuration.xml</literal>文件中定义的一个连接器。
|
||||
有关连接器更多的信息参见<xref linkend="configuring-transports" />。</para>
|
||||
<para>连接工厂这样就保存有一组[连接器, 备份连接器]对,用于客户端在创建连接时的负载均衡。</para>
|
||||
<para>如果你使用JMS,但不使用JNDI,你可以直接创建<literal>HornetQConnectionFactory</literal>
|
||||
<para>如果你使用JMS,但不使用JNDI,你可以直接创建<literal>ActiveMQConnectionFactory</literal>
|
||||
的实例,然后用相应的方法来设定连接器对列表,如下例:<programlisting>List<Pair<TransportConfiguration, TransportConfiguration>> serverList =
|
||||
new ArrayList<Pair<TransportConfiguration, TransportConfiguration>>();
|
||||
|
||||
|
@ -420,14 +419,14 @@ serverList.add(new Pair<TransportConfiguration,
|
|||
serverList.add(new Pair<TransportConfiguration,
|
||||
TransportConfiguration>(liveTC2, backupTC2));
|
||||
|
||||
ConnectionFactory jmsConnectionFactory = HornetQJMSClient.createConnectionFactory(serverList);
|
||||
ConnectionFactory jmsConnectionFactory = ActiveMQJMSClient.createConnectionFactory(serverList);
|
||||
|
||||
Connection jmsConnection1 = jmsConnectionFactory.createConnection();
|
||||
|
||||
Connection jmsConnection2 = jmsConnectionFactory.createConnection();</programlisting></para>
|
||||
<para>上面的代码中我们创建了一组<literal>TransportConfiguration</literal>对象。每个
|
||||
<literal>TransportConfiguration</literal>对象包括了如何连接某个特定服务器的信息。</para>
|
||||
<para>然后,使用这个服务器列表创建了一个<literal>HornetQConnectionFactory</literal>实例。
|
||||
<para>然后,使用这个服务器列表创建了一个<literal>ActiveMQConnectionFactory</literal>实例。
|
||||
这样通过这个工厂创建的连接就可以使用这个列表,由所用的客户连接负载均衡策略来进行连接的负载均衡。</para>
|
||||
</section>
|
||||
<section>
|
||||
|
@ -444,7 +443,7 @@ serverList.add(new Pair<TransportConfiguration,
|
|||
serverList.add(new Pair<TransportConfiguration,
|
||||
TransportConfiguration>(liveTC2, backupTC2));
|
||||
|
||||
ClientSessionFactory factory = HornetQClient.createClientSessionFactory(serverList);
|
||||
ClientSessionFactory factory = ActiveMQClient.createClientSessionFactory(serverList);
|
||||
|
||||
ClientSession sesison1 = factory.createClientSession(...);
|
||||
|
||||
|
@ -452,7 +451,7 @@ ClientSession session2 = factory.createClientSession(...);</programlisting>
|
|||
<para>在上面的代码中我们创建了一组<literal>ClientSessionFactoryImpl</literal>对象。每个
|
||||
<literal>TransportConfiguration</literal>对象包括了如何连接某个特定服务器的信息。
|
||||
有关信息请参见<xref linkend="configuring-transports" />。</para>
|
||||
<para>然后,使用这个服务器列表创建了一个<literal>HornetQConnectionFactory</literal>实例。
|
||||
<para>然后,使用这个服务器列表创建了一个<literal>ActiveMQConnectionFactory</literal>实例。
|
||||
这样通过这个工厂创建的会话就可以使用这个列表,由所用的客户连接负载均衡策略来进行连接的负载均衡。</para>
|
||||
</section>
|
||||
</section>
|
||||
|
@ -481,7 +480,7 @@ ClientSession session2 = factory.createClientSession(...);</programlisting>
|
|||
<literal>activemq-configuration.xml</literal>文件中定义的一个连接器。
|
||||
有关连接器的详细信息参见<xref linkend="configuring-transports" />。</para>
|
||||
<note>
|
||||
<para>由于HornetQ 2.0.0的限制,使用静态节点列表的集群不支持失效备援(failover)。要想支持失效备援,
|
||||
<para>由于ActiveMQ 2.0.0的限制,使用静态节点列表的集群不支持失效备援(failover)。要想支持失效备援,
|
||||
就必须使用发现组。</para>
|
||||
</note>
|
||||
</section>
|
||||
|
@ -493,7 +492,7 @@ ClientSession session2 = factory.createClientSession(...);</programlisting>
|
|||
这样可以有效避免了消息被送到一个不可能被接收的节点上。但仍然有一个问题无法解决:就是如果在消息发到一个节点后,
|
||||
它的接收者被关闭,那么这些消息仍然不能被接收了,造成了一种消息<emphasis>匮乏</emphasis>情形。
|
||||
这种情况下如何处理?</para>
|
||||
<para>这里就需要消息再分配功能。通过配置,HornetQ可以将没有接收者的队列中的消息<emphasis>再次分配</emphasis>
|
||||
<para>这里就需要消息再分配功能。通过配置,ActiveMQ可以将没有接收者的队列中的消息<emphasis>再次分配</emphasis>
|
||||
到有接收者的节点上去。</para>
|
||||
<para>通过配置,消息可以在队列最后一个接收者关闭时立即进行,也可以配置成等待一段时间再进行。默认消息再分配功能是
|
||||
关闭的。</para>
|
||||
|
@ -509,7 +508,7 @@ ClientSession session2 = factory.createClientSession(...);</programlisting>
|
|||
>redistribution-delay</literal>值为<literal>0</literal>。它适用于所有以“jms“开头的
|
||||
地址。由于所有JMS队列与话题订阅都绑定到以”jms“为开头的地址,所以上述配置的立即方式(没有延迟)消息
|
||||
再分配适用于所有的JMS队列和话题订阅。</para>
|
||||
<para><literal>match</literal>属性可以是精确匹配,也可以使用通配符。通配符要符合HornetQ的通配符
|
||||
<para><literal>match</literal>属性可以是精确匹配,也可以使用通配符。通配符要符合ActiveMQ的通配符
|
||||
语法(在<xref linkend="wildcard-syntax"
|
||||
/>中描述)。</para>
|
||||
<para><literal>redistribution-delay</literal>定义了队列最后一个接收者关闭后在进行消息再分配前所等待的
|
||||
|
@ -520,7 +519,7 @@ ClientSession session2 = factory.createClientSession(...);</programlisting>
|
|||
</section>
|
||||
<section>
|
||||
<title>集群拓扑结构</title>
|
||||
<para>HornetQ集群可以有多种拓扑结构。我们来看两个最常见的结构。</para>
|
||||
<para>ActiveMQ集群可以有多种拓扑结构。我们来看两个最常见的结构。</para>
|
||||
<section id="symmetric-cluster">
|
||||
<title>对称式集群</title>
|
||||
<para>对称式集群可能是最常见的集群方式了。如果你接触过JBoss应用服务器的集群,你就对这种方式很熟悉。</para>
|
||||
|
|
|
@ -18,12 +18,12 @@
|
|||
<!-- ============================================================================= -->
|
||||
<chapter id="configuration-index">
|
||||
<title>配置参数索引</title>
|
||||
<para>本章给出了HornetQ配置参数的索引,以便查阅。点击任意一个配置参数可以转到其所属的章节。</para>
|
||||
<para>本章给出了ActiveMQ配置参数的索引,以便查阅。点击任意一个配置参数可以转到其所属的章节。</para>
|
||||
<section id="server.configuration">
|
||||
<title>服务器配置</title>
|
||||
<section>
|
||||
<title>activemq-configuration.xml</title>
|
||||
<para>HornetQ主要核心服务器配置文件</para>
|
||||
<para>ActiveMQ主要核心服务器配置文件</para>
|
||||
<table frame="topbot" border="2">
|
||||
<title>服务器配置</title>
|
||||
<tgroup cols="4">
|
||||
|
@ -194,7 +194,7 @@
|
|||
<entry><link linkend="management.jmx.configuration"
|
||||
>jmx-domain</link></entry>
|
||||
<entry>String</entry>
|
||||
<entry>用于HornetQ MBean注册到MBeanServer的JMX域名</entry>
|
||||
<entry>用于ActiveMQ MBean注册到MBeanServer的JMX域名</entry>
|
||||
<entry>org.apache.activemq</entry>
|
||||
</row>
|
||||
<row>
|
||||
|
|
|
@ -18,11 +18,11 @@
|
|||
<!-- ============================================================================= -->
|
||||
<chapter id="configuring-transports">
|
||||
<title>传输层的配置</title>
|
||||
<para>HornetQ的传输层是“可插拔的”。通过灵活的配置和一套服务提供接口(SPI),HornetQ可以很容易地更换其传输层。</para>
|
||||
<para>在本章中我们将对HornetQ的传输相关的概念作出解释,并说明它的配置方法。</para>
|
||||
<para>ActiveMQ的传输层是“可插拔的”。通过灵活的配置和一套服务提供接口(SPI),ActiveMQ可以很容易地更换其传输层。</para>
|
||||
<para>在本章中我们将对ActiveMQ的传输相关的概念作出解释,并说明它的配置方法。</para>
|
||||
<section id="configuring-transports.acceptors">
|
||||
<title>接收器(Acceptor)</title>
|
||||
<para>接收器(<emphasis>acceptor</emphasis>)是 HornetQ 的传输层中最为重要的概念之一。首先
|
||||
<para>接收器(<emphasis>acceptor</emphasis>)是 ActiveMQ 的传输层中最为重要的概念之一。首先
|
||||
介绍一下在文件<literal>activemq-configuration.xml</literal>中是怎样定义一个接收器的:</para>
|
||||
<programlisting>
|
||||
<acceptors>
|
||||
|
@ -36,12 +36,12 @@ org.apache.activemq.core.remoting.impl.netty.NettyAcceptorFactory
|
|||
</programlisting>
|
||||
<para>所有接收器都在 <literal>acceptors</literal>单元(element)内定义。在<literal>acceptors</literal>
|
||||
内可以有零个或多个接收器的定义。每个服务器所拥有的接收器的数量是没有限制的。</para>
|
||||
<para>每个接收器都要定义其与HornetQ服务器连接的方式。</para>
|
||||
<para>每个接收器都要定义其与ActiveMQ服务器连接的方式。</para>
|
||||
<para>以上的例子中我们定义了一个<ulink
|
||||
url="http://jboss.org/netty">Netty</ulink>接收器。它在端口<literal>5446</literal>监听连接请求。</para>
|
||||
<para>在<literal>acceptor</literal>单元内有一个子单元<literal>factory-class</literal>。这个单元是用来
|
||||
定义创建连接器的工厂类。一个连接器工厂类必须要实现<literal>AcceptorFactory</literal>接口。上例中我们定义
|
||||
的连接器工厂是类NettyAcceptorFactory使用Netty来建立连接。有个这个类定义,HornetQ就知道了用什么传输来建立连接了。</para>
|
||||
的连接器工厂是类NettyAcceptorFactory使用Netty来建立连接。有个这个类定义,ActiveMQ就知道了用什么传输来建立连接了。</para>
|
||||
<para>在<literal>acceptor</literal>中还可以配置零或多个参数<literal>param</literal>。在每个<literal>param</literal>
|
||||
中定义的是键-值对(key-value)。这些参数用来配置某个传输实现。不同传输有不同的配置参数。</para>
|
||||
<para>像IP地址、端口号等都是传输配置参数的例子。</para>
|
||||
|
@ -71,9 +71,9 @@ org.apache.activemq.core.remoting.impl.netty.NettyAcceptorFactory
|
|||
<emphasis>connectors</emphasis>下定义连接器。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>如果你使用JMS服务,需要创建连接工厂的实例并绑定到JNDI。在HornetQ创建
|
||||
<literal>HornetQConnectionFactory</literal>时需要连接器的必要信息,以便这个连接工厂
|
||||
能知道它如何与HornetQ服务器相连接。</para>
|
||||
<para>如果你使用JMS服务,需要创建连接工厂的实例并绑定到JNDI。在ActiveMQ创建
|
||||
<literal>ActiveMQConnectionFactory</literal>时需要连接器的必要信息,以便这个连接工厂
|
||||
能知道它如何与ActiveMQ服务器相连接。</para>
|
||||
<para>这一信息被定义在配置文件<literal
|
||||
>hornetq-jms.xml</literal>中的<literal>connector-ref</literal>单元下。下面这段配置
|
||||
就是从该配置文件中提取的相关部分,它展示了JMS的连接工厂是如何引用定义在配置文件<literal
|
||||
|
@ -111,7 +111,7 @@ TransportConfiguration transportConfiguration =
|
|||
"org.apache.activemq.core.remoting.impl.netty.NettyConnectorFactory",
|
||||
connectionParams);
|
||||
|
||||
ClientSessionFactory sessionFactory = HornetQClient.createClientSessionFactory(transportConfiguration);
|
||||
ClientSessionFactory sessionFactory = ActiveMQClient.createClientSessionFactory(transportConfiguration);
|
||||
|
||||
ClientSession session = sessionFactory.createSession(...);
|
||||
|
||||
|
@ -129,7 +129,7 @@ TransportConfiguration transportConfiguration =
|
|||
"org.apache.activemq.core.remoting.impl.netty.NettyConnectorFactory",
|
||||
connectionParams);
|
||||
|
||||
ConnectionFactory connectionFactory = HornetQJMSClient.createConnectionFactory(transportConfiguration);
|
||||
ConnectionFactory connectionFactory = ActiveMQJMSClient.createConnectionFactory(transportConfiguration);
|
||||
|
||||
Connection jmsConnection = connectionFactory.createConnection();
|
||||
|
||||
|
@ -138,7 +138,7 @@ etc
|
|||
</section>
|
||||
<section>
|
||||
<title>配置 Netty 传输层</title>
|
||||
<para>HornetQ当前使用<ulink url="http://www.jboss.org/netty/"
|
||||
<para>ActiveMQ当前使用<ulink url="http://www.jboss.org/netty/"
|
||||
>Netty</ulink>作为其默认的连接层。Netty是一个高性能的底层网络库.</para>
|
||||
<para>Netty传输的配置有几种不同的方法。它可以使用传统的Java IO(阻塞方式)、NIO(非阻塞)或直接使用
|
||||
TCP socket及SSL。或者使用HTTP或HTTPS协议。同时还可能使用servlet进行传输。</para>
|
||||
|
@ -202,7 +202,7 @@ etc
|
|||
默认值是<literal>32768</literal>字节(32KiB)。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>batch-delay</literal>。HornetQ可以通过配置该参数,在数据包写入传输层之前有一个
|
||||
<para><literal>batch-delay</literal>。ActiveMQ可以通过配置该参数,在数据包写入传输层之前有一个
|
||||
最大延时(毫秒),达到批量写入的目的。这样可以提高小消息的发送效率。但这样做会增加单个消息的平均发送
|
||||
延迟。默认值为<literal>0</literal>毫秒。</para>
|
||||
</listitem>
|
||||
|
@ -214,7 +214,7 @@ etc
|
|||
较大的呑吐量的话,将它设为<literal>false</literal>。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>nio-remoting-threads</literal>。如果使用NIO,默认情况下HornetQ会使用系统中处理
|
||||
<para><literal>nio-remoting-threads</literal>。如果使用NIO,默认情况下ActiveMQ会使用系统中处理
|
||||
器内核(或超线程)数量三倍的线程来处理接收的数据包。内核的数量是通过调用<literal
|
||||
>Runtime.getRuntime().availableProcessors()</literal>来得到的。如果你想改变这个数量,
|
||||
你可以设定本参数。默认的值是<literal>-1</literal>,表示线程数为<literal
|
||||
|
@ -247,7 +247,7 @@ etc
|
|||
</section>
|
||||
<section>
|
||||
<title>配置Netty HTTP</title>
|
||||
<para>Netty HTTP 通过HTTP通道传送数据包。在有些用户环境中防火墙只允许有HTTP通信,这时采用Netty HTTP作为HornetQ
|
||||
<para>Netty HTTP 通过HTTP通道传送数据包。在有些用户环境中防火墙只允许有HTTP通信,这时采用Netty HTTP作为ActiveMQ
|
||||
的传输层就能解决问题。</para>
|
||||
<para>我们提供了一个Netty HTTP的例子来演示其配置和应用。</para>
|
||||
<para>Netty HTTP具有和Netty TCP同样的配置参数,另外它还有以下参数:</para>
|
||||
|
@ -276,14 +276,14 @@ etc
|
|||
</section>
|
||||
<section>
|
||||
<title>配置Netty Servlet</title>
|
||||
<para>HornetQ可以使用Netty servlet来传输消息。使用servlet可以将HornetQ的数据通过HTTP传送到一个
|
||||
运行的servlet,再由servlet转发给HornetQ服务器。</para>
|
||||
<para>servlet与HTTP的不同之处在于,当用HTTP传输时,HornetQ如同一个web服务器,它监听在某个端口上的HTTP
|
||||
请求并返回响应。比如80端口或8080端口。而当使用servlet时,HornetQ的传输数据是通过运行在某一servlet容器
|
||||
<para>ActiveMQ可以使用Netty servlet来传输消息。使用servlet可以将ActiveMQ的数据通过HTTP传送到一个
|
||||
运行的servlet,再由servlet转发给ActiveMQ服务器。</para>
|
||||
<para>servlet与HTTP的不同之处在于,当用HTTP传输时,ActiveMQ如同一个web服务器,它监听在某个端口上的HTTP
|
||||
请求并返回响应。比如80端口或8080端口。而当使用servlet时,ActiveMQ的传输数据是通过运行在某一servlet容器
|
||||
中的一个特定的servlet来转发的。而这个sevlet容器中同时还可能运行其他的应用,如web服务。当一个公司有多个应用
|
||||
但只允许一个http端口可以访问时,servlet传输可以很好的解决HornetQ的传输问题。</para>
|
||||
<para>请参见HornetQ所提供的servlet例子来了解详细的配置方法。</para>
|
||||
<para>要在HornetQ中使用Netty servlet传输方式,需要以下步骤:</para>
|
||||
但只允许一个http端口可以访问时,servlet传输可以很好的解决ActiveMQ的传输问题。</para>
|
||||
<para>请参见ActiveMQ所提供的servlet例子来了解详细的配置方法。</para>
|
||||
<para>要在ActiveMQ中使用Netty servlet传输方式,需要以下步骤:</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>部署servlet。下面是一个web.xml例子:</para>
|
||||
|
@ -292,7 +292,7 @@ etc
|
|||
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
|
||||
version="2.4">
|
||||
<servlet>
|
||||
<servlet-name>HornetQServlet</servlet-name>
|
||||
<servlet-name>ActiveMQServlet</servlet-name>
|
||||
<servlet-class>org.jboss.netty.channel.socket.http.HttpTunnelingServlet</servlet-class>
|
||||
<init-param>
|
||||
<param-name>endpoint</param-name>
|
||||
|
@ -302,8 +302,8 @@ etc
|
|||
</servlet>
|
||||
|
||||
<servlet-mapping>
|
||||
<servlet-name>HornetQServlet</servlet-name>
|
||||
<url-pattern>/HornetQServlet</url-pattern>
|
||||
<servlet-name>ActiveMQServlet</servlet-name>
|
||||
<url-pattern>/ActiveMQServlet</url-pattern>
|
||||
</servlet-mapping>
|
||||
</web-app>
|
||||
|
||||
|
@ -337,7 +337,7 @@ etc
|
|||
<param key="host" value="localhost"/>
|
||||
<param key="port" value="8080"/>
|
||||
<param key="use-servlet" value="true"/>
|
||||
<param key="servlet-path" value="/messaging/HornetQServlet"/>
|
||||
<param key="servlet-path" value="/messaging/ActiveMQServlet"/>
|
||||
</connector>
|
||||
|
||||
</connectors></programlisting>
|
||||
|
@ -357,7 +357,7 @@ etc
|
|||
<param key="host" value="localhost"/>
|
||||
<param key="port" value="8443"/>
|
||||
<param key="use-servlet" value="true"/>
|
||||
<param key="servlet-path" value="/messaging/HornetQServlet"/>
|
||||
<param key="servlet-path" value="/messaging/ActiveMQServlet"/>
|
||||
<param key="ssl-enabled" value="true"/>
|
||||
<param key="key-store-path" value="path to a keystoree"/>
|
||||
<param key="key-store-password" value="keystore password"/>
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
<!-- ============================================================================= -->
|
||||
<chapter id="connection-ttl">
|
||||
<title>失效连接的检测</title>
|
||||
<para>本章将讨论连接的生存时间(TTL)以及HornetQ如何处理出现故障的客户端或者异常退出的客户端(即客户端在
|
||||
<para>本章将讨论连接的生存时间(TTL)以及ActiveMQ如何处理出现故障的客户端或者异常退出的客户端(即客户端在
|
||||
退出时没有合理的关闭相关资源)。</para>
|
||||
<section id="dead.connections">
|
||||
<title>服务器端对失效连接的清除</title>
|
||||
|
@ -31,7 +31,7 @@ ClientSession session = null;
|
|||
|
||||
try
|
||||
{
|
||||
sf = HornetQClient.createClientSessionFactory(...);
|
||||
sf = ActiveMQClient.createClientSessionFactory(...);
|
||||
|
||||
session = sf.createSession(...);
|
||||
|
||||
|
@ -56,7 +56,7 @@ Connection jmsConnection = null;
|
|||
|
||||
try
|
||||
{
|
||||
ConnectionFactory jmsConnectionFactory = HornetQJMSClient.createConnectionFactory(...);
|
||||
ConnectionFactory jmsConnectionFactory = ActiveMQJMSClient.createConnectionFactory(...);
|
||||
|
||||
jmsConnection = jmsConnectionFactory.createConnection();
|
||||
|
||||
|
@ -74,15 +74,15 @@ finally
|
|||
程序突然中断,相关资源也没有来得及关闭!</para>
|
||||
<para>如果上述情况发生了,那么这些资源就会留在服务器端而不会被清理。这就会造成资源泄漏现象并最終导致服务器内存
|
||||
溢出或其它资源的溢出错误。</para>
|
||||
<para>因此在服务器端要有某种机制来避免资源的泄漏。也就是对无效资源进行回收。在判断什么是无效资源时,HornetQ
|
||||
<para>因此在服务器端要有某种机制来避免资源的泄漏。也就是对无效资源进行回收。在判断什么是无效资源时,ActiveMQ
|
||||
考虑到了客户端重新连接的情况。就是当一个连接由于网络临时中断后又恢复正常时,客户端有可能通过不断重试
|
||||
成功地连接到服务器端。如果服务器端过早清除了相关的连接资源,则客户端就可能重试失败。</para>
|
||||
<para>HornetQ的资源回收是完全可配置的。每个 <literal
|
||||
<para>ActiveMQ的资源回收是完全可配置的。每个 <literal
|
||||
>ClientSessionFactory</literal> 有一个<emphasis>连接 TTL</emphasis>的参数。
|
||||
这个参数的意义是当客户端的一个连接没有任何数到达服务器时,服务器充许这个连接有效的最长时间。客户端通过定
|
||||
时向服务器端发送“ping“数据包来维持连接的有效,以免被服务器关掉。如果服务器在TTL指定的时间内没有收到任何
|
||||
数据包,则认为该连接无效,继而关闭与该连接相关的所有的会话(session)。</para>
|
||||
<para>如果使用JMS,<literal>HornetQConnectionFactory</literal>的<literal>ConnectionTTL</literal>
|
||||
<para>如果使用JMS,<literal>ActiveMQConnectionFactory</literal>的<literal>ConnectionTTL</literal>
|
||||
属性是用来定义连接的存活时间的。如果你将JMS连接工厂部署到JNDI中,则应使用配置文件中的<literal
|
||||
>connection-ttl</literal>参数来定义连接的TTL。</para>
|
||||
<para>默认的连接TTL值是<literal>60000</literal>毫秒,即一分钟。 <literal>ConnectionTTL</literal>
|
||||
|
@ -93,7 +93,7 @@ finally
|
|||
<section>
|
||||
<title>关闭没有被成功关闭的核心会话或JMS连接</title>
|
||||
<para>如前所述,在使用完毕后在<literal>finally</literal>中将所有的核心会话或JMS连接关闭是十分重要的。</para>
|
||||
<para>如果你没有这样做,HornetQ会在拉圾回收时进行检测并会在日志中打印类似以下的警告(如果是JMS则在警告中
|
||||
<para>如果你没有这样做,ActiveMQ会在拉圾回收时进行检测并会在日志中打印类似以下的警告(如果是JMS则在警告中
|
||||
是相应的JMS连接):</para>
|
||||
<programlisting>
|
||||
|
||||
|
@ -107,7 +107,7 @@ at org.apache.activemq.core.client.impl.DelegatingSession.<init>(Delegatin
|
|||
at org.acme.yourproject.YourClass (YourClass.java:666)
|
||||
|
||||
</programlisting>
|
||||
<para>HornetQ然后将未关闭的连接/会话关闭。</para>
|
||||
<para>ActiveMQ然后将未关闭的连接/会话关闭。</para>
|
||||
<para>注意在日志的警告中还给出了创建JMS连接/客户端会话的具体行号,以便准确地确定出错的地方。</para>
|
||||
</section>
|
||||
</section>
|
||||
|
@ -119,7 +119,7 @@ at org.acme.yourproject.YourClass (YourClass.java:666)
|
|||
<para>如果在属性<literal>client-failure-check-period</literal>所定义的时间内(单位毫秒)客户端没有
|
||||
收到任何数据,客户端就认为这们连接发生了故障。根据不同的配置,客户端在这种情况下要么进行failover,要么
|
||||
调用<literal>FailureListener</literal>的接口(或者是JMS的<literal>ExceptionListener</literal>)。</para>
|
||||
<para>如果使用JMS,这个参数是<literal>HornetQConnectionFactory</literal>的<literal>ClientFailureCheckPeriod</literal>。
|
||||
<para>如果使用JMS,这个参数是<literal>ActiveMQConnectionFactory</literal>的<literal>ClientFailureCheckPeriod</literal>。
|
||||
如果你向JNDI部署JMS连接工厂,那么相应的参数在<literal>hornetq-jms.xml</literal>配置文件中,参数名
|
||||
为<literal>client-failure-check-period</literal>。</para>
|
||||
<para>这个参数的默认值是<literal>30000</literal>毫秒,即半分钟。<literal>-1</literal>表示客户端不检查
|
||||
|
|
|
@ -18,17 +18,17 @@
|
|||
<!-- ============================================================================= -->
|
||||
<chapter id="core-bridges">
|
||||
<title>核心桥</title>
|
||||
<para>桥的功能是从一个源队列中接收消息,再将消息转发到目的地址。通常这个目的地址在另外一个HornetQ服务器中。</para>
|
||||
<para>桥的功能是从一个源队列中接收消息,再将消息转发到目的地址。通常这个目的地址在另外一个ActiveMQ服务器中。</para>
|
||||
<para>源与目的不需要在同一个集群中。所以桥很适合将消息从一个集群中可靠地转发到另一个集群。比如通过一个WAN,或
|
||||
internet,等连接不稳定的网络。</para>
|
||||
<para>桥有处理故障的能力。如果目的服务器的连接失败(像网络故障),桥会重试与目的服务器的连接,直接连接成功
|
||||
为止。当连接成功后,桥则继续进行工作。</para>
|
||||
<para>总之,桥是可靠连接两个HornetQ服务器的一种手段。使用核心桥时源和目的服务器必须都是HornetQ服务器。</para>
|
||||
<para>总之,桥是可靠连接两个ActiveMQ服务器的一种手段。使用核心桥时源和目的服务器必须都是ActiveMQ服务器。</para>
|
||||
<para>桥可以通过配置提供<emphasis>一次且只有一次</emphasis>的传递保证。其采用的方法是重复检测(详细
|
||||
描述在<xref linkend="duplicate-detection"/>)。</para>
|
||||
<note>
|
||||
<para>核心桥的功能与JMS桥的功能相似,但是不能将它们混淆!</para>
|
||||
<para>核心桥用来连接两个HornetQ节点,它不使用JMS接口。JMS桥使用的是JMS接口,它连接的是任何两个符合
|
||||
<para>核心桥用来连接两个ActiveMQ节点,它不使用JMS接口。JMS桥使用的是JMS接口,它连接的是任何两个符合
|
||||
JMS 1.1规范的服务器。因此,JMS桥可以将两个不同的JMS服务器连接起来。从性能角度考虑,核心桥由于采用
|
||||
重复检测来实现<emphasis>一次且只一次</emphasis>的传递保证,可以提供更高的性能。
|
||||
JMS桥则需要使用XA这种复杂的机制来提供同样的传递保证,因些性能要比核心桥低。</para>
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
|
||||
<chapter id="diverts">
|
||||
<title>消息的转发(divert)与分流</title>
|
||||
<para>在HornetQ中可以配置一些称为转发器(<emphasis>diverts</emphasis>)的对象。</para>
|
||||
<para>在ActiveMQ中可以配置一些称为转发器(<emphasis>diverts</emphasis>)的对象。</para>
|
||||
<para>转发器可以将路由到一个地址的消息透明地转发到其它的地址去,不需要客户端的参与。</para>
|
||||
<para>转发器可以是<emphasis>唯一(exclusive)</emphasis>的,即消息只转发到新的地址,不发到原
|
||||
来的地址;也可以是<emphasis>不唯一(non-exclusive)</emphasis>的,即消息在发往原有地址的
|
||||
|
@ -61,7 +61,7 @@
|
|||
的消息才被转发到新地址,其它消息则继续发往原地址。如果没有定义过滤器,所有消息将被转发。</para>
|
||||
<para>本例中还配置了一个转换器的类。当每转发一个消息时,该转换器就被执行一次。转换器可以对消息在转发前进行
|
||||
更改。这里的转换器只是在消息中加入了一个记录转发时间的消息头。</para>
|
||||
<para>本例中消息被转发到一个’存贮与转发是‘队列,然后通过一个桥将消息转发到另一个HornetQ服务器中。</para>
|
||||
<para>本例中消息被转发到一个’存贮与转发是‘队列,然后通过一个桥将消息转发到另一个ActiveMQ服务器中。</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>不唯一转发器</title>
|
||||
|
|
|
@ -20,8 +20,8 @@
|
|||
|
||||
<chapter id="duplicate-detection">
|
||||
<title>重复消息检测</title>
|
||||
<para>HornetQ具有强大的自动检测重复消息的功能。应用层无需实现复杂的重复检测。本章解释了什么是重复检测,它
|
||||
在HornetQ中如何工作的,以及如何进行配置。</para>
|
||||
<para>ActiveMQ具有强大的自动检测重复消息的功能。应用层无需实现复杂的重复检测。本章解释了什么是重复检测,它
|
||||
在ActiveMQ中如何工作的,以及如何进行配置。</para>
|
||||
<para>当客户端向服务器端发送消息时,或者从一个服务器向另一个服务器传递消息时,如果消息发送后目标服务器或者
|
||||
连接出现故障,导致发送一方没有收到发送成功的确认信息,发送方因此就无法确定消息是否已经成功发送到了目标地
|
||||
址。</para>
|
||||
|
@ -33,7 +33,7 @@
|
|||
个相同的订单,这当然不是所希望的結果。</para>
|
||||
<para>将消息的发送放到一个事务中也不能解决这个问题。如果在事务提交的过程中发生故障,同样不能确定这个事务是否提交
|
||||
成功!</para>
|
||||
<para>为了解决这个问题,HornetQ提供了自动消息重复检测功能。</para>
|
||||
<para>为了解决这个问题,ActiveMQ提供了自动消息重复检测功能。</para>
|
||||
<section>
|
||||
<title>在消息发送中应用重复检测</title>
|
||||
<para>在消息发送中启用重复检测功能十分简单:你只需将消息的一个特殊属性设置一个唯一值。你可以用任意方法来
|
||||
|
@ -113,7 +113,7 @@ message.setStringProperty(HDR_DUPLICATE_DETECTION_ID.toString(), myUniqueID);
|
|||
</section>
|
||||
<section>
|
||||
<title>分页转存与重复检测</title>
|
||||
<para>HornetQ在将消息进行分页转存中也使用了重复检测。当分页转存消息被从磁盘中读回到内存时,如果服务器发生故障,
|
||||
<para>ActiveMQ在将消息进行分页转存中也使用了重复检测。当分页转存消息被从磁盘中读回到内存时,如果服务器发生故障,
|
||||
重复检测可以避免在这一过程中有消息被重复读入,即避免了消息的重复传递。</para>
|
||||
<para>关于分页转存的配置信息请参见<xref linkend="paging" />。</para>
|
||||
</section>
|
||||
|
|
|
@ -17,19 +17,19 @@
|
|||
<!-- permitted by applicable law. -->
|
||||
<!-- ============================================================================= -->
|
||||
<chapter id="embedding-hornetq">
|
||||
<title>嵌入式HornetQ</title>
|
||||
<para>HornetQ是由简单传统Java对象(POJO)实现,因此它可以在任何依赖注入的框架中运行,比如JBoss
|
||||
<title>嵌入式ActiveMQ</title>
|
||||
<para>ActiveMQ是由简单传统Java对象(POJO)实现,因此它可以在任何依赖注入的框架中运行,比如JBoss
|
||||
Microcontainer,Sprint或Google Guice。另外如果你的应用程序内部需要消息功能,你可以在程序中
|
||||
<emphasis>直接实例化</emphasis>HornetQ的客户端或服务器端。我们称之为<emphasis>嵌入式</emphasis>
|
||||
HornetQ。</para>
|
||||
<para>有些应用需要高性能、事务性及持久化的消息服务,但是又不希望自己去费时费力实现它。于是嵌入式HornetQ就
|
||||
<emphasis>直接实例化</emphasis>ActiveMQ的客户端或服务器端。我们称之为<emphasis>嵌入式</emphasis>
|
||||
ActiveMQ。</para>
|
||||
<para>有些应用需要高性能、事务性及持久化的消息服务,但是又不希望自己去费时费力实现它。于是嵌入式ActiveMQ就
|
||||
成为了一个很适当的选择。</para>
|
||||
<para>要使用嵌入式HornetQ只需要几个简单的步骤。首先初始化配置对象,再初始化服务器并启动它,在你的虚拟机
|
||||
中就运行越来了一个HornetQ服务器。就是这么简单。</para>
|
||||
<para>要使用嵌入式ActiveMQ只需要几个简单的步骤。首先初始化配置对象,再初始化服务器并启动它,在你的虚拟机
|
||||
中就运行越来了一个ActiveMQ服务器。就是这么简单。</para>
|
||||
<section>
|
||||
<title>POJO的初始化</title>
|
||||
<para>按照以下步骤去做:</para>
|
||||
<para>创建配置对象--这个对象包装了HornetQ的配置信息。如果你想使用配置文件,则使用<literal
|
||||
<para>创建配置对象--这个对象包装了ActiveMQ的配置信息。如果你想使用配置文件,则使用<literal
|
||||
>FileConfigurationImpl</literal>。</para>
|
||||
<programlisting>import org.apache.activemq.core.config.Configuration;
|
||||
import org.apache.activemq.core.config.impl.FileConfiguration;
|
||||
|
@ -56,29 +56,29 @@ transports.add(new TransportConfiguration(NettyAcceptorFactory.class.getName()))
|
|||
transports.add(new TransportConfiguration(InVMAcceptorFactory.class.getName()));
|
||||
|
||||
config.setAcceptorConfigurations(transports);</programlisting>
|
||||
<para>接着就需要初始化并启动HornetQ服务。<literal
|
||||
>org.apache.activemq.api.core.server.HornetQ</literal>类有一些静态方法可用来创建HornetQ服务器。</para>
|
||||
<programlisting>import org.apache.activemq.api.core.server.HornetQ;
|
||||
import org.apache.activemq.core.server.HornetQServer;
|
||||
<para>接着就需要初始化并启动ActiveMQ服务。<literal
|
||||
>org.apache.activemq.api.core.server.ActiveMQ</literal>类有一些静态方法可用来创建ActiveMQ服务器。</para>
|
||||
<programlisting>import org.apache.activemq.api.core.server.ActiveMQ;
|
||||
import org.apache.activemq.core.server.ActiveMQServer;
|
||||
|
||||
...
|
||||
|
||||
HornetQServer server = HornetQ.newHornetQServer(config);
|
||||
ActiveMQServer server = ActiveMQ.newActiveMQServer(config);
|
||||
|
||||
server.start();</programlisting>
|
||||
<para>你还可以直接实例化<literal>HornetQServerImpl</literal>:</para>
|
||||
<programlisting>HornetQServer server =
|
||||
new HornetQServerImpl(config);
|
||||
<para>你还可以直接实例化<literal>ActiveMQServerImpl</literal>:</para>
|
||||
<programlisting>ActiveMQServer server =
|
||||
new ActiveMQServerImpl(config);
|
||||
server.start();</programlisting>
|
||||
</section>
|
||||
<section>
|
||||
<title>使用依赖注入框架</title>
|
||||
<para>你还可以使用一个依赖注入框架来启动HornetQ,比如<trademark>JBoss
|
||||
<para>你还可以使用一个依赖注入框架来启动ActiveMQ,比如<trademark>JBoss
|
||||
Microcontainer</trademark>或<trademark>Spring框架</trademark>。</para>
|
||||
<para>HornetQ独立服务器使用的是JBoss Microcontainer作为其框架。在HornetQ的发布中包括的<literal
|
||||
>HornetQBootstrapServer</literal>和<literal>hornetq-beans.xml</literal>文件共同实现了
|
||||
在JBoss Microcontainer中对HornetQ服务器的引导。</para>
|
||||
<para>要使用JBoss Microcontainer,需要在xml文件中声明<literal>HornetQServer</literal>
|
||||
<para>ActiveMQ独立服务器使用的是JBoss Microcontainer作为其框架。在ActiveMQ的发布中包括的<literal
|
||||
>ActiveMQBootstrapServer</literal>和<literal>hornetq-beans.xml</literal>文件共同实现了
|
||||
在JBoss Microcontainer中对ActiveMQ服务器的引导。</para>
|
||||
<para>要使用JBoss Microcontainer,需要在xml文件中声明<literal>ActiveMQServer</literal>
|
||||
和<literal>Configuration</literal>对象。另外还可以注入一个安全管理器和一个MBean服务器。但是这些
|
||||
注入是可选的。</para>
|
||||
<para>下面是一个基本的JBoss Microcontainer的XML Bean的声明:</para>
|
||||
|
@ -92,8 +92,8 @@ server.start();</programlisting>
|
|||
</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"/>
|
||||
|
@ -101,18 +101,18 @@ server.start();</programlisting>
|
|||
</constructor>
|
||||
</bean>
|
||||
</deployment></programlisting>
|
||||
<para><literal>HornetQBootstrapServer</literal>实现了JBoss Microcontainer的简单封装。</para>
|
||||
<programlisting>HornetQBootstrapServer bootStrap =
|
||||
new HornetQBootstrapServer(new String[] {"hornetq-beans.xml"});
|
||||
<para><literal>ActiveMQBootstrapServer</literal>实现了JBoss Microcontainer的简单封装。</para>
|
||||
<programlisting>ActiveMQBootstrapServer bootStrap =
|
||||
new ActiveMQBootstrapServer(new String[] {"hornetq-beans.xml"});
|
||||
bootStrap.run();</programlisting>
|
||||
</section>
|
||||
<section>
|
||||
<title>连接嵌入式HornetQ</title>
|
||||
<para>嵌入式HornetQ的连接和普通的连接一样要创建连接工厂:</para>
|
||||
<title>连接嵌入式ActiveMQ</title>
|
||||
<para>嵌入式ActiveMQ的连接和普通的连接一样要创建连接工厂:</para>
|
||||
<section>
|
||||
<title>核心接口</title>
|
||||
<para>使用核心接口,需要创建一个<literal>ClientSessionFactory</literal>然后正常建立连接。</para>
|
||||
<programlisting>ClientSessionFactory nettyFactory = HornetQClient.createClientSessionFactory(
|
||||
<programlisting>ClientSessionFactory nettyFactory = ActiveMQClient.createClientSessionFactory(
|
||||
new TransportConfiguration(
|
||||
InVMConnectorFactory.class.getName()));
|
||||
|
||||
|
@ -140,10 +140,10 @@ session.close();</programlisting>
|
|||
</section>
|
||||
<section>
|
||||
<title>JMS接口</title>
|
||||
<para>使用JMS接口连接嵌入HornetQ同样简单。只需要直接实例化
|
||||
<para>使用JMS接口连接嵌入ActiveMQ同样简单。只需要直接实例化
|
||||
<literal>ConnectionFactory</literal>即可。如下面例子所示:</para>
|
||||
<programlisting>ConnectionFactory cf =
|
||||
HornetQJMSClient.createConnectionFactory(
|
||||
ActiveMQJMSClient.createConnectionFactory(
|
||||
new TransportConfiguration(InVMConnectorFactory.class.getName()));
|
||||
|
||||
Connection conn = cf.createConnection();
|
||||
|
@ -172,7 +172,7 @@ conn.close();</programlisting>
|
|||
</section>
|
||||
</section>
|
||||
<section>
|
||||
<title>JMS嵌入式HornetQ的例子</title>
|
||||
<para>有关如何设置与运行JMS嵌入式HornetQ的例子请参见<xref linkend="examples.embedded"/>。</para>
|
||||
<title>JMS嵌入式ActiveMQ的例子</title>
|
||||
<para>有关如何设置与运行JMS嵌入式ActiveMQ的例子请参见<xref linkend="examples.embedded"/>。</para>
|
||||
</section>
|
||||
</chapter>
|
||||
|
|
|
@ -18,11 +18,11 @@
|
|||
<!-- ============================================================================= -->
|
||||
<chapter id="examples">
|
||||
<title>例子</title>
|
||||
<para>在HornetQ的发布包中有超过70个不同的例子。这些例子直接可以运行。它们分别展示了HornetQ所具有的各种功能。</para>
|
||||
<para>所有的例子都在HornetQ发布包的 <literal>examples</literal>目录下。所有的例子被分成了两大类:
|
||||
<para>在ActiveMQ的发布包中有超过70个不同的例子。这些例子直接可以运行。它们分别展示了ActiveMQ所具有的各种功能。</para>
|
||||
<para>所有的例子都在ActiveMQ发布包的 <literal>examples</literal>目录下。所有的例子被分成了两大类:
|
||||
JMS例子和内核例子。JMS例子展现的是JMS的各种功能,内核的例子则展示的是内核API的功能。
|
||||
</para>
|
||||
<para>此外HornetQ还提供了一些Java EE的例子,这些例子需要JBoss应用服务器才能运行。</para>
|
||||
<para>此外ActiveMQ还提供了一些Java EE的例子,这些例子需要JBoss应用服务器才能运行。</para>
|
||||
<section>
|
||||
<title>JMS 例子</title>
|
||||
<para>要运行一个JMS例子,只要进入到相应例子的子目录,运行 <literal>./build.sh</literal> (或者
|
||||
|
@ -30,10 +30,10 @@
|
|||
<para>下面列出的这些JMS例子并配有简要的说明。</para>
|
||||
<section id="application-level-failover">
|
||||
<title>应用层的失效备援(Failover)</title>
|
||||
<para>HornetQ支持应用层的失效备援。这在服务器端没有复制(replication)配置的情况下是很有用的。</para>
|
||||
<para>应用程序可以注册一个JMS <literal>ExceptionListener</literal>。当HornetQ检测到连接故障时,它会
|
||||
<para>ActiveMQ支持应用层的失效备援。这在服务器端没有复制(replication)配置的情况下是很有用的。</para>
|
||||
<para>应用程序可以注册一个JMS <literal>ExceptionListener</literal>。当ActiveMQ检测到连接故障时,它会
|
||||
通知这个注册的Listener。</para>
|
||||
<para>这个<literal>ExceptionListener</literal>在接到HornetQ的通知后可以与其它的节点创建
|
||||
<para>这个<literal>ExceptionListener</literal>在接到ActiveMQ的通知后可以与其它的节点创建
|
||||
新的连接、会话等对象,以使应用程序能继续运行。</para>
|
||||
<para>应用层的失效备援是实现高可获得性(HA)的一种方法。它与自动失效备援不同之处在于它需要编写额外的代码。
|
||||
同时由于发生故障时旧的会话结束,这会造成那些还没来得及提交的工作丢失,还会造成任何没有通知的消息被重发。</para>
|
||||
|
@ -42,12 +42,12 @@
|
|||
<title>内核桥(Bridge)例子</title>
|
||||
<para><literal>bridge</literal>例子展示的是将一个内核桥部署到一个服务器上,从本地的queue接收消息并将其转发到
|
||||
另一服务器的地址上。</para>
|
||||
<para>内核的bridge可用来在两个互相分开的HornetQ的服务器间建立一个消息流。它可以处理临时性的连接故障,特别适用于
|
||||
<para>内核的bridge可用来在两个互相分开的ActiveMQ的服务器间建立一个消息流。它可以处理临时性的连接故障,特别适用于
|
||||
不可靠的网络的情况。广域网就是一个例子。</para>
|
||||
</section>
|
||||
<section id="examples.browsers">
|
||||
<title>浏览器(Browser)</title>
|
||||
<para><literal>browser</literal>例子展示的是在HornetQ中如何使用JMS <literal
|
||||
<para><literal>browser</literal>例子展示的是在ActiveMQ中如何使用JMS <literal
|
||||
>QueueBrowser</literal>。</para>
|
||||
<para>有关JMS queue的概念在JMS 1.1 specification有明确的定义,这里就不再叙述。</para>
|
||||
<para> 一个<literal>QueueBrowser</literal>可以用来观察queue中的消息而影响它们。它可以观察queue中的全部
|
||||
|
@ -60,7 +60,7 @@
|
|||
<section>
|
||||
<title>客户端的负载均衡</title>
|
||||
<para><literal>client-side-load-balancing</literal>例子展示的是通过一个JMS连接可以在集群的不同节点上创建
|
||||
会话。也就是说HornetQ可以对客户端的会话创建进行集群内的负载均衡。</para>
|
||||
会话。也就是说ActiveMQ可以对客户端的会话创建进行集群内的负载均衡。</para>
|
||||
</section>
|
||||
<section id="examples.clustered.grouping">
|
||||
<title>集群分组</title>
|
||||
|
@ -87,8 +87,8 @@
|
|||
</section>
|
||||
<section id="examples.consumer-rate-limit">
|
||||
<title>限制接收速率</title>
|
||||
<para>HornetQ可以控制一个JMS消息接收者接收消息的速度。这是在创建或部署连接工厂时通过其配置参数来完成的。</para>
|
||||
<para>如果设置了这个速度的限制,HornetQ会保证其向接收者传递消息的速度永远不会超过这个限制。</para>
|
||||
<para>ActiveMQ可以控制一个JMS消息接收者接收消息的速度。这是在创建或部署连接工厂时通过其配置参数来完成的。</para>
|
||||
<para>如果设置了这个速度的限制,ActiveMQ会保证其向接收者传递消息的速度永远不会超过这个限制。</para>
|
||||
</section>
|
||||
<section id="examples.dead-letter">
|
||||
<title>死消息(Dead Letter)</title>
|
||||
|
@ -102,57 +102,57 @@
|
|||
</section>
|
||||
<section id="examples.delayed-redelivery">
|
||||
<title>延迟再发送</title>
|
||||
<para><literal>delayed-redelivery</literal>是一个展示如何配置HornetQ延迟再发送消息的例子。</para>
|
||||
<para><literal>delayed-redelivery</literal>是一个展示如何配置ActiveMQ延迟再发送消息的例子。</para>
|
||||
<para>当客户端经常发生故障或发生事务回滚时,消息会不停地重复发送,这样会造成CPU和网络资源被不间断的
|
||||
重复发送所占用,影响其它工作的进行。延迟再发送可以有效地减轻这种情况。</para>
|
||||
</section>
|
||||
<section id="divert-example">
|
||||
<title>转移(Divert)</title>
|
||||
<para>HornetQ通过配置可以将消息从一个地址自动地转移到另一地址。这个例子就是向用户展示转移的配置和使用。</para>
|
||||
<para>ActiveMQ通过配置可以将消息从一个地址自动地转移到另一地址。这个例子就是向用户展示转移的配置和使用。</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>持久订阅(Durable Subscription)</title>
|
||||
<para><literal>durable-subscription</literal>是一个在HornetQ中如何使用持久订阅(durable
|
||||
<para><literal>durable-subscription</literal>是一个在ActiveMQ中如何使用持久订阅(durable
|
||||
subscription)的例子。持久订阅是标准JMS的一部分,在JMS 1.1规范中有它的详细定义。</para>
|
||||
<para>对于一个持久订阅来说,它的消息可以在订阅没有处于接收状态时被保留。另外,如果发到它的消息是持久
|
||||
消息的话,这些消息可以在服务器故障或重启时不丢失。 </para>
|
||||
</section>
|
||||
<section>
|
||||
<title>嵌入方式(Embedded)</title>
|
||||
<para><literal>embedded</literal>是一个如何将HornetQ服务嵌入到你的应用中的例子。</para>
|
||||
<para><literal>embedded</literal>是一个如何将ActiveMQ服务嵌入到你的应用中的例子。</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>HTTP 传输协议的支持</title>
|
||||
<para><literal>http-transport</literal>展示了HornetQ如何支持在传输层使用HTTP协议来发送和接收消息。</para>
|
||||
<para><literal>http-transport</literal>展示了ActiveMQ如何支持在传输层使用HTTP协议来发送和接收消息。</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>直接实例化JMS对象</title>
|
||||
<para>JMS 对象是指 <literal>连接工厂(ConnectionFactory)</literal>、<literal
|
||||
>队列(Queue)</literal>和<literal>话题(Topic)</literal> 的实例。通常情况下它们通过JNDI服务
|
||||
来获取。它们在JMS术语中被称为“被管理的对象(administered objects)”。</para>
|
||||
<para>有的时候客户端没有JNDI服务可用,或者不适合使用JNDI。那么在没有JNDI的情况下HornetQ允许直接在客户端
|
||||
<para>有的时候客户端没有JNDI服务可用,或者不适合使用JNDI。那么在没有JNDI的情况下ActiveMQ允许直接在客户端
|
||||
将这些JMS对象实例化。</para>
|
||||
</section>
|
||||
<section id="examples.interceptor">
|
||||
<title>拦截器(Interceptor)</title>
|
||||
<para>HornetQ可以配置拦截器以便用户可以自己处理各种各样的消息事件。这个例子就是给用户展示如何使用
|
||||
<para>ActiveMQ可以配置拦截器以便用户可以自己处理各种各样的消息事件。这个例子就是给用户展示如何使用
|
||||
拦截器。</para>
|
||||
</section>
|
||||
<section id="examples.jaas">
|
||||
<title>JAAS</title>
|
||||
<para><literal>jaas</literal>是一个如何配置JAAS安全模式的例子。HornetQ可以使用JAAS来进行用户的验证与权限控制。</para>
|
||||
<para><literal>jaas</literal>是一个如何配置JAAS安全模式的例子。ActiveMQ可以使用JAAS来进行用户的验证与权限控制。</para>
|
||||
</section>
|
||||
<section id="examples.jms.jms-bridge">
|
||||
<title>JMS桥(Bridge)</title>
|
||||
<para><literal>jms-brige</literal>是一个在两个单独HornetQ服务器之间设置桥的例子。</para>
|
||||
<para><literal>jms-brige</literal>是一个在两个单独ActiveMQ服务器之间设置桥的例子。</para>
|
||||
</section>
|
||||
<section id="examples.jmx">
|
||||
<title>JMX管理</title>
|
||||
<para><literal>jmx</literal>例子展示了如何使用JMX来管理HornetQ。</para>
|
||||
<para><literal>jmx</literal>例子展示了如何使用JMX来管理ActiveMQ。</para>
|
||||
</section>
|
||||
<section id="examples.large-message">
|
||||
<title>大消息</title>
|
||||
<para><literal>large-message</literal>例子给用户展示了使用HornetQ来发送和接收大消息的功能。HornetQ
|
||||
<para><literal>large-message</literal>例子给用户展示了使用ActiveMQ来发送和接收大消息的功能。ActiveMQ
|
||||
支持超大消息的发送与接收。这些消息可以大到内存无法装下。它的大小只受服务器的硬盘空间的限制。</para>
|
||||
<para>在服务器端大消息是被持久化的,所以它可以承受服务器的崩溃或重启而不丢失或损坏。</para>
|
||||
</section>
|
||||
|
@ -166,20 +166,20 @@
|
|||
</section>
|
||||
<section>
|
||||
<title>分布式队列的负载均衡</title>
|
||||
<para>在<literal>clustered-queue</literal>例子中配置了一个2节点的HornetQ服务集群。在集群上部署了
|
||||
<para>在<literal>clustered-queue</literal>例子中配置了一个2节点的ActiveMQ服务集群。在集群上部署了
|
||||
一个分布式JMS队列。</para>
|
||||
<para>然后在一个节点上创建了一个发送者(producer),在两个节点上分别创建一个接收者(consumer)。通过
|
||||
发送者向队列发送一些消息然后被两的接收者以轮流(round-robin)的方式接收。</para>
|
||||
<para>本例说明了HornetQ可以将消息向集群中的每个接收者分布式地传递消息。</para>
|
||||
<para>本例说明了ActiveMQ可以将消息向集群中的每个接收者分布式地传递消息。</para>
|
||||
</section>
|
||||
<section id="examples.management">
|
||||
<title>管理</title>
|
||||
<para><literal>management</literal>例子展示的是如何使用JMS消息来实现对HornetQ的管理。</para>
|
||||
<para><literal>management</literal>例子展示的是如何使用JMS消息来实现对ActiveMQ的管理。</para>
|
||||
</section>
|
||||
<section id="examples.management-notifications">
|
||||
<title>管理通知</title>
|
||||
<para><literal>management-notification</literal>展示了HornetQ如何以JMS消息的形式向用户发送
|
||||
管理通知。当某些事件发生时(如接收都创建,关闭;地址创建与删除;安全验证失败等等),HornetQ会向客户
|
||||
<para><literal>management-notification</literal>展示了ActiveMQ如何以JMS消息的形式向用户发送
|
||||
管理通知。当某些事件发生时(如接收都创建,关闭;地址创建与删除;安全验证失败等等),ActiveMQ会向客户
|
||||
发出JMS消息以通知客户这些事件的相关信息。客户接收到这些信息后可以作出相应的处理。</para>
|
||||
</section>
|
||||
<section id="examples.message-counters">
|
||||
|
@ -190,12 +190,12 @@
|
|||
<title>消息失效</title>
|
||||
<para><literal>expiry</literal>例子中包括了如何定义和使用消息失效期。消息如果在消息服务器中存留超过一定
|
||||
的时间,就可以被删除。根据JMS规范,接收者就不应该接收到已经过了失效期的消息。(但是并不保证一定接收不到)。</para>
|
||||
<para>HornetQ可以给一个队列配上一个失效地址,当队列中的消息失效时,它们就会从队列中删除并转移到该失效地址。
|
||||
<para>ActiveMQ可以给一个队列配上一个失效地址,当队列中的消息失效时,它们就会从队列中删除并转移到该失效地址。
|
||||
这些“失效"的消息可以从失效地址中接收并进行分析。</para>
|
||||
</section>
|
||||
<section id="examples.message-group">
|
||||
<title>消息组</title>
|
||||
<para><literal>message-group</literal>展示的是如何在HornetQ中配置消息组。消息组可以让你的消息
|
||||
<para><literal>message-group</literal>展示的是如何在ActiveMQ中配置消息组。消息组可以让你的消息
|
||||
只被一个接收者接收。属于一个消息组中的消息有如下特性:</para>
|
||||
<para>
|
||||
<itemizedlist>
|
||||
|
@ -223,10 +223,10 @@
|
|||
</section>
|
||||
<section id="examples.no-consumer-buffering">
|
||||
<title>零接收缓冲</title>
|
||||
<para>默认时HornetQ的接收者客户端有一个消息缓冲,它用来保存从服务器上预先接收的消息。这样做是为了提高
|
||||
性能。因为如果没有这个缓冲,每次调用receive()或onMessage()后,HornetQ就会访问一次服务器请求下
|
||||
<para>默认时ActiveMQ的接收者客户端有一个消息缓冲,它用来保存从服务器上预先接收的消息。这样做是为了提高
|
||||
性能。因为如果没有这个缓冲,每次调用receive()或onMessage()后,ActiveMQ就会访问一次服务器请求下
|
||||
一个消息。</para>
|
||||
<para>这样每接收一个消息就会增加一次网络往返的传输。因此,HornetQ在默认情况下使用客户端的接收缓冲来
|
||||
<para>这样每接收一个消息就会增加一次网络往返的传输。因此,ActiveMQ在默认情况下使用客户端的接收缓冲来
|
||||
预先接收消息,以提高效率。</para>
|
||||
<para>然而在某些情况下这样的缓冲不符合应用需要。那么可以将缓冲关闭。本例就是展示如何关闭接收缓冲。</para>
|
||||
</section>
|
||||
|
@ -234,13 +234,13 @@
|
|||
<title>带有服务器数据复制的非事务失效备援</title>
|
||||
<para><literal>non-transaction-failover</literal>例子展示了由两个服务器组成的高可获得性主/从关系。
|
||||
客户端使用一个非交易的JMS会话(session)可以在主节点崩溃的情况下从主节点失效备援到备份节点。</para>
|
||||
<para>HornetQ的这一功能是通过主、备节点间的状态复制来实现的。当主节点发生故障崩溃时,客户端的连接可以自动
|
||||
<para>ActiveMQ的这一功能是通过主、备节点间的状态复制来实现的。当主节点发生故障崩溃时,客户端的连接可以自动
|
||||
转向备份节点以继续的发送或接收消息。当使用非事务性的会话时,有可能发生消息丢失或重复传递的情况。</para>
|
||||
</section>
|
||||
<section id="examples.paging">
|
||||
<title>分页(paging)</title>
|
||||
<para><literal>paging</literal>例子展示了HornetQ在内存有限时如何支持超大容量的队列。当内存不够时,
|
||||
HornetQ会将消息保存到磁盘上;需要时再将它们从磁盘读入内存。这一过程对用户是透明的。</para>
|
||||
<para><literal>paging</literal>例子展示了ActiveMQ在内存有限时如何支持超大容量的队列。当内存不够时,
|
||||
ActiveMQ会将消息保存到磁盘上;需要时再将它们从磁盘读入内存。这一过程对用户是透明的。</para>
|
||||
</section>
|
||||
<section id="examples.pre-acknowledge">
|
||||
<title>预先通知</title>
|
||||
|
@ -248,11 +248,11 @@
|
|||
AUTO_ACKNOWLEDGE</literal>(自动通知)、<literal>CLIENT_ACKNOWLEDGE</literal>客户通知以及 <literal
|
||||
>DUPS_OK_ACKNOWLEDGE</literal>可重复通知。请参阅JMS规范和教程来进一步了解这几种通知方式。</para>
|
||||
<para>所有方式都需要从客户端发通知到服务器端。有时当发生故障时你并不在乎丢失一些消息,这样可以采用在服务器端在消息
|
||||
传递前进行通知就显得比较合理。本例就是展示如何使用这一HornetQ独有的通知方式。</para>
|
||||
传递前进行通知就显得比较合理。本例就是展示如何使用这一ActiveMQ独有的通知方式。</para>
|
||||
</section>
|
||||
<section id="producer-rate-limiting-example">
|
||||
<title>消息发送速度限制</title>
|
||||
<para><literal>producer-rte-limit</literal>例子展示了如何设置HornetQ的最大消息发送速率。它控制消息的
|
||||
<para><literal>producer-rte-limit</literal>例子展示了如何设置ActiveMQ的最大消息发送速率。它控制消息的
|
||||
发送者(JMS producer)发送消息的最大速度。</para>
|
||||
</section>
|
||||
<section>
|
||||
|
@ -283,16 +283,16 @@
|
|||
</section>
|
||||
<section id="examples.scheduled-message">
|
||||
<title>定时消息</title>
|
||||
<para><literal>scheduled-message</literal>例子展示了如何向HornetQ发送定时消息(scheduled message)。
|
||||
<para><literal>scheduled-message</literal>例子展示了如何向ActiveMQ发送定时消息(scheduled message)。
|
||||
所谓定时消息就是在规定的将来的某一时间传递的消息。</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>安全</title>
|
||||
<para><literal>security</literal>例子展示了如何配置HornetQ的安全参数。</para>
|
||||
<para><literal>security</literal>例子展示了如何配置ActiveMQ的安全参数。</para>
|
||||
</section>
|
||||
<section id="asynchronous-send-acknowledgements-example">
|
||||
<title>发送通知</title>
|
||||
<para><literal>send-acknowledgements</literal>例子展示了如何使用HornetQ提供的高级异步发送通知功能
|
||||
<para><literal>send-acknowledgements</literal>例子展示了如何使用ActiveMQ提供的高级异步发送通知功能
|
||||
(<emphasis>asynchronous send acknowledgements</emphasis>)。这是服务器向客户端通知消息已经
|
||||
被接收。</para>
|
||||
</section>
|
||||
|
@ -302,25 +302,25 @@
|
|||
</section>
|
||||
<section>
|
||||
<title>静态消息选择器</title>
|
||||
<para><literal>static-selector</literal>例子展示了如何配置HornetQ核心队列的静态消息选择器(又称过滤器)。</para>
|
||||
<para><literal>static-selector</literal>例子展示了如何配置ActiveMQ核心队列的静态消息选择器(又称过滤器)。</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>使用JMS方法来配置静态消息选择器</title>
|
||||
<para><literal>static-selector-jms</literal>例子采用JMS方法来配置HornetQ的队列的静态选择器(过滤器)。</para>
|
||||
<para><literal>static-selector-jms</literal>例子采用JMS方法来配置ActiveMQ的队列的静态选择器(过滤器)。</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>Stomp</title>
|
||||
<para><literal>stomp</literal>例子展示了如何配置HornetQ来发送与接收Stomp消息。</para>
|
||||
<para><literal>stomp</literal>例子展示了如何配置ActiveMQ来发送与接收Stomp消息。</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>Stomp与Web Sockets</title>
|
||||
<para><literal>stomp-websockets</literal>例子给出了如何配置一个HornetQ服务器直接从Web浏览器
|
||||
<para><literal>stomp-websockets</literal>例子给出了如何配置一个ActiveMQ服务器直接从Web浏览器
|
||||
中(需要支持Web Socket)发送和接收Stomp消息。</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>对称型集群</title>
|
||||
<para><literal>symmetric-cluster</literal>例子展示如何设置一个HornetQ的对称型集群。</para>
|
||||
<para>HornetQ的集群配置是非常灵活的。你可以根据需要设置不同的集群结构。最常用的就是对称型的集群了。这是在应用
|
||||
<para><literal>symmetric-cluster</literal>例子展示如何设置一个ActiveMQ的对称型集群。</para>
|
||||
<para>ActiveMQ的集群配置是非常灵活的。你可以根据需要设置不同的集群结构。最常用的就是对称型的集群了。这是在应用
|
||||
服务器中常见的集群类型。</para>
|
||||
<para>对称型的集群具有同一性,即每个节点与其他节点处于同等地位,并且每一个节点都与其他任一节点相连接。</para>
|
||||
</section>
|
||||
|
@ -334,7 +334,7 @@
|
|||
</section>
|
||||
<section id="topic-hierarchy-example">
|
||||
<title>话题体系(Topic Hierarchy)</title>
|
||||
<para>HornetQ支持话题体系。所谓话题体系就是允许你使用通配符来注册一个订阅(subscriber),这样所有发送到
|
||||
<para>ActiveMQ支持话题体系。所谓话题体系就是允许你使用通配符来注册一个订阅(subscriber),这样所有发送到
|
||||
与该通配符相匹配的地址的消息都可以被该订阅收到。</para>
|
||||
</section>
|
||||
<section>
|
||||
|
@ -349,29 +349,29 @@
|
|||
<title>带有数据复制的事务性失效备援</title>
|
||||
<para><literal>transaction-failover</literal>例子展示了由两个服务器组成的高可获得性主/备关系。
|
||||
客户端使用一个交易的JMS会话(session)可以在主节点崩溃的情况下从主节点失效备援到备份节点。</para>
|
||||
<para>HornetQ的这一功能是通过主、备节点间的状态复制来实现的。当主节点发生故障崩溃时,客户端的连接可以自动
|
||||
<para>ActiveMQ的这一功能是通过主、备节点间的状态复制来实现的。当主节点发生故障崩溃时,客户端的连接可以自动
|
||||
转向备份节点以继续的发送或接收消息。当使用事务性的会话时,能够保证消息被传递并且只被传递一次。</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>事务性会话</title>
|
||||
<para><literal>transactional</literal>例子展示了如何在HornetQ中使用事务性会话。</para>
|
||||
<para><literal>transactional</literal>例子展示了如何在ActiveMQ中使用事务性会话。</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>XA Heuristic</title>
|
||||
<para><literal>xa-heuristic</literal>例子给出了如何通过HornetQ的管理接口来做出一个XA的heuristic决定。
|
||||
<para><literal>xa-heuristic</literal>例子给出了如何通过ActiveMQ的管理接口来做出一个XA的heuristic决定。
|
||||
一个XA的heuristic决定是一个单方面的对一个已经准备的(prepared)XA事务分支提交或回滚的决定。</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>XA 接收</title>
|
||||
<para><literal>xa-receive</literal>例子展示的是如何使用HornetQ在一个XA事务内接收消息。</para>
|
||||
<para><literal>xa-receive</literal>例子展示的是如何使用ActiveMQ在一个XA事务内接收消息。</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>XA 发送</title>
|
||||
<para><literal>xa-send</literal>例子展示的是如何使用HornetQ在一个XA事务内发送消息。</para>
|
||||
<para><literal>xa-send</literal>例子展示的是如何使用ActiveMQ在一个XA事务内发送消息。</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>XA与事务管理器(transaction manager)</title>
|
||||
<para><literal>xa-with-jta</literal>展示了如何在HornetQ中使用JTA接口来控制事务。</para>
|
||||
<para><literal>xa-with-jta</literal>展示了如何在ActiveMQ中使用JTA接口来控制事务。</para>
|
||||
</section>
|
||||
</section>
|
||||
<section>
|
||||
|
@ -379,7 +379,7 @@
|
|||
<para>运行核心API的例子很简单,只要进到相应的例子目录下运行“<literal>ant</literal>"即可。 </para>
|
||||
<section id="examples.embedded">
|
||||
<title>嵌入式</title>
|
||||
<para>本例展示了如何将HornetQ服务器嵌入到你的代码中。</para>
|
||||
<para>本例展示了如何将ActiveMQ服务器嵌入到你的代码中。</para>
|
||||
</section>
|
||||
</section>
|
||||
<section>
|
||||
|
@ -397,15 +397,15 @@
|
|||
</section>
|
||||
<section>
|
||||
<title>资源适配器的配置(JCA)</title>
|
||||
<para>本例展示了如何配置HornetQ的JCA适配器的各种参数。</para>
|
||||
<para>本例展示了如何配置ActiveMQ的JCA适配器的各种参数。</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>资源适配器运程服务器的配置</title>
|
||||
<para>本例展示了如何配置HornetQ的JCA适配器来与远程的HornetQ服务器通迅。</para>
|
||||
<para>本例展示了如何配置ActiveMQ的JCA适配器来与远程的ActiveMQ服务器通迅。</para>
|
||||
</section>
|
||||
<section id="examples.javaee.jms-bridge">
|
||||
<title>JMS 桥(Bridge)</title>
|
||||
<para>本例展示了如何使用HornetQ的JMS bridge。</para>
|
||||
<para>本例展示了如何使用ActiveMQ的JMS bridge。</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>MDB (消息驱动Bean)</title>
|
||||
|
@ -413,15 +413,15 @@
|
|||
</section>
|
||||
<section>
|
||||
<title>Servlet传输</title>
|
||||
<para>一个展示在HornetQ中使用servlet作为传输层的例子。</para>
|
||||
<para>一个展示在ActiveMQ中使用servlet作为传输层的例子。</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>Servlet SSL 传输</title>
|
||||
<para>一个展示在HornetQ中使用基于SSL之上的servlet传输的例子。</para>
|
||||
<para>一个展示在ActiveMQ中使用基于SSL之上的servlet传输的例子。</para>
|
||||
</section>
|
||||
<section id="xa-recovery-example">
|
||||
<title>XA 恢复(recovery)</title>
|
||||
<para>这是一个展示HornetQ在JBoss应用服务器中的XA recovery是如何工作的例子。</para>
|
||||
<para>这是一个展示ActiveMQ在JBoss应用服务器中的XA recovery是如何工作的例子。</para>
|
||||
</section>
|
||||
</section>
|
||||
</chapter>
|
||||
|
|
|
@ -20,12 +20,12 @@
|
|||
|
||||
<chapter id="filter-expressions">
|
||||
<title>过滤器表达式</title>
|
||||
<para>HornetQ提供了一套强大的过滤器(filter)语言。它的语法是基于SQL 92表达式的部分语法。</para>
|
||||
<para>ActiveMQ提供了一套强大的过滤器(filter)语言。它的语法是基于SQL 92表达式的部分语法。</para>
|
||||
<para>实际上它与JMS选择器(selector)的语法是相同的。只是其中有一些预定义的标识符有所不同。有关
|
||||
JMS选择器的相关知识参见 <ulink
|
||||
url="http://java.sun.com/javaee/5/docs/api/javax/jms/Message.html"
|
||||
>javax.jms.Message</ulink>。</para>
|
||||
<para>HornetQ在以下以个地方使用了过滤器表达式:</para>
|
||||
<para>ActiveMQ在以下以个地方使用了过滤器表达式:</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>预定义的队列。当在<literal
|
||||
|
@ -45,7 +45,7 @@
|
|||
<xref linkend="management"/>中有所描述。</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
<para>HornetQ的内核过滤器表达式与JMS选择器表达式是有所不同的。JMS选择器应用于JMS消息,而HornetQ的内核过滤
|
||||
<para>ActiveMQ的内核过滤器表达式与JMS选择器表达式是有所不同的。JMS选择器应用于JMS消息,而ActiveMQ的内核过滤
|
||||
器表达式则用于内核消息。</para>
|
||||
<para>以下标识符可以用在内核消息的过滤器表达式中,用来引用内核消息的属性:</para>
|
||||
<itemizedlist>
|
||||
|
|
|
@ -26,10 +26,10 @@
|
|||
客户端不断积累,最終引起内存溢出的错误。</para>
|
||||
<section id="flow-control.consumer.window">
|
||||
<title>基于窗口的流控制</title>
|
||||
<para>默认情况下HornetQ的接收者一端会将消息进行缓存以提高性能。如果不这样做,那每次接收者收到一个消息,
|
||||
<para>默认情况下ActiveMQ的接收者一端会将消息进行缓存以提高性能。如果不这样做,那每次接收者收到一个消息,
|
||||
都得通知服务器传递下一个消息,然后服务器再将下一个消息传递过来。这就增加了通信的次数。</para>
|
||||
<para>对于每一次消息传递都有一个网络的往返通信,这样降低了性能。</para>
|
||||
<para>为了避免这样,HornetQ将每个接收者的消息提前接收到一处缓存中。每个缓存的最大值由
|
||||
<para>为了避免这样,ActiveMQ将每个接收者的消息提前接收到一处缓存中。每个缓存的最大值由
|
||||
<literal>consumer-window-size</literal>参数决定(单位字节)。</para>
|
||||
<para><literal>consumer-window-size</literal>的默认值是 1 MiB (1024 * 1024
|
||||
字节)。</para>
|
||||
|
@ -97,9 +97,9 @@
|
|||
<consumer-window-size>0</consumer-window-size>
|
||||
</connection-factory>
|
||||
</programlisting>
|
||||
<para>如果直接实例化连接工厂,则使用<literal>HornetQConnectionFactory.setConsumerWindowSize()</literal>
|
||||
<para>如果直接实例化连接工厂,则使用<literal>ActiveMQConnectionFactory.setConsumerWindowSize()</literal>
|
||||
方法来设定窗口大小。</para>
|
||||
<para>参见例子<xref linkend="examples.no-consumer-buffering"/>来了解如何配置HornetQ来
|
||||
<para>参见例子<xref linkend="examples.no-consumer-buffering"/>来了解如何配置ActiveMQ来
|
||||
关闭接收者的缓存。</para>
|
||||
</section>
|
||||
</section>
|
||||
|
@ -112,7 +112,7 @@
|
|||
<para>参见有关速率流控制的例子<xref linkend="examples.consumer-rate-limit"/>以进一步了解它的工作原理。</para>
|
||||
<section id="flow-control.rate.core.api">
|
||||
<title>使用核心接口(Core API)</title>
|
||||
<para>HornetQ的核心接口的<literal
|
||||
<para>ActiveMQ的核心接口的<literal
|
||||
>ClientSessionFactory.setConsumerMaxRate(int consumerMaxRate)</literal>方法或
|
||||
某些<literal>ClientSession.createConsumer()</literal>方法可以实现对流的速率控制。</para>
|
||||
</section>
|
||||
|
@ -131,7 +131,7 @@
|
|||
of 10 messages per sec -->
|
||||
<consumer-max-rate>10</consumer-max-rate>
|
||||
</connection-factory></programlisting>
|
||||
<para>如果是直接实例化连接工厂,则通过<literal>HornetQConnectionFactory.setConsumerMaxRate(int
|
||||
<para>如果是直接实例化连接工厂,则通过<literal>ActiveMQConnectionFactory.setConsumerMaxRate(int
|
||||
consumerMaxRate)</literal>方法来设定最大流速率。</para>
|
||||
<note>
|
||||
<para>速率流控制可以与窗口流控制结合使用。速率控制只规定了客户端每秒接收多少消息。因此如果你设定
|
||||
|
@ -143,7 +143,7 @@
|
|||
</section>
|
||||
<section>
|
||||
<title>发送者(producer)的流控制</title>
|
||||
<para>HornetQ还可以控制客户端向服务器发送消息的速度,以避免服务器因大量数据过载。</para>
|
||||
<para>ActiveMQ还可以控制客户端向服务器发送消息的速度,以避免服务器因大量数据过载。</para>
|
||||
<section>
|
||||
<title>基于窗口的流控制</title>
|
||||
<para>与接收者的相应的控制相似。在默认条件下,发送者要有足够的份额(credits)才可以向服务器的地址发送消息。
|
||||
|
@ -172,12 +172,12 @@
|
|||
</entries>
|
||||
<producer-window-size>10</producer-window-size>
|
||||
</connection-factory></programlisting>
|
||||
<para>如果是直接实例化连接工厂,则使用<literal>HornetQConnectionFactory.setProducerWindowSize(int
|
||||
<para>如果是直接实例化连接工厂,则使用<literal>ActiveMQConnectionFactory.setProducerWindowSize(int
|
||||
producerWindowSize)</literal>方法来设定窗口大小。</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>限定发送者窗口流控制</title>
|
||||
<para>通常情况下客户端请求多少份额,HornetQ服务器就给予多少份额。然而我们还可以针对每个地址来设定一个最大
|
||||
<para>通常情况下客户端请求多少份额,ActiveMQ服务器就给予多少份额。然而我们还可以针对每个地址来设定一个最大
|
||||
的份额值,以使服务器给出的份额都不大于该值。这样可以防止一个地址的内存溢出。</para>
|
||||
<para>例如,如果有一个队列称为“myqueue”。将它的最大内存值设为10MiB,则服务器就会控制给出的份额以保证向该队列的地
|
||||
址发送消息时不会占大于10MiB的内存空间。</para>
|
||||
|
@ -211,7 +211,7 @@
|
|||
</section>
|
||||
<section>
|
||||
<title>速率流控制</title>
|
||||
<para>HornetQ也可以控制发送者发送消息的速率。单位是每秒消息数。通过设定速率可保证发送者的发送速率不超过某个值。</para>
|
||||
<para>ActiveMQ也可以控制发送者发送消息的速率。单位是每秒消息数。通过设定速率可保证发送者的发送速率不超过某个值。</para>
|
||||
<para>速率必须是一个正整数。如果设为 <literal>-1</literal> 则关闭速率流控制。默认值是<literal>-1</literal>。</para>
|
||||
<para>请参见例子<xref linkend="producer-rate-limiting-example"/>进一步了解速率流控制的使用方法。</para>
|
||||
<section id="flow-control.producer.rate.core.api">
|
||||
|
@ -235,7 +235,7 @@
|
|||
of 10 messages per sec -->
|
||||
<producer-max-rate>10</producer-max-rate>
|
||||
</connection-factory></programlisting>
|
||||
<para>如果直接实例化连接工厂,则使用<literal>HornetQConnectionFactory.setProducerMaxRate(int
|
||||
<para>如果直接实例化连接工厂,则使用<literal>ActiveMQConnectionFactory.setProducerMaxRate(int
|
||||
consumerMaxRate)</literal>方法来设置。</para>
|
||||
</section>
|
||||
</section>
|
||||
|
|
|
@ -23,25 +23,25 @@
|
|||
<emphasis>当客户端当前连接的服务器发故障时,客户端可以将连接转到另一台正常的服务器,从而能够继续工作</emphasis>。</para>
|
||||
<section>
|
||||
<title>主要-备份对</title>
|
||||
<para>HornetQ可以将两个服务器以<emphasis>主要-备份对</emphasis>的形式连接在一起。目前HornetQ允许一个
|
||||
<para>ActiveMQ可以将两个服务器以<emphasis>主要-备份对</emphasis>的形式连接在一起。目前ActiveMQ允许一个
|
||||
主要服务器有一个备份服务器,一个备份服务器只有一个主要服务器。在正常情况下主要服务器工作,备份服务器只有当
|
||||
发生失效备援发生时工作。</para>
|
||||
<para>没有发生失效备援时,主要服务器为客户端提供服务,备份服务器处于待机状态。当客户端在失效备援后连接到备份服务
|
||||
器时,备份服务器开始激活并开始工作。</para>
|
||||
<section id="ha.mode">
|
||||
<title>高可获得性(HA)的模式</title>
|
||||
<para>HornetQ的高可获得性有两种模式:一种模式通过由主服务器日志向备份服务器日志
|
||||
<para>ActiveMQ的高可获得性有两种模式:一种模式通过由主服务器日志向备份服务器日志
|
||||
<emphasis>复制数据</emphasis>。另一种模式则是主服务器与备份服务器间<emphasis>存贮共享</emphasis>。</para>
|
||||
<note>
|
||||
<para>只有持久消息才可以在失效备援时不丢失。所有非持久消息则会丢失。</para>
|
||||
</note>
|
||||
<section id="ha.mode.replicated">
|
||||
<title>数据复制</title>
|
||||
<para>在这种模式下,保存在HornetQ主服务器中日志中的数据被复制到备份服务器日志中。注意我们并不复制
|
||||
<para>在这种模式下,保存在ActiveMQ主服务器中日志中的数据被复制到备份服务器日志中。注意我们并不复制
|
||||
服务器的全部状态,而是只复制日志和其它的持久性质的操作。</para>
|
||||
<para>复制的操作是异步进行的。数据通过流的方式复制,复制的結果则通过另一个流来返回。通过这样的异步方式
|
||||
我们可以获得比同步方式更大的呑吐量。</para>
|
||||
<para>当用户得到确认信息如一个事务已经提交、准备或加滚,或者是一个持久消息被发送时,HornetQ确保这些状态
|
||||
<para>当用户得到确认信息如一个事务已经提交、准备或加滚,或者是一个持久消息被发送时,ActiveMQ确保这些状态
|
||||
已经复制到备份服务器上并被持久化。</para>
|
||||
<para>数据复制这种方式不可避免地影响性能,但是另一方面它不依赖于昂贵的文件共享设备(如SAN)。它实际上是
|
||||
一种<emphasis role="italic">无共享</emphasis>的HA方式。</para>
|
||||
|
@ -93,7 +93,7 @@
|
|||
<para>当失效备援发生后,备份服务器代替主服务器工作,原来的主服务器失效。这时简单的重启主服务
|
||||
器是不行的。要想将主服务器与备份重新进行同步,就必须先将主服务器和备份服务器同时停止,再将
|
||||
主服务器的数据拷贝到备份服务器,然后再启动。</para>
|
||||
<para>HornetQ以后将支持备份与主服务器间的自动同步,无需停止主服务器。</para>
|
||||
<para>ActiveMQ以后将支持备份与主服务器间的自动同步,无需停止主服务器。</para>
|
||||
</section>
|
||||
</section>
|
||||
<section id="ha.mode.shared">
|
||||
|
@ -133,14 +133,14 @@
|
|||
<para>由于主备服务器之间共享存贮,所以它们不需要进行同步。但是它需要主备服务器同时工作以提供
|
||||
高可获得性。如果一量发生失效备援后,就需要在尽可能早的时间内将备份服务器(处于工作状态)停下来,
|
||||
然后再启动主服务器和备份服务器。</para>
|
||||
<para>HornetQ以后将支持自动同步功能,不需要先停止服务器。</para>
|
||||
<para>ActiveMQ以后将支持自动同步功能,不需要先停止服务器。</para>
|
||||
</section>
|
||||
</section>
|
||||
</section>
|
||||
</section>
|
||||
<section id="failover">
|
||||
<title>失效备援的模式</title>
|
||||
<para>HornetQ定义了两种客户端的失效备援:</para>
|
||||
<para>ActiveMQ定义了两种客户端的失效备援:</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>自动客户端失效备援</para>
|
||||
|
@ -149,26 +149,26 @@
|
|||
<para>应用层的客户端失效备援</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
<para>HornetQ还支持100%透明的同一个服务器的自动连接恢复(适用于网络的临时性故障)。这与失效备援很相似,
|
||||
<para>ActiveMQ还支持100%透明的同一个服务器的自动连接恢复(适用于网络的临时性故障)。这与失效备援很相似,
|
||||
只不过连接的是同一个服务器,参见<xref linkend="client-reconnection"/>。</para>
|
||||
<para>在发生失效备援时,如果客户端有非持久或临时队列的接收者时,这些队列会自动在备份服务器上重新创建。对于
|
||||
非持久性的队列,备份服务器事先是没有它们的信息的。</para>
|
||||
<section id="ha.automatic.failover">
|
||||
<title>自动客户端失效备援</title>
|
||||
<para>HornetQ的客户端可以配置主/备份服务器的信息,当客户端与主服务器的连接发生故障时,可以自动检测到故障并
|
||||
<para>ActiveMQ的客户端可以配置主/备份服务器的信息,当客户端与主服务器的连接发生故障时,可以自动检测到故障并
|
||||
进行失效备援处理,让客户端连接到备份服务器上。备份服务器可以自动重新创建所有在失效备援之前存在的会话与接收
|
||||
者。客户端不需要进行人工的连接恢复工作,从而节省了客户端的开发工作。</para>
|
||||
<para>HornetQ的客户端在参数<literal>client-failure-check-period</literal>(在
|
||||
<para>ActiveMQ的客户端在参数<literal>client-failure-check-period</literal>(在
|
||||
<xref linkend="connection-ttl"/>中进行了解释)规定的时间内如果没有收到数据包,则认为连接发生故障。
|
||||
当客户端认为连接故障时,它就会尝试进行失效备援。</para>
|
||||
<para>HornetQ有几种方法来为客户端配置主/备服务器对的列表。可以采用显式指定的方法,或者采用更为常用的
|
||||
<para>ActiveMQ有几种方法来为客户端配置主/备服务器对的列表。可以采用显式指定的方法,或者采用更为常用的
|
||||
<emphasis>服务器发现</emphasis>的方法。有关如何配置服务器发现的详细信息,请参见
|
||||
<xref linkend="clusters.server-discovery"/>。
|
||||
关于如何显式指定主/备服务器对的方法,请参见<xref linkend="clusters.static.servers"/>中的解释。</para>
|
||||
<para>要使客户端具备自动失效备援,在客户端的配置中必须要指定重试的次数要大于零(参见
|
||||
<xref linkend="client-reconnection"/>中的解释)。</para>
|
||||
<para>有时你需要在主服务器正常关机的情况下仍然进行失效备援。如果使用JMS,你需要将<literal
|
||||
>HornetQConnectionFactory</literal>的<literal
|
||||
>ActiveMQConnectionFactory</literal>的<literal
|
||||
>FailoverOnServerShutdown</literal>属性设为true,或者是在<literal
|
||||
>hornetq-jms.xml</literal>(参数为failover-on-server-shutdown)文件中进行相应的配置。如果使用的是核心接口,可以在创建
|
||||
<literal>ClientSessionFactoryImpl</literal>实例时将上述同名属性设置为true。
|
||||
|
@ -176,7 +176,7 @@
|
|||
<para>
|
||||
<note>
|
||||
<para>默认正常关机<emphasis role="bold">不会</emphasis>不会导致失效备援。</para>
|
||||
<para>使用CTRL-C来关闭HornetQ服务器或JBoss应用服务器属于正常关机,所以不会触发客户端的失效
|
||||
<para>使用CTRL-C来关闭ActiveMQ服务器或JBoss应用服务器属于正常关机,所以不会触发客户端的失效
|
||||
备援。</para>
|
||||
<para>要想在这种情况下进行失效备援必须将属性<literal>FailoverOnServerShutdown</literal>
|
||||
设为true。</para>
|
||||
|
@ -187,7 +187,7 @@
|
|||
如果重试次数超过的该参数的值,则连接失败。</para>
|
||||
<para>在有些情况下,你可能希望在初始连接失败和情况下自动连接到备份服务器,那么你可以直接在
|
||||
<literal>ClientSessionFactoryImpl</literal>或<literal
|
||||
>HornetQConnectionFactory</literal>上设置<literal>FailoverOnInitialConnection</literal>
|
||||
>ActiveMQConnectionFactory</literal>上设置<literal>FailoverOnInitialConnection</literal>
|
||||
参数,或者在配置文件中设置<literal
|
||||
>failover-on-initial-connection</literal>。默认的值是<literal>false</literal>。</para>
|
||||
<para>有关事务性及非事务性JMS会话的自动失效备援的例子,请参见
|
||||
|
@ -195,7 +195,7 @@
|
|||
linkend="examples.non-transaction-failover"/>。</para>
|
||||
<section id="ha.automatic.failover.noteonreplication">
|
||||
<title>关于服务器的复制</title>
|
||||
<para>HornetQ在主服务器向备份服务器复制时,并不复制服务器的全部状态。所以当一个会话在备份服务器
|
||||
<para>ActiveMQ在主服务器向备份服务器复制时,并不复制服务器的全部状态。所以当一个会话在备份服务器
|
||||
中重新创建后,它并不知道发送过的消息或通知过的消息。在失效备援的过程中发生的消息发送或通知也可
|
||||
能丢失。</para>
|
||||
<para>理论上如果进行全部状态的复制,我们可以提供100%的透明的失效备援,不会失去任何的消息或通知。
|
||||
|
@ -216,12 +216,12 @@
|
|||
<title>失效备援时阻塞调用的处理</title>
|
||||
<para>如果当发生失效备援时客户端正面进行一个阻塞调用并等待服务器的返回,新创建的会话不会知道这个调用,
|
||||
因此客户端可能永远也不会得到响应,也就可能一直阻塞在那里。</para>
|
||||
<para>为了防止这种情况的发生,HornetQ在失效备援时会解除所有的阻塞调用,同时抛出一个
|
||||
<para>为了防止这种情况的发生,ActiveMQ在失效备援时会解除所有的阻塞调用,同时抛出一个
|
||||
<literal>javax.jms.JMSException</literal>异常(如果是JMS)或<literal
|
||||
>ActiveMQException</literal>异常。异常的错误代码是<literal
|
||||
>ActiveMQException.UNBLOCKED</literal>。客户端需要自行处理这个异常,并且进行
|
||||
必要的操作重试。</para>
|
||||
<para>如果被解除阻塞的调用是commit()或者prepare(),那么这个事务会被自动地回滚,并且HornetQ
|
||||
<para>如果被解除阻塞的调用是commit()或者prepare(),那么这个事务会被自动地回滚,并且ActiveMQ
|
||||
会抛出一个<literal>javax.jms.TransactionRolledBackException</literal>(如果是JMS)
|
||||
或都是一个<literal>ActiveMQException</literal>,错误代码为 <literal
|
||||
>ActiveMQException.TRANSACTION_ROLLED_BACK</literal>(如果是核心接口)。</para>
|
||||
|
@ -236,7 +236,7 @@
|
|||
>ActiveMQException.TRANSACTION_ROLLED_BACK</literal>(如果是核心接口)。</para>
|
||||
<para>客户端需要自行处理这些异常,进行必要的回滚处理。注意这里不需要人工将会话进行回滚-此时它已经
|
||||
被回滚了。用户可以通过同一个会话重试该事务操作。</para>
|
||||
<para>HornetQ发布包中包括了一个完整的例子来展示如何处理这种情况。参见
|
||||
<para>ActiveMQ发布包中包括了一个完整的例子来展示如何处理这种情况。参见
|
||||
<xref linkend="examples.transaction-failover"/></para>
|
||||
<para>如果是在提交过程中发生了失效备援,服务器将这个阻塞调用解除。这种情况下客户端很难确定在事故发生
|
||||
之前事务是否在主服务器中得到了处理。</para>
|
||||
|
@ -244,7 +244,7 @@
|
|||
,并且在提交的调用被解除后重新尝试事务操作。如果在失效备援前事务确实在主服务器上已经完成提交,那么
|
||||
当事务进行重试时,重复检测功能可以保证重复发送的消息被丢弃,这样避免了消息的重复。</para>
|
||||
<note>
|
||||
<para>通过处理异常和重试,适当处理被解除的阻塞调用并配合重复检测功能,HornetQ可以在故障条件下保证
|
||||
<para>通过处理异常和重试,适当处理被解除的阻塞调用并配合重复检测功能,ActiveMQ可以在故障条件下保证
|
||||
一次并且只有一次的消息传递,没有消息丢失和消息重复。</para>
|
||||
</note>
|
||||
</section>
|
||||
|
@ -260,9 +260,9 @@
|
|||
<title>连接故障的通知</title>
|
||||
<para>JMS提供了标准的异步接收连接故障通知的机制:<literal>java.jms.ExceptionListener</literal>。
|
||||
请参考JMS的javadoc或者其它JMS教程来进一步了解怎样使用这个接口。</para>
|
||||
<para>HornetQ的核心接口也提供了一个相似的接口
|
||||
<para>ActiveMQ的核心接口也提供了一个相似的接口
|
||||
<literal>org.hornet.core.client.SessionFailureListener</literal>。</para>
|
||||
<para>任何ExceptionListener或SessionFailureListener的实例,在发生连接故障时,都会被HornetQ
|
||||
<para>任何ExceptionListener或SessionFailureListener的实例,在发生连接故障时,都会被ActiveMQ
|
||||
调用,<emphasis role="bold">不管</emphasis>该连接是否得到了失效备援、重新连接还是得到了恢复。</para>
|
||||
</section>
|
||||
<section>
|
||||
|
@ -270,7 +270,7 @@
|
|||
<para>在某些情况下你可能不需要自动的客户端失效备援,希望自己来处理连接故障,使用自己的重新连接方案等。
|
||||
我们把它称之为<emphasis>应用层</emphasis>失效备援,因为它是发生在应用层的程序中。</para>
|
||||
<para>为了实现应用层的失效备援,你可以使用监听器(listener)的方式。如果使用的是JMS,你需要在JMS连接上
|
||||
设置一个<literal>ExceptionListener</literal>类。这个类在连接发生故障时由HornetQ调用。在这个类
|
||||
设置一个<literal>ExceptionListener</literal>类。这个类在连接发生故障时由ActiveMQ调用。在这个类
|
||||
中你可以将旧的连接关闭,使用JNDI查找新的连接工厂并创建新的连接。这里你可以使用
|
||||
<ulink url="http://www.jboss.org/community/wiki/JBossHAJNDIImpl">HA-JNDI</ulink>
|
||||
来保证新的连接工厂来自于另一个服务器。</para>
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
|
||||
<chapter id="intercepting-operations">
|
||||
<title>拦截操作</title>
|
||||
<para>HornetQ支持<emphasis>拦截器</emphasis>。拦截器可以拦截进入服务器的数据包。每进入服务器
|
||||
<para>ActiveMQ支持<emphasis>拦截器</emphasis>。拦截器可以拦截进入服务器的数据包。每进入服务器
|
||||
一个数据包,拦截器就被调用一次,允许一些特殊和处理,例如对包的审计、过滤等。拦截器可以对数据包
|
||||
进行改动。</para>
|
||||
<section>
|
||||
|
|
|
@ -26,7 +26,7 @@
|
|||
它有着很好的互操作性。</para>
|
||||
<section id="stomp.native">
|
||||
<title>内建Stomp支持</title>
|
||||
<para>HornetQ内建支持Stomp功能。要使用Stomp发送与接收消息,必须配置一个<literal>NettyAcceptor</literal>,
|
||||
<para>ActiveMQ内建支持Stomp功能。要使用Stomp发送与接收消息,必须配置一个<literal>NettyAcceptor</literal>,
|
||||
其中的<literal>protocol</literal>参数值应设为<literal>stomp</literal>:</para>
|
||||
<programlisting>
|
||||
<acceptor name="stomp-acceptor">
|
||||
|
@ -34,8 +34,8 @@
|
|||
<param key="port" value="61613"/>
|
||||
</acceptor>
|
||||
</programlisting>
|
||||
<para>有了上述的配置,HornetQ就可以在端口<literal>61613</literal>(这是Stomp代理的默认端口)接受Stomp连接了。</para>
|
||||
<para><literal>stomp</literal>例子展示了如何在HornetQ中配置Stomp。</para>
|
||||
<para>有了上述的配置,ActiveMQ就可以在端口<literal>61613</literal>(这是Stomp代理的默认端口)接受Stomp连接了。</para>
|
||||
<para><literal>stomp</literal>例子展示了如何在ActiveMQ中配置Stomp。</para>
|
||||
<section>
|
||||
<title>限制</title>
|
||||
<para>消息的通知不是事务性的。ACK信号不能作为事务的一部分来传输(如果设置了<literal>transaction</literal>
|
||||
|
@ -43,19 +43,19 @@
|
|||
</section>
|
||||
</section>
|
||||
<section>
|
||||
<title>Stomp目标与HornetQ的地址和队列的映射</title>
|
||||
<title>Stomp目标与ActiveMQ的地址和队列的映射</title>
|
||||
<para>Stomp客户端在消息发送和订阅中使用的是<emphasis>目标(destination)</emphasis>。目标名称是简单的字符串,对应的是服务
|
||||
器端的目的地。不同服务器对这种映射有着不同的实现。</para>
|
||||
<para>在HornetQ中这些目标被映射为<emphasis>地址</emphasis>和<emphasis>队列</emphasis>。
|
||||
<para>在ActiveMQ中这些目标被映射为<emphasis>地址</emphasis>和<emphasis>队列</emphasis>。
|
||||
当一个Stomp客户端发送一个消息(使用<literal>SEND</literal>信号)到一个目标时,这个目标被映射到一个地址。
|
||||
如果一个Stomp客户端订阅(或解除订阅)一个目标时(使用<literal>SUBSCRIBE</literal>或
|
||||
<literal>UNSUBSCRIBE</literal>),这个目标被映射到一个HornetQ的队列。</para>
|
||||
<literal>UNSUBSCRIBE</literal>),这个目标被映射到一个ActiveMQ的队列。</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>Stomp与JMS的互操作性</title>
|
||||
<section>
|
||||
<title>使用JMS目标</title>
|
||||
<para>正如<xref linkend="jms-core-mapping" />解释的那样,JMS的目标同样映射到HornetQ的地址与队列。如果你使用
|
||||
<para>正如<xref linkend="jms-core-mapping" />解释的那样,JMS的目标同样映射到ActiveMQ的地址与队列。如果你使用
|
||||
Stomp向JMS的目标发送消息,那么Stomp的目标必须要遵照相同的命名规则:</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
|
@ -97,8 +97,8 @@ hello queue orders
|
|||
</section>
|
||||
<section id="stomp.websockets">
|
||||
<title>通过Web Sockets使用Stomp</title>
|
||||
<para>HornetQ还支持通过<ulink url="http://dev.w3.org/html5/websockets/">Web Sockets</ulink>使用Stomp。任何支持
|
||||
Web Socket的浏览器中可以利用HornetQ来发送和接收Stomp消息。</para>
|
||||
<para>ActiveMQ还支持通过<ulink url="http://dev.w3.org/html5/websockets/">Web Sockets</ulink>使用Stomp。任何支持
|
||||
Web Socket的浏览器中可以利用ActiveMQ来发送和接收Stomp消息。</para>
|
||||
<para>要使用些功能,必须配置一个<literal>NettyAcceptor</literal>,并设置<literal>protocol</literal>
|
||||
的值为<literal>stomp_ws</literal>:</para>
|
||||
<programlisting>
|
||||
|
@ -108,35 +108,35 @@ hello queue orders
|
|||
<param key="port" value="61614"/>
|
||||
</acceptor>
|
||||
</programlisting>
|
||||
<para>使用上面配置,HornetQ在URL路径<literal>/stomp</literal>下端口<literal>61614</literal>接收Stomp连接。
|
||||
<para>使用上面配置,ActiveMQ在URL路径<literal>/stomp</literal>下端口<literal>61614</literal>接收Stomp连接。
|
||||
浏览器然后就可以连接到<literal>ws://<server>:61614/stomp</literal>,使用Web Socket来发送和接收
|
||||
Stomp消息了。</para>
|
||||
<para>为了简化客户端的开发,在<ulink url="http://github.com/jmesnil/stomp-websocket">GitHub</ulink>
|
||||
上提供了一个JavaScript库(参见<ulink url="http://jmesnil.net/stomp-websocket/doc/">文档</ulink>)。</para>
|
||||
<para><literal>stomp-websockets</literal>例子给出一如何配置HornetQ服务器以使浏览器和Java应用程序通过一个JMS话题
|
||||
<para><literal>stomp-websockets</literal>例子给出一如何配置ActiveMQ服务器以使浏览器和Java应用程序通过一个JMS话题
|
||||
进行消息的传递。</para>
|
||||
</section>
|
||||
<section id="stompconnect">
|
||||
<title>StompConnect</title>
|
||||
<para><ulink url="http://stomp.codehaus.org/StompConnect">StompConnect</ulink>是一个Stomp代理服务器,
|
||||
它可以将Stomp协议转换为标准的JMS接口调用。因此,通过StompConnect的作用HornetQ可以作为一个Stomp代理,
|
||||
它可以将Stomp协议转换为标准的JMS接口调用。因此,通过StompConnect的作用ActiveMQ可以作为一个Stomp代理,
|
||||
与任何一个Stomp客户端通迅。这些客户端可以由C、C++、C#及.net等语言实现。</para>
|
||||
<para>要运行StompConnect首先要启动HornetQ服务以及JNDI服务。</para>
|
||||
<para>要运行StompConnect首先要启动ActiveMQ服务以及JNDI服务。</para>
|
||||
<para>Stomp需要<literal>jndi.properties</literal>文件要在classpath中。该文件
|
||||
应有如下类似的内容:</para>
|
||||
<programlisting>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</programlisting>
|
||||
<para>要确保该文件与StompConnect的jar包以及HornetQ的jar文件都在classpath中。最后,运行
|
||||
<para>要确保该文件与StompConnect的jar包以及ActiveMQ的jar文件都在classpath中。最后,运行
|
||||
<literal>java org.codehaus.stomp.jms.Main</literal>。</para>
|
||||
</section>
|
||||
</section>
|
||||
<section>
|
||||
<title>REST</title>
|
||||
<para>HornetQ即将支持REST!</para>
|
||||
<para>ActiveMQ即将支持REST!</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>AMQP</title>
|
||||
<para>HornetQ即将支持AMQP!</para>
|
||||
<para>ActiveMQ即将支持AMQP!</para>
|
||||
</section>
|
||||
</chapter>
|
||||
|
|
|
@ -18,16 +18,16 @@
|
|||
<!-- ============================================================================= -->
|
||||
<chapter id="jms-bridge">
|
||||
<title>JMS桥(Bridge)</title>
|
||||
<para>HornetQ提供了JMS消息桥服务。</para>
|
||||
<para>ActiveMQ提供了JMS消息桥服务。</para>
|
||||
<para>桥的作用是从一个消息源队列或话题(topic)接收消息,然后将它们发送到一个目标队列或话题。通常源和
|
||||
目的不在同一台服务器上。</para>
|
||||
<para>作为消息源的服务器与目的服务器不必在同一个集群内。通过桥的作用,两台服务器可以通过非可靠的网络连接
|
||||
起来,比如WAN。</para>
|
||||
<para>桥可以作为单独的服务部署,或者部署于HornetQ单独服务器内,或者部署在JBoss应用服务器中。源或目的可以
|
||||
<para>桥可以作为单独的服务部署,或者部署于ActiveMQ单独服务器内,或者部署在JBoss应用服务器中。源或目的可以
|
||||
在同一个VM中,也可以在其它的VM中。</para>
|
||||
<para>桥还可以在HornetQ服务器与其它JMS 1.1 兼容的服务器之间进行消息的传递。
|
||||
<para>桥还可以在ActiveMQ服务器与其它JMS 1.1 兼容的服务器之间进行消息的传递。
|
||||
<note><para>还要将JMS桥与核心桥混淆。JMB桥可以连接两个JMS 1.1兼容的服务器,它使用的是JMS接口。
|
||||
而核心桥(在<xref linkend="core-bridges"/>中描述)使用核心API将两个HornetQ实例连接
|
||||
而核心桥(在<xref linkend="core-bridges"/>中描述)使用核心API将两个ActiveMQ实例连接
|
||||
起来。核心桥的性能通常要比JMS桥的性能高,所以尽可能使用核心桥。另外核心桥可以不用XA
|
||||
就可以实现<emphasis>一次并只有一次</emphasis>的消息传递保证。</para></note></para>
|
||||
<para>桥可以适当处理连接故障。当源的连接或目的的连接发生故障时,例如网络故障,桥将不断重试连接直到连接
|
||||
|
@ -42,8 +42,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>
|
||||
|
@ -311,14 +311,14 @@
|
|||
<section>
|
||||
<title>源和目的的连接工厂</title>
|
||||
<para>源工目的的连接工厂分别用于创建到源和到目的的连接。</para>
|
||||
<para>上面的配置例子中使用的是HornetQ提供的默认实现。它使用JNDI查找连接工厂。对于其它的应用服务器
|
||||
<para>上面的配置例子中使用的是ActiveMQ提供的默认实现。它使用JNDI查找连接工厂。对于其它的应用服务器
|
||||
或JMS提供者,需要实现相应的实现,即实现<literal
|
||||
>org.apache.activemq.jms.bridge.ConnectionFactoryFactory</literal>接口。</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>源和目的的目标工厂</title>
|
||||
<para>它们用来创建或查找相应的目标。</para>
|
||||
<para>上面例子中,我们使用了HornetQ的默认实现,从JNDI中查找相应的对象。</para>
|
||||
<para>上面例子中,我们使用了ActiveMQ的默认实现,从JNDI中查找相应的对象。</para>
|
||||
<para>要提供新的实现,只要实现接口<literal
|
||||
>org.apache.activemq.jms.bridge.DestinationFactory</literal>即可。</para>
|
||||
</section>
|
||||
|
@ -342,7 +342,7 @@
|
|||
<section>
|
||||
<title>ONCE_AND_ONLY_ONCE</title>
|
||||
<para>这个模式保证消息从源发送到目的一次,并且只有一次。(有时这个模式又称为“只一次”)。若源与目的处于
|
||||
同一个HornetQ服务器中,这个模式通过本地事务来保证消息的发送和通知。如果是在不同的服务器上,
|
||||
同一个ActiveMQ服务器中,这个模式通过本地事务来保证消息的发送和通知。如果是在不同的服务器上,
|
||||
则会使用一个JTA的事务将发送和接收包括其中。这里使用的JTA事务是JBoss的实现,它包含有一个
|
||||
完整的事务恢复管理器,所以能提供高度可靠的持久性。如果使用JTA则桥的所有连接工厂必须是
|
||||
XAConnectionFactory。这种模式的效率通常是最低的,因为它需要额外记录事务的日志。</para>
|
||||
|
@ -360,7 +360,7 @@
|
|||
<title>JMS bridge中的超时问题</title>
|
||||
<para>有时候目标服务器或源服务器会连接不上,这里桥就会尝试重新连接。重新连接的次数由<literal>Max Retries</literal>
|
||||
参数决定,两次重新连接的时间间隔由<literal>Failure Retry Interval</literal>定义。</para>
|
||||
<para>在重新尝试时会进行JNDI的查找。HornetQ的JNDI使用的是JBoss的实现,如果在JNDI查找过程中网络出现故障,
|
||||
<para>在重新尝试时会进行JNDI的查找。ActiveMQ的JNDI使用的是JBoss的实现,如果在JNDI查找过程中网络出现故障,
|
||||
查找的操作可能挂起。为了避免这种情况的发生,我们可以为JNDI设置适当的超时。这是通过定义初始上下文的
|
||||
<literal>jnp.timeout</literal>参数和<literal>jnp.sotimeout</literal>参数来
|
||||
实现的。第一个参数定义了初始连接的超时,第二个参数定义的是套接字的读取超时。</para>
|
||||
|
@ -376,7 +376,7 @@
|
|||
<title>例子</title>
|
||||
<para>参见<xref linkend="examples.javaee.jms-bridge"/>。这个例子展示了如何在JBoss应用服务器中配置并使用
|
||||
JMS桥从一处目标将消息转发到另一个目标。</para>
|
||||
<para>关于如何在两个单独HornetQ服务器间使用桥的例子,请参见<xref linkend="examples.jms.jms-bridge"/>。</para>
|
||||
<para>关于如何在两个单独ActiveMQ服务器间使用桥的例子,请参见<xref linkend="examples.jms.jms-bridge"/>。</para>
|
||||
</section>
|
||||
</section>
|
||||
</chapter>
|
||||
|
|
|
@ -18,8 +18,8 @@
|
|||
<!-- ============================================================================= -->
|
||||
<chapter id="jms-core-mapping">
|
||||
<title>JMS与内核API之间的映射关系</title>
|
||||
<para>本意讲述JMS的目标实体(destination)如何映射到HornetQ的地址(addresses)。</para>
|
||||
<para>HornetQ的内核没有JMS的任何实现。在内核中没有topic的概念,它是通过在一个地址上(相当于topic的名字)绑定
|
||||
<para>本意讲述JMS的目标实体(destination)如何映射到ActiveMQ的地址(addresses)。</para>
|
||||
<para>ActiveMQ的内核没有JMS的任何实现。在内核中没有topic的概念,它是通过在一个地址上(相当于topic的名字)绑定
|
||||
零或多个queue来实现JMS topic的功能的。每个绑定的queue相当于该topic的一个订阅(subscription)。
|
||||
类似地通过在一个地址上(相当于queue的名字)绑定单一的queue就可以实现JMS queue的功能。</para>
|
||||
<para>按照惯例,所有的JMS queue所对应的内核queue的名字都以<literal>jms.queue.</literal>做为开头。比如
|
||||
|
|
|
@ -18,10 +18,10 @@
|
|||
<!-- ============================================================================= -->
|
||||
<chapter id="large-messages">
|
||||
<title>大消息</title>
|
||||
<para>HornetQ支持超大消息的发送和接收。消息的大小不受客户端或服务器端的内存限制。它只受限于你的磁盘空间的大小。
|
||||
<para>ActiveMQ支持超大消息的发送和接收。消息的大小不受客户端或服务器端的内存限制。它只受限于你的磁盘空间的大小。
|
||||
在我们作过的测试中,消息最大可达8GiB,而客户端和服务器端的内存只有50MiB!</para>
|
||||
<para>要发送一个大消息,用户需要为大消息提供一个<literal>InputStream</literal>,当大消息被发送时,
|
||||
HornetQ从该<literal>InputStream</literal>读取消息。例如,要将一个磁盘中的大文件以消息形式发送,可以
|
||||
ActiveMQ从该<literal>InputStream</literal>读取消息。例如,要将一个磁盘中的大文件以消息形式发送,可以
|
||||
使用<literal>FileInputStream</literal>。</para>
|
||||
<para>数据从<literal>InputStream</literal>读出并分解为一个个数据片段向服务器以流的形式发送。服务器在收到
|
||||
这些片段后将它们保存到磁盘上。当服务器准备向接收者传递消息时,它将这些片段读回,同样以片段流的形式向接收者
|
||||
|
@ -29,7 +29,7 @@
|
|||
以便向大消息保存到磁盘上或其它地方。从发送到接收整个过程中不需要整个消息都在内存中。</para>
|
||||
<section id="large.message.configuring">
|
||||
<title>服务器端的配置</title>
|
||||
<para>大消息在服务器端是直接保存在磁盘目录中。这一目录可以在HornetQ的配置文件中定义。</para>
|
||||
<para>大消息在服务器端是直接保存在磁盘目录中。这一目录可以在ActiveMQ的配置文件中定义。</para>
|
||||
<para>这个参数的名字是<literal>large-messages-directory</literal>:</para>
|
||||
<programlisting><configuration xmlns="urn:activemq"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
|
@ -53,10 +53,10 @@
|
|||
<para>默认值是100KiB.</para>
|
||||
<section id="large-messages.core.config">
|
||||
<title>使用核心的API</title>
|
||||
<para>如果使用HornetQ的核心,<literal>ClientSessionFactory.setMinLargeMessageSize</literal>方法
|
||||
<para>如果使用ActiveMQ的核心,<literal>ClientSessionFactory.setMinLargeMessageSize</literal>方法
|
||||
可以设置大消息的最小值。</para>
|
||||
<programlisting>ClientSessionFactory factory =
|
||||
HornetQClient.createClientSessionFactory(new
|
||||
ActiveMQClient.createClientSessionFactory(new
|
||||
TransportConfiguration(NettyConnectorFactory.class.getName()), null);
|
||||
factory.setMinLargeMessageSize(25 * 1024);</programlisting>
|
||||
<para><xref linkend="configuring-transports.client.side"/>对于如何实例化一个会话工厂(session factory)
|
||||
|
@ -79,13 +79,13 @@ factory.setMinLargeMessageSize(25 * 1024);</programlisting>
|
|||
</connection-factory>
|
||||
...</programlisting>
|
||||
<para>如果是直接实例化连接工厂,则使用<literal
|
||||
>HornetQConnectionFactory.setMinLargeMessageSize</literal>方法来定义。</para>
|
||||
>ActiveMQConnectionFactory.setMinLargeMessageSize</literal>方法来定义。</para>
|
||||
</section>
|
||||
</section>
|
||||
<section>
|
||||
<title>大消息与流(stream)</title>
|
||||
<para>在HornetQ中可以定义大消息所使用的输入和输出流(<literal>java.lang.io</literal>)。</para>
|
||||
<para>HornetQ将使用定义的流来发送(输入流)和接收(输出流)大消息。</para>
|
||||
<para>在ActiveMQ中可以定义大消息所使用的输入和输出流(<literal>java.lang.io</literal>)。</para>
|
||||
<para>ActiveMQ将使用定义的流来发送(输入流)和接收(输出流)大消息。</para>
|
||||
<para>在使用输出流接收大消息时,有两种选择:你可以用<literal>ClientMessage.saveOutputStream</literal>方法
|
||||
以阻塞的方式保存大消息;或者你可以使用<literal>ClientMessage.setOutputstream</literal>方法
|
||||
以异步方法保存大消息。在采用后一种方法时,必须保证接收者(consumer)在大消息的接收过程中保持
|
||||
|
@ -157,7 +157,7 @@ msg.setInputStream(dataInputStream);
|
|||
</section>
|
||||
<section id="large-messages.streaming.over.jms">
|
||||
<title>在JMS中使用流</title>
|
||||
<para>使用JMS时,HornetQ根据定义的属性值调用对应的核心接口(参见 <xref
|
||||
<para>使用JMS时,ActiveMQ根据定义的属性值调用对应的核心接口(参见 <xref
|
||||
linkend="large-messages.ClientMessageAPI"/>)来使用流。你只需要用
|
||||
<literal>Message.setObjectProperty</literal>方法设置适当的输入/输出流即可。</para>
|
||||
<para>输入流<literal>InputStream</literal>可以通过JMS属性JMS_HQ_InputStream来定义:</para>
|
||||
|
|
|
@ -18,26 +18,26 @@
|
|||
<!-- ============================================================================= -->
|
||||
<chapter id="libaio">
|
||||
<title>Libaio平台专有库</title>
|
||||
<para>HornetQ发布包中包括一个平台专有的库,它可以使HornetQ使用Linux操作系统的libaio。</para>
|
||||
<para>ActiveMQ发布包中包括一个平台专有的库,它可以使ActiveMQ使用Linux操作系统的libaio。</para>
|
||||
<para><literal>libaio</literal>是Linux项目的一个库。它将用户提交的写操作用异步的方式执行。通过
|
||||
回调用户的代码来通知写操作的完成。</para>
|
||||
<para>通过配置,HornetQ可以使用这个库来访问高性能的日志,具体请参见 <xref
|
||||
<para>通过配置,ActiveMQ可以使用这个库来访问高性能的日志,具体请参见 <xref
|
||||
linkend="persistence"/>。</para>
|
||||
<para>下面列出了HornetQ所带的平台专有库文件:</para>
|
||||
<para>下面列出了ActiveMQ所带的平台专有库文件:</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>libHornetQAIO32.so - x86 32 位平台</para>
|
||||
<para>libActiveMQAIO32.so - x86 32 位平台</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>libHornetQAIO64.so - x86 64 位平台</para>
|
||||
<para>libActiveMQAIO64.so - x86 64 位平台</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
<para>当使用libaio时,HornetQ会在<link linkend="using-server.library.path">库路径</link>中寻找并装
|
||||
<para>当使用libaio时,ActiveMQ会在<link linkend="using-server.library.path">库路径</link>中寻找并装
|
||||
载这些文件。</para>
|
||||
<section>
|
||||
<title>库文件的编译</title>
|
||||
<para>如果你的Linux平台不是x86_32或x86_64(比如Itanium 64或IBM Power),你需要自己编译相应的库文件,
|
||||
因为HornetQ不提供这些平台的库文件。</para>
|
||||
因为ActiveMQ不提供这些平台的库文件。</para>
|
||||
<section>
|
||||
<title>安装要求</title>
|
||||
<note>
|
||||
|
@ -85,7 +85,7 @@
|
|||
</section>
|
||||
<section>
|
||||
<title>开始编译</title>
|
||||
<para>在HornetQ发布包的<literal>native-src</literal>目录下,执行shell脚本
|
||||
<para>在ActiveMQ发布包的<literal>native-src</literal>目录下,执行shell脚本
|
||||
<literal>bootstrap</literal>。这个脚本会调用 <literal
|
||||
>automake</literal>以及<literal>make</literal>来创建所有的make文件和专有库。</para>
|
||||
<programlisting>someUser@someBox:/messaging-distribution/native-src$ ./bootstrap
|
||||
|
@ -105,10 +105,10 @@ config.status: executing libtool commands
|
|||
|
||||
...</programlisting>
|
||||
<para>编译好的库文件在<literal
|
||||
>./native-src/src/.libs/libHornetQAIO.so</literal>。将该文件移到发布包的
|
||||
>./native-src/src/.libs/libActiveMQAIO.so</literal>。将该文件移到发布包的
|
||||
<literal>bin</literal>目录下,或者你的<link linkend="using-server.library.path">库目录</link>
|
||||
所指向的目录即可。</para>
|
||||
<para>如果你修改了HornetQ的libaio代码,只需要在<literal>native-src</literal>目录下直挂运行make即可完成编译。</para>
|
||||
<para>如果你修改了ActiveMQ的libaio代码,只需要在<literal>native-src</literal>目录下直挂运行make即可完成编译。</para>
|
||||
</section>
|
||||
</section>
|
||||
</chapter>
|
||||
|
|
|
@ -18,11 +18,11 @@
|
|||
<!-- ============================================================================= -->
|
||||
<chapter id="logging">
|
||||
<title>日志(Logging)</title>
|
||||
<para>HornetQ有自己的独立的日志系统,不依赖于任何其它的日志框架。在默认情况下所有HornetQ的日志将输入到
|
||||
<para>ActiveMQ有自己的独立的日志系统,不依赖于任何其它的日志框架。在默认情况下所有ActiveMQ的日志将输入到
|
||||
标准的<ulink
|
||||
url="http://java.sun.com/j2se/1.4.2/docs/guide/util/logging/">JDK日志系统</ulink>,
|
||||
(即JUL-Java Util Logging)。服务器在默认条件下读取config目录下的
|
||||
<literal>logging.properties</literal>文件做为JUL的配置文件。它配置了使用HornetQ自己的格式化
|
||||
<literal>logging.properties</literal>文件做为JUL的配置文件。它配置了使用ActiveMQ自己的格式化
|
||||
方法,将日志输出到屏幕终端(Console)及文件中。请访问Sun公司的相关网址来进一步了解如何配置使用JUL。</para>
|
||||
<para>你可以通过编程或定义系统变量的方法来配置不同的日志代理(Logging Delegate)。</para>
|
||||
<para>采用编程方法,只需要调用方法:
|
||||
|
@ -32,7 +32,7 @@
|
|||
<para>如果要使用系统变量方法,则需要设置变量<literal
|
||||
>org.apache.activemq.logger-delegate-factory-class-name</literal>为相应的代理工厂,即
|
||||
<programlisting>-Dorg.apache.activemq.logger-delegate-factory-class-name=org.apache.activemq.integration.logging.Log4jLogDelegateFactory</programlisting></para>
|
||||
<para>上面的例子可以看出HornetQ提供了一些代理工厂以方便用户使用,它们是:<orderedlist
|
||||
<para>上面的例子可以看出ActiveMQ提供了一些代理工厂以方便用户使用,它们是:<orderedlist
|
||||
><listitem><para>org.apache.activemq.core.logging.impl.JULLogDelegateFactory - 默认的JUL日志代理工厂。</para>
|
||||
</listitem><listitem><para>org.apache.activemq.integration.logging.Log4jLogDelegateFactory
|
||||
- Log4J的日志代理工厂。</para></listitem></orderedlist></para>
|
||||
|
@ -40,7 +40,7 @@
|
|||
>java.util.logging.config.file</literal>属性。</para>
|
||||
<section>
|
||||
<title>与JBoss应用服务器日志的关系</title>
|
||||
<para>当HornetQ部署到JBoss应用服务器版本5.x或以上时,虽然HornetQ仍然使用JUL,但是所有的日志输出被重定向到
|
||||
<para>当ActiveMQ部署到JBoss应用服务器版本5.x或以上时,虽然ActiveMQ仍然使用JUL,但是所有的日志输出被重定向到
|
||||
JBoss logger。请参阅相关的JBoss文档来了解更多的信息。如果是以前版本的JBoss,则必需指定你所需要的日志代理。</para>
|
||||
</section>
|
||||
</chapter>
|
||||
|
|
|
@ -18,20 +18,20 @@
|
|||
<!-- ============================================================================= -->
|
||||
<chapter id="management">
|
||||
<title>管理</title>
|
||||
<para>HornetQ拥有套丰富的管理接口。用户使用这些接口可以修改服务器配置、创建新的资源(如队列和
|
||||
<para>ActiveMQ拥有套丰富的管理接口。用户使用这些接口可以修改服务器配置、创建新的资源(如队列和
|
||||
话题)、检查这些资源(如队列中有多少消息)并进行管理(从队列中删除消息)。这样用户可以
|
||||
<emphasis>管理</emphasis>HornetQ。另外,客户还可以订阅管理通知。</para>
|
||||
<para>有三种方式管理HornetQ:</para>
|
||||
<emphasis>管理</emphasis>ActiveMQ。另外,客户还可以订阅管理通知。</para>
|
||||
<para>有三种方式管理ActiveMQ:</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>使用JMX -- JMX是标准的Java应用程序管理方式。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>使用核心接口 -- 管理操作通过<emphasis>核心消息</emphasis>的方法发向HornetQ服
|
||||
<para>使用核心接口 -- 管理操作通过<emphasis>核心消息</emphasis>的方法发向ActiveMQ服
|
||||
务。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>使用JMS接口 -- 管理操作通过<emphasis>JMS消息</emphasis>的方式发向HornetQ服务器。</para>
|
||||
<para>使用JMS接口 -- 管理操作通过<emphasis>JMS消息</emphasis>的方式发向ActiveMQ服务器。</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
<para>虽然有三种方式,但它们提供相同的功能。使用JMX方法能完成的功能使用核心接口或JMS接口都可以完成。</para>
|
||||
|
@ -40,7 +40,7 @@
|
|||
<title>管理接口API</title>
|
||||
<para>不管使用哪种方式,管理接口都是一样的。</para>
|
||||
<para>对于每个<emphasis>被管理的资源</emphasis>都有一个Java的接口提供可使用的操作。</para>
|
||||
<para>HornetQ的管理接口分布在2个包中:</para>
|
||||
<para>ActiveMQ的管理接口分布在2个包中:</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para><emphasis>核心</emphasis>资源的管理接口在 <literal
|
||||
|
@ -60,7 +60,7 @@
|
|||
</note>
|
||||
<section>
|
||||
<title>核心管理接口</title>
|
||||
<para>HornetQ定义了一套对核心资源的管理接口。关于它们的详细说明请参见相应的javadoc。
|
||||
<para>ActiveMQ定义了一套对核心资源的管理接口。关于它们的详细说明请参见相应的javadoc。
|
||||
下面是对它们的概述:</para>
|
||||
<section>
|
||||
<title>核心服务器管理</title>
|
||||
|
@ -68,7 +68,7 @@
|
|||
<listitem>
|
||||
<para>队列的列表、创建、部署与删除</para>
|
||||
<para><literal>getQueueNames()</literal> method方法用来列出所有已经部署的队列。</para>
|
||||
<para>在<literal>HornetQServerControl</literal> (ObjectName <literal
|
||||
<para>在<literal>ActiveMQServerControl</literal> (ObjectName <literal
|
||||
>org.apache.activemq:module=Core,type=Server</literal>或资源名<literal
|
||||
>core.server</literal>)上有队列创建或删除的方法,它们是
|
||||
<literal>createQueue()</literal>、<literal>deployQueue()</literal>和
|
||||
|
@ -110,14 +110,14 @@
|
|||
</listitem>
|
||||
<listitem>
|
||||
<para>获得服务器的配置和属性</para>
|
||||
<para><literal>HornetQServerControl</literal>提供了访问HornetQ服务器所有属性
|
||||
<para><literal>ActiveMQServerControl</literal>提供了访问ActiveMQ服务器所有属性
|
||||
的方法(例如<literal>getVersion()</literal>方法可以得到服务器的版本,等等)。 </para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>核心桥和转发器的创建,删除与列表</para>
|
||||
<para>使用<literal>getBridgeNames()</literal>可以列出部署的核心桥。
|
||||
使用<literal>getDivertNames()</literal>可以列出部署的转发器。</para>
|
||||
<para>使用<literal>HornetQServerControl</literal> (ObjectName <literal
|
||||
<para>使用<literal>ActiveMQServerControl</literal> (ObjectName <literal
|
||||
>org.apache.activemq:module=Core,type=Server</literal> 或资源名 <literal
|
||||
>core.server</literal>)的方法<literal>createBridge()</literal>
|
||||
和<literal>destroyBridge()</literal>可以创建和删除核心桥。
|
||||
|
@ -203,7 +203,7 @@
|
|||
</section>
|
||||
<section>
|
||||
<title>其它核心资源的管理</title>
|
||||
<para>HornetQ允许用户启动或停止其远程资源(接收器,转发器,桥,等等)。这样可以使服务器暂停工作
|
||||
<para>ActiveMQ允许用户启动或停止其远程资源(接收器,转发器,桥,等等)。这样可以使服务器暂停工作
|
||||
而不需要完全停止服务器(比如可以临时对服务器进行一些离线操作,像对一些事务的处理)。这些资源有:</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
|
@ -273,7 +273,7 @@
|
|||
</section>
|
||||
<section>
|
||||
<title>JMS管理接口</title>
|
||||
<para>HornetQ定义了一套JMS管理接口来管理JMS的<emphasis>可管理的对象</emphasis>
|
||||
<para>ActiveMQ定义了一套JMS管理接口来管理JMS的<emphasis>可管理的对象</emphasis>
|
||||
(例如JMS队列,话题及连接工厂)。</para>
|
||||
<section>
|
||||
<title>JMS服务器管理</title>
|
||||
|
@ -414,10 +414,10 @@
|
|||
</section>
|
||||
<section id="management.jmx">
|
||||
<title>使用JMX</title>
|
||||
<para>HornetQ提供了<ulink
|
||||
<para>ActiveMQ提供了<ulink
|
||||
url="http://java.sun.com/javase/technologies/core/mntr-mgmt/javamanagement/"
|
||||
>JMX</ulink>。</para>
|
||||
<para>HornetQ通过MBean的接口暴露其JMX管理操作。它将自己的资源注册到<literal>org.apache.activemq</literal>域。</para>
|
||||
<para>ActiveMQ通过MBean的接口暴露其JMX管理操作。它将自己的资源注册到<literal>org.apache.activemq</literal>域。</para>
|
||||
<para>比如,用来管理一个名为<literal>exampleQueue</literal>JMS队列的<literal>ObjectName</literal>是:</para>
|
||||
<programlisting>
|
||||
org.apache.activemq:module=JMS,type=Queue,name="exampleQueue"
|
||||
|
@ -429,30 +429,30 @@
|
|||
<para>MBean的<literal>ObjectName</literal>用 <literal
|
||||
>org.apache.activemq.api.core.management.ObjectNameBuilder</literal>来产生出来的。你也可以使用<literal
|
||||
>jconsole</literal>来查找你想要的MBean的<literal>ObjectName</literal>。</para>
|
||||
<para>使用JMX来管理HornetQ与用JMX管理其它Java应用程序没有什么不同。你可以使用反射或者创建MBean代理的方法。</para>
|
||||
<para>使用JMX来管理ActiveMQ与用JMX管理其它Java应用程序没有什么不同。你可以使用反射或者创建MBean代理的方法。</para>
|
||||
<section id="management.jmx.configuration">
|
||||
<title>配置JMX</title>
|
||||
<para>默认情况下HornetQ的JMX是打开的。将<literal
|
||||
<para>默认情况下ActiveMQ的JMX是打开的。将<literal
|
||||
>activemq-configuration.xml</literal>文件中的<literal
|
||||
>jmx-management-enabled</literal>设置为<literal>false</literal>就可以关闭JMX:</para>
|
||||
<programlisting>
|
||||
<!-- false to disable JMX management for HornetQ -->
|
||||
<!-- false to disable JMX management for ActiveMQ -->
|
||||
<jmx-management-enabled>false</jmx-management-enabled>
|
||||
</programlisting>
|
||||
<para>如果JMX功能是打开的,则使用<literal>jconsole</literal>可以管理本地的HornetQ。</para>
|
||||
<para>如果JMX功能是打开的,则使用<literal>jconsole</literal>可以管理本地的ActiveMQ。</para>
|
||||
<note>
|
||||
<para>出于安全考虑,默认情况下JMX远程连接是关闭的。参见<ulink url="http://java.sun.com/j2se/1.5.0/docs/guide/management/agent.html#remote"
|
||||
>Java管理指南</ulink>来配置服务器的远程管理(系统变量必须在<literal>run.sh</literal>或<literal>run.bat</literal>中定义)。</para>
|
||||
</note>
|
||||
<para>HornetQ默认使用JMX域名"org.apache.activemq"。如果要用一个MBeanServer管理多个HornetQ服务器,可以将每个HornetQ
|
||||
<para>ActiveMQ默认使用JMX域名"org.apache.activemq"。如果要用一个MBeanServer管理多个ActiveMQ服务器,可以将每个ActiveMQ
|
||||
服务器配置成不同的JMX域。方法就是在<literal>activemq-configuration.xml</literal>文件中设置<literal>jmx-domain</literal>:</para>
|
||||
<programlisting>
|
||||
<!-- use a specific JMX domain for HornetQ MBeans -->
|
||||
<!-- use a specific JMX domain for ActiveMQ MBeans -->
|
||||
<jmx-domain>my.org.apache.activemq</jmx-domain>
|
||||
</programlisting>
|
||||
<section>
|
||||
<title>MBeanServer的配置</title>
|
||||
<para>HornetQ在独立运行时使用Java虚拟机的<literal
|
||||
<para>ActiveMQ在独立运行时使用Java虚拟机的<literal
|
||||
>Platform MBeanServer</literal>来注册其MBean。这在JBoss Microcontainer(微容器)的bean
|
||||
文件中进行配置(参见<xref linkend="server.microcontainer.configuration"/>):</para>
|
||||
<programlisting><!-- MBeanServer -->
|
||||
|
@ -472,7 +472,7 @@
|
|||
</section>
|
||||
<section>
|
||||
<title>例子</title>
|
||||
<para>参见<xref linkend="examples.jmx"/>,这个例子展示了如何使用远程JMX连接或MBean代理来管理HornetQ。</para>
|
||||
<para>参见<xref linkend="examples.jmx"/>,这个例子展示了如何使用远程JMX连接或MBean代理来管理ActiveMQ。</para>
|
||||
</section>
|
||||
</section>
|
||||
<section>
|
||||
|
@ -490,7 +490,7 @@
|
|||
<para>管理操作的参数</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
<para>当一个管理消息发送到管理地址时,HornetQ服务器将从中提取出相应的信息,再调用相应的管理资源的方法,之后向
|
||||
<para>当一个管理消息发送到管理地址时,ActiveMQ服务器将从中提取出相应的信息,再调用相应的管理资源的方法,之后向
|
||||
该管理消息的回答地址(reply-to address,由<literal>ClientMessageImpl.REPLYTO_HEADER_NAME
|
||||
</literal>定义)发送一个<emphasis>管理回答</emphasis>。</para>
|
||||
<para>一个<literal>ClientConsumer</literal>用来接收管理回答并提取出其中的操作的結果(如果有的话)。
|
||||
|
@ -545,7 +545,7 @@
|
|||
<literal>manage</literal>来接收并处理管理消息。这个权限也在hornetq-configuration.xml文件中配置:</para>
|
||||
<programlisting>
|
||||
<!-- users with the admin role will be allowed to manage -->
|
||||
<!-- HornetQ using management messages -->
|
||||
<!-- ActiveMQ using management messages -->
|
||||
<security-setting match="jms.queue.hornetq.management">
|
||||
<permission type="manage" roles="admin" />
|
||||
</security-setting>
|
||||
|
@ -554,11 +554,11 @@
|
|||
</section>
|
||||
<section id="management.jms">
|
||||
<title>使用JMS进行管理</title>
|
||||
<para>使用JMS管理HornetQ与使用核心API管理HornetQ十分相似。</para>
|
||||
<para>使用JMS管理ActiveMQ与使用核心API管理ActiveMQ十分相似。</para>
|
||||
<para>其中一个重要的不同是JMS需要一个JMS队列来发送消息(而核心接口使用的是一个地址)。</para>
|
||||
<para><emphasis>管理队列</emphasis>是一个特殊的队列,它需要客户端直接实例化:</para>
|
||||
<programlisting>
|
||||
Queue managementQueue = HornetQJMSClient.createQueue("hornetq.management");
|
||||
Queue managementQueue = ActiveMQJMSClient.createQueue("hornetq.management");
|
||||
</programlisting>
|
||||
<para>其余步骤完全和使用核心接口一样,只是相应的对象不同:</para>
|
||||
<orderedlist>
|
||||
|
@ -580,7 +580,7 @@
|
|||
</orderedlist>
|
||||
<para>例如,要得到一个JMS队列<literal>exampleQueue</literal>中有多少消息:</para>
|
||||
<programlisting>
|
||||
Queue managementQueue = HornetQJMSClient.createQueue("hornetq.management");
|
||||
Queue managementQueue = ActiveMQJMSClient.createQueue("hornetq.management");
|
||||
|
||||
QueueSession session = ...
|
||||
QueueRequestor requestor = new QueueRequestor(session, managementQueue);
|
||||
|
@ -597,13 +597,13 @@
|
|||
</section>
|
||||
<section>
|
||||
<title>例子</title>
|
||||
<para>参见<xref linkend="examples.management"/>,它展示了如何使用JMS消息来管理HornetQ。</para>
|
||||
<para>参见<xref linkend="examples.management"/>,它展示了如何使用JMS消息来管理ActiveMQ。</para>
|
||||
</section>
|
||||
</section>
|
||||
|
||||
<section id="management.notifications">
|
||||
<title>管理通知</title>
|
||||
<para>HornetQ可以向listener发送各种事件的<emphasis>通知</emphasis>(如资源的创建,安全破坏等)。</para>
|
||||
<para>ActiveMQ可以向listener发送各种事件的<emphasis>通知</emphasis>(如资源的创建,安全破坏等)。</para>
|
||||
<para>有三种方式接收管理通知</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
|
@ -633,7 +633,7 @@
|
|||
</section>
|
||||
<section>
|
||||
<title>核心消息通知</title>
|
||||
<para>HornetQ定义了一个特殊的<emphasis>管理通知地址</emphasis>。核心队列绑定到该地址后,客户
|
||||
<para>ActiveMQ定义了一个特殊的<emphasis>管理通知地址</emphasis>。核心队列绑定到该地址后,客户
|
||||
端就可以接收以核心消息形式发送的管理信通知了。</para>
|
||||
<para>一个核心客户端要想接收到管理通知,它必须要创建一个队列并绑定到这个管理通知地址上,然后从这个
|
||||
队列接收通知。</para>
|
||||
|
@ -650,7 +650,7 @@
|
|||
</section>
|
||||
<section>
|
||||
<title>JMS消息通知</title>
|
||||
<para>HornetQ还可以通过JMS消息的方式发送通知。</para>
|
||||
<para>ActiveMQ还可以通过JMS消息的方式发送通知。</para>
|
||||
<para>这种方式与核心消息通知相似,但是有一个重要的不同:JMS消息需要一个JMS的目标(通常是一个Topic)。</para>
|
||||
<para>要通过一个JMS目标来接收管理通知,必须将服务器的管理通知地址修改为以<literal>jms.queue</literal>开头(如果是一个
|
||||
JMS队列)或者<literal>jms.topic</literal>(如果是一个话题):</para>
|
||||
|
@ -660,7 +660,7 @@
|
|||
</programlisting>
|
||||
<para>这个通知话题一旦被创建,就可以接收消息了(或者使用<literal>MessageListener</literal>):</para>
|
||||
<programlisting>
|
||||
Topic notificationsTopic = HornetQJMSClient.createTopic("notificationsTopic");
|
||||
Topic notificationsTopic = ActiveMQJMSClient.createTopic("notificationsTopic");
|
||||
|
||||
Session session = ...
|
||||
MessageConsumer notificationConsumer = session.createConsumer(notificationsTopic);
|
||||
|
@ -690,13 +690,13 @@
|
|||
<section>
|
||||
<title>例子</title>
|
||||
<para>参见<xref linkend="examples.management-notifications"/>。本例采用了JMS的<literal>
|
||||
MessageListener</literal>方法从HornetQ
|
||||
MessageListener</literal>方法从ActiveMQ
|
||||
服务器接收管理通知。</para>
|
||||
</section>
|
||||
</section>
|
||||
<section id="management.message-counters">
|
||||
<title>消息计数器</title>
|
||||
<para>HornetQ保存着队列的历史数据,而消息计数器可以从服务器上获取这些信息。</para>
|
||||
<para>ActiveMQ保存着队列的历史数据,而消息计数器可以从服务器上获取这些信息。</para>
|
||||
<para>这些信息可以显示队列的一些<emphasis>趋势</emphasis>。例如,使用管理接口你可以定期来查询一个队列
|
||||
的消息数量。但这个数量不足以说明这个队列是否在工作--也许这个队列既没有发送者也没有接收者;也许这个队列
|
||||
在不停地发送与接收,但是发送消息的速度与接收的速度相等。两咱情况下都会造成消息数在队列中不变,但实际队列
|
||||
|
@ -747,7 +747,7 @@
|
|||
</programlisting>
|
||||
<para>使用管理接口可以获得消息计数器。例如要使用JMX得到一个JMS队列的消息计数器:</para>
|
||||
<programlisting>
|
||||
// retrieve a connection to HornetQ's MBeanServer
|
||||
// retrieve a connection to ActiveMQ's MBeanServer
|
||||
MBeanServerConnection mbsc = ...
|
||||
JMSQueueControlMBean queueControl = (JMSQueueControl)MBeanServerInvocationHandler.newProxyInstance(mbsc,
|
||||
on,
|
||||
|
@ -768,10 +768,10 @@ System.out.format("%s message(s) in the queue (since last sample: %s)\n",
|
|||
</section>
|
||||
</section>
|
||||
<section>
|
||||
<title>通过JBoss应用服务器的Admin Console来管理HornetQ的资源</title>
|
||||
<para>通过JBoss应用服务器的Admin Console可以创建与配置HornetQ的各种资源。</para>
|
||||
<title>通过JBoss应用服务器的Admin Console来管理ActiveMQ的资源</title>
|
||||
<para>通过JBoss应用服务器的Admin Console可以创建与配置ActiveMQ的各种资源。</para>
|
||||
<para>Admin Console允许你创建各种目标(JMS话题与队列)和JMS的连接工厂。</para>
|
||||
<para>登录admin console后你在左边的树中会看到JMS Manager节点。所有HornetQ的资源都属于这个节点。在它的下面有JMS Queues、
|
||||
<para>登录admin console后你在左边的树中会看到JMS Manager节点。所有ActiveMQ的资源都属于这个节点。在它的下面有JMS Queues、
|
||||
Topics以及Connection Factories。分别点击它们将会看到相应的资源。下面将解释如何创建并配置它们。</para>
|
||||
<section>
|
||||
<title>JMS队列</title>
|
||||
|
|
|
@ -70,7 +70,7 @@
|
|||
]>
|
||||
<book lang="en">
|
||||
<bookinfo>
|
||||
<title>HornetQ 2.1用户手册</title>
|
||||
<title>ActiveMQ 2.1用户手册</title>
|
||||
<subtitle>Putting the buzz in messaging</subtitle>
|
||||
</bookinfo>
|
||||
|
||||
|
|
|
@ -19,13 +19,13 @@
|
|||
<chapter id="message-expiry">
|
||||
<title>过期的消息</title>
|
||||
<para>消息在发送时有一个可选的<emphasis>生存时间</emphasis>属性。</para>
|
||||
<para>如果一个消息已经超过了它的生存时间,HornetQ不再将它传递给任何接收者。
|
||||
<para>如果一个消息已经超过了它的生存时间,ActiveMQ不再将它传递给任何接收者。
|
||||
服务器会将过期的消息抛弃。</para>
|
||||
<para>HornetQ的地址可以配置一个过期地址,当消息过期时,它们被从队列中删除并被转移到过期地址中。
|
||||
<para>ActiveMQ的地址可以配置一个过期地址,当消息过期时,它们被从队列中删除并被转移到过期地址中。
|
||||
多个不同的队列可以绑定到一个过期地址上。这些过期的消息过后可以接收下来以供分析用。</para>
|
||||
<section>
|
||||
<title>过期消息的配置</title>
|
||||
<para>如果使用HornetQ核心API,可以直接在消息上设置过期时间:</para>
|
||||
<para>如果使用ActiveMQ核心API,可以直接在消息上设置过期时间:</para>
|
||||
<programlisting>
|
||||
// message will expire in 5000ms from now
|
||||
message.setExpiration(System.currentTimeMillis() + 5000);
|
||||
|
@ -61,7 +61,7 @@ producer.setTimeToLive(5000);
|
|||
</section>
|
||||
<section id="configuring.expiry.reaper">
|
||||
<title>配置过期回收线程</title>
|
||||
<para>HornetQ有一个回收线程定期地检查队列中的消息,目的是发现是否有消息过期。</para>
|
||||
<para>ActiveMQ有一个回收线程定期地检查队列中的消息,目的是发现是否有消息过期。</para>
|
||||
<para>在<literal>activemq-configuration.xml</literal>文件中可以对回收线程进行配置,参数如下:</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>在一个消息组中的消息有相同的组标识(id),即它们的<literal>JMSXGroupID</literal>(JMS)或
|
||||
<literal>_HQ_GROUP_ID</literal>(HornetQ核心)的值相同。</para>
|
||||
<literal>_HQ_GROUP_ID</literal>(ActiveMQ核心)的值相同。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>不管存在多少个接收者(consumer),一个消息组的所有消息总是被同一个接收者所接收。一个组id总是
|
||||
|
@ -53,7 +53,7 @@
|
|||
message.setStringProperty("JMSXGroupID", "Group-0");
|
||||
producer.send(message);
|
||||
</programlisting>
|
||||
<para>另一个方法是将<literal>HornetQConnectonFactory</literal>的<literal>autogroup</literal>
|
||||
<para>另一个方法是将<literal>ActiveMQConnectonFactory</literal>的<literal>autogroup</literal>
|
||||
属性设为true,或者在<literal>hornetq-jms.xml</literal>文件中进行配置:</para>
|
||||
<programlisting><connection-factory name="ConnectionFactory">
|
||||
<connectors>
|
||||
|
@ -143,7 +143,7 @@
|
|||
</section>
|
||||
<section>
|
||||
<title>集群消息组例子</title>
|
||||
<para>参见<xref linkend="examples.clustered.grouping"/>,这个例子给出了如何在HornetQ集群中配置消息组。</para>
|
||||
<para>参见<xref linkend="examples.clustered.grouping"/>,这个例子给出了如何在ActiveMQ集群中配置消息组。</para>
|
||||
</section>
|
||||
</section>
|
||||
</chapter>
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
<!-- ============================================================================= -->
|
||||
<chapter id="messaging-concepts">
|
||||
<title>消息的相关概念</title>
|
||||
<para>HornetQ是一个异步的 <ulink
|
||||
<para>ActiveMQ是一个异步的 <ulink
|
||||
url="http://en.wikipedia.org/wiki/Message_oriented_middleware">
|
||||
面向消息的中间件</ulink>。在本文档中我们简称为消息系统。</para>
|
||||
<para>首先我们简要介绍消息系统是做什么的,在哪些领域得到应用,以及与消息相关的一些概念。</para>
|
||||
|
@ -81,7 +81,7 @@
|
|||
</section>
|
||||
<section>
|
||||
<title>交易(Transactions)</title>
|
||||
<para>消息系统通常支持在一次本地交易中发送并通知多个消息。HornetQ还支持分布式交易。它可以通过Java的XA和JTA接口,
|
||||
<para>消息系统通常支持在一次本地交易中发送并通知多个消息。ActiveMQ还支持分布式交易。它可以通过Java的XA和JTA接口,
|
||||
将消息的发送与通知做为一个分布式交易的一部分来完成。</para>
|
||||
</section>
|
||||
<section>
|
||||
|
@ -102,13 +102,13 @@
|
|||
</para>
|
||||
<para>JMS是一个广泛使用的API,绝大多数的消息系统都支持它。JMS只有Java的客户端才可以使用。</para>
|
||||
<para>JMS并没有定义传输的格式(wire format)。因此不同的JMS消息服务器的和客户端相互之间通常不能交互,这是因为每个消息系统都自己的传输格式。</para>
|
||||
<para>HornetQ全面支持JMS 1.1 API。</para>
|
||||
<para>ActiveMQ全面支持JMS 1.1 API。</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>专有的API</title>
|
||||
<para>很多系统提供自己的一套API来与其消息系统进行通迅,其优势是它可以允许客户端使用其全部的功能。
|
||||
像JMS那样的标准API往往不能提供许多消息系统所支持的额外的功能。</para>
|
||||
<para>HornetQ提供了一套自有的核心API,客户端程序可以通过它充分利用HornetQ的强大功能。
|
||||
<para>ActiveMQ提供了一套自有的核心API,客户端程序可以通过它充分利用ActiveMQ的强大功能。
|
||||
这对于一些JMS API满足不了的需求是非常有用的。</para>
|
||||
</section>
|
||||
<section>
|
||||
|
@ -118,7 +118,7 @@
|
|||
<para>由于云计算技术的API标准目前倾向于采用REST的方式,所以采用REST方式的消息系统很有望成为云计算中消息传送的标准。</para>
|
||||
<para>REST方式中的各种消息资源以URI的方式来定义。用户通过一套很简单的操作与这些资源相交互,如PUT、POST、GET等。HTTP通常用来作为REST方式的通信协议。</para>
|
||||
<para>采用HTTP的好处是它很简单实用,并且internet经过多年的发展已经能很好的支持HTTP协议。</para>
|
||||
<para>HornetQ将会很快地支持REST方式的API。</para>
|
||||
<para>ActiveMQ将会很快地支持REST方式的API。</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>STOMP</title>
|
||||
|
@ -126,28 +126,28 @@
|
|||
url="http://stomp.codehaus.org/"
|
||||
>Stomp</ulink> 是为消息系统定义的一套简单的文本传输协议。它定义了一种线上传输的格式,
|
||||
因此采用Stomp编写的客户端可以与所有支持Stomp的消息系统交互。Stomp的客户端可以用多种编程语言来实现。</para>
|
||||
<para>有关在HornetQ中如何使用Stomp的详细内容请参见<xref linkend="stomp"/>。</para>
|
||||
<para>有关在ActiveMQ中如何使用Stomp的详细内容请参见<xref linkend="stomp"/>。</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>AMQP</title>
|
||||
<para><ulink url="http://en.wikipedia.org/wiki/AMQP">AMQP</ulink> 是一套可支持互操作的消息规范。
|
||||
它定义了自己的传输格式,因些任何AMQP的客户端都可以和支持AMQP的系统进行交互。AMQP的客户端可以用多种编程语言来实现。</para>
|
||||
<para>HornetQ将会很快地支持AMQP。</para>
|
||||
<para>ActiveMQ将会很快地支持AMQP。</para>
|
||||
</section>
|
||||
</section>
|
||||
<section>
|
||||
<title>高可获得性(Availability)</title>
|
||||
<para>高可获得性是指在系统中有一个或多个服务器发生故障时仍然能够维持运转的特性。不同的消息系统对高可获得性的支持程度是不同的。</para>
|
||||
<para>HornetQ支持自动失效备援(failover),也就是当主服务器出现故障时,当前的会话会自动连接到备用的服务器上。</para>
|
||||
<para><xref linkend="ha"/>给出了HornetQ的HA特性的详细信息。</para>
|
||||
<para>ActiveMQ支持自动失效备援(failover),也就是当主服务器出现故障时,当前的会话会自动连接到备用的服务器上。</para>
|
||||
<para><xref linkend="ha"/>给出了ActiveMQ的HA特性的详细信息。</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>集群</title>
|
||||
<para>许多消息系统支持由多个消息服务器组成的集群。集群可以使发送和接收的负荷分散到不同的服务器中。
|
||||
通过增加集群服务器,可以有效的增加整个集群处理消息的能力。</para>
|
||||
<para>然而不同的消息系统有着不同的集群架构。有的集群架构十分简单,有的集群中成员间的联系很少。</para>
|
||||
<para>HornetQ提供了非常先进的可配置的集群模型。根据每个节点接收者(consumer)的多少以及是否具有接收状态,消息在集群中可以进行智能化负载均衡。</para>
|
||||
<para>HornetQ还能够在集群中的节点间进行消息的再分发,以避免在某个节点出现消息匮乏(starvation)现象。</para>
|
||||
<para>ActiveMQ提供了非常先进的可配置的集群模型。根据每个节点接收者(consumer)的多少以及是否具有接收状态,消息在集群中可以进行智能化负载均衡。</para>
|
||||
<para>ActiveMQ还能够在集群中的节点间进行消息的再分发,以避免在某个节点出现消息匮乏(starvation)现象。</para>
|
||||
<para>有关集群的详细内容参见<xref linkend="clusters"/>。</para>
|
||||
</section>
|
||||
<section>
|
||||
|
@ -155,8 +155,8 @@
|
|||
<para>有些消息系统可以将一些分散在不可靠的网络(如广域网或internet)上孤立的集群或节点桥接在一起。</para>
|
||||
<para>通常一个桥的作用是从一台服务器的队列上接收消息然后将消息再转发到另一台服务器的队列中。桥连接可以解决不可靠网络连接的问题。
|
||||
桥有自动重新连接的功能。一旦网络连接中断,桥可以自动进行重试直到重新连接上为止。</para>
|
||||
<para>HornetQ的桥接功能可以配置过滤表达式,以实现有条件的转发。另外,它还可以实现消息转换的功能(transformation)。</para>
|
||||
<para>HornetQ还允许配置消息在队列之间进行路由。利用它可以完成复杂的路由网络以便在不同队列间进行消息转发与复制,形成一个互连的消息代理(broker)网络。</para>
|
||||
<para>ActiveMQ的桥接功能可以配置过滤表达式,以实现有条件的转发。另外,它还可以实现消息转换的功能(transformation)。</para>
|
||||
<para>ActiveMQ还允许配置消息在队列之间进行路由。利用它可以完成复杂的路由网络以便在不同队列间进行消息转发与复制,形成一个互连的消息代理(broker)网络。</para>
|
||||
<para>有关的详细内容将在<xref linkend="core-bridges"/>和<xref
|
||||
linkend="diverts"/>给出。</para>
|
||||
</section>
|
||||
|
|
|
@ -18,12 +18,12 @@
|
|||
<!-- ============================================================================= -->
|
||||
<chapter id="paging">
|
||||
<title>分页转存</title>
|
||||
<para>HornetQ可以在有限的内存下支持包含百万消息的超大规模的队列。</para>
|
||||
<para>当有限的内存无法装得下如此多的消息时,HornetQ将它们<emphasis>分页转存</emphasis>到磁盘中,在内存
|
||||
<para>ActiveMQ可以在有限的内存下支持包含百万消息的超大规模的队列。</para>
|
||||
<para>当有限的内存无法装得下如此多的消息时,ActiveMQ将它们<emphasis>分页转存</emphasis>到磁盘中,在内存
|
||||
有空闲时再将消息分页装载到内存。通过这样的处理,不需要服务器有很大的内存就可以支持大容量的队列。</para>
|
||||
<para>通过配置可以给一个地址设置一个最大消息值。当这个地址消息数在内存中超过了这个值时,HornetQ开始将多余的消息
|
||||
<para>通过配置可以给一个地址设置一个最大消息值。当这个地址消息数在内存中超过了这个值时,ActiveMQ开始将多余的消息
|
||||
转存到磁盘中。</para>
|
||||
<para>默认情况下HornetQ不转存任何消息。这一功能必须显式地通过配置来激活。</para>
|
||||
<para>默认情况下ActiveMQ不转存任何消息。这一功能必须显式地通过配置来激活。</para>
|
||||
<section>
|
||||
<title>分页文件</title>
|
||||
<para>消息按照所属的地址分别保存在不同的文件中。每一个地址有一个单独的文件夹,每个文件夹内消息被保存在
|
||||
|
@ -62,7 +62,7 @@
|
|||
<tbody>
|
||||
<row>
|
||||
<entry><literal>paging-directory</literal></entry>
|
||||
<entry>分页转存文件的位置。HornetQ在这个位置下为每个地址建立一个文件夹。</entry>
|
||||
<entry>分页转存文件的位置。ActiveMQ在这个位置下为每个地址建立一个文件夹。</entry>
|
||||
<entry>data/paging</entry>
|
||||
</row>
|
||||
</tbody>
|
||||
|
@ -167,7 +167,7 @@
|
|||
<title>分页转存与消息的选择器(selector)</title>
|
||||
<note><para>请注意消息选择器只对内存的消息进行操作。如果大量的消息被转存在磁盘中,而其中有些消息与选择器是相匹配的,
|
||||
那么只有内存的消息被传递,这些消息被重新装载入内存后才有可能被传递出去。
|
||||
HornetQ不会扫描在磁盘中的消息来找出与选择器匹配的消息。这样做的话需要实现并管理一种索引机制才能使扫描有效地进行,另外
|
||||
ActiveMQ不会扫描在磁盘中的消息来找出与选择器匹配的消息。这样做的话需要实现并管理一种索引机制才能使扫描有效地进行,另外
|
||||
需要其它额外的工作。所有这些如果去完成的话,相当于实现一个关系型数据库!这并不是消息系统的主要任务。如果你要完成的任务是
|
||||
从海量的消息中选择少数消息,那么你很可能需要使用的是一个关系型数据库,不是消息系统。因为这相当于表的查询。</para></note>
|
||||
</section>
|
||||
|
@ -193,6 +193,6 @@
|
|||
|
||||
<section>
|
||||
<title>例子</title>
|
||||
<para><xref linkend="examples.paging"/>是一个说明如何使用HornetQ的分页转发功能的例子。</para>
|
||||
<para><xref linkend="examples.paging"/>是一个说明如何使用ActiveMQ的分页转发功能的例子。</para>
|
||||
</section>
|
||||
</chapter>
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
<!-- ============================================================================= -->
|
||||
<chapter id="perf-tuning">
|
||||
<title>性能调优</title>
|
||||
<para>本章讲述如何优化HornetQ的性能</para>
|
||||
<para>本章讲述如何优化ActiveMQ的性能</para>
|
||||
<section>
|
||||
<title>持久层的优化</title>
|
||||
<itemizedlist>
|
||||
|
@ -31,7 +31,7 @@
|
|||
<listitem>
|
||||
<para>尽量减少日志文件的数量。<literal>journal-min-files</literal>参数的设置应以满足平均
|
||||
运行需要为准。如果你发现系统中经常有新的日志文件被创建,这说明持久的数据量很大,你需要适当增加
|
||||
这个参数的值,以使HornetQ更多时候是在重用文件,而不是创建新文件。</para>
|
||||
这个参数的值,以使ActiveMQ更多时候是在重用文件,而不是创建新文件。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>日志文件的大小。日志文件的大小最好要与磁盘的一个柱面的容量对齐。默认值是10MiB,它在绝大多数
|
||||
|
@ -81,14 +81,14 @@
|
|||
持久消息都会被写到磁盘中,这给系统带来了明显的负担。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>将多个发送或通知放到一个事务中完成。这样HornetQ只需要一次网络的往返来发生事务的提交,而不是每次发送
|
||||
<para>将多个发送或通知放到一个事务中完成。这样ActiveMQ只需要一次网络的往返来发生事务的提交,而不是每次发送
|
||||
或通知就需要一次网络的往返通迅。</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
</section>
|
||||
<section>
|
||||
<title>其它优化</title>
|
||||
<para>在HornetQ中还有其它一些地方可以优化:</para>
|
||||
<para>在ActiveMQ中还有其它一些地方可以优化:</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>使用异步发送通知。如果你在非事务条件下发送持久的消息,并且要保证在send()返回时持久消息已经到达服
|
||||
|
@ -130,7 +130,7 @@
|
|||
<para>如果你的接收者速度很快,你可以增加consumer-window-size。这样实际上就关闭了流控制的功能。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>套接字NIO与旧的IO对比。默认情况下HornetQ在服务器端使用套接字NIO技术,而在客户端则使用旧的(阻塞)
|
||||
<para>套接字NIO与旧的IO对比。默认情况下ActiveMQ在服务器端使用套接字NIO技术,而在客户端则使用旧的(阻塞)
|
||||
IO(参见传输配置一章<xref linkend="configuring-transports"/>)。NIO比旧的阻塞式IO有更
|
||||
强的可扩展性,但是也会带来一些延时。如果你的服务器要同时有数千个连接,使用NIO效果比较好。但是如果
|
||||
连接数并没有这么多,你可以配置接收器使用旧的IO还提高性能。</para>
|
||||
|
@ -169,7 +169,7 @@ serveruser hard nofile 20000
|
|||
</listitem>
|
||||
<listitem>
|
||||
<para>利用参数<literal>batch-delay</literal>并将参数<literal>direct-deliver</literal>
|
||||
设为false来提高小消息的处理效率。HornetQ在其<literal>activemq-configuration.xml</literal>
|
||||
设为false来提高小消息的处理效率。ActiveMQ在其<literal>activemq-configuration.xml</literal>
|
||||
中预先配置了一个连接器/接受器对(<literal>netty-throughput</literal>),并且在
|
||||
<literal>hornetq-jms.xml</literal>中配置了一个JMS连接工厂(
|
||||
<literal>ThroughputConnectionFactory</literal>)。它们可以用在小消息的处理应用中以提
|
||||
|
@ -188,7 +188,7 @@ serveruser hard nofile 20000
|
|||
JVM选项<literal>-XX:+UseParallelOldGC</literal>.</para>
|
||||
</listitem>
|
||||
<listitem id="perf-tuning.memory">
|
||||
<para>内存设置。尽量为服务器分配更多的内存。HornetQ利用其分页转存技术可以在很少的内存下运行(在
|
||||
<para>内存设置。尽量为服务器分配更多的内存。ActiveMQ利用其分页转存技术可以在很少的内存下运行(在
|
||||
<xref linkend="paging"/>中有说明)。但是如果所有队列都在内存运行,性能将会很好。具体需要
|
||||
多少内存要由你的队列的大小和数量以及消息的大小和数量决定。使用JVM参数<literal>-Xms</literal>
|
||||
和<literal>-Xmx</literal>来为你的服务器分配内存。我们建议两个参数的设为相同的值。</para>
|
||||
|
@ -211,7 +211,7 @@ serveruser hard nofile 20000
|
|||
/会话/发送者或接收者。这样非常浪费资源。这些对象的创建要占用时间和网络带宽。它们应该进行重用。</para>
|
||||
<note>
|
||||
<para>有些常用的框架如Spring JMS Template在使用JMS时违背了设计模式。如果你在使用了它后性能
|
||||
受到了影响。这不是HornetQ的原因!Spring的JMS模板只有与能缓存JMS会话的应用服务器一起使用
|
||||
受到了影响。这不是ActiveMQ的原因!Spring的JMS模板只有与能缓存JMS会话的应用服务器一起使用
|
||||
才是安全的,并且只能是用于发送消息。使用它在应用服务器中同步接收消息是不安全的。</para>
|
||||
</note>
|
||||
</listitem>
|
||||
|
|
|
@ -18,23 +18,23 @@
|
|||
<!-- ============================================================================= -->
|
||||
<chapter id="persistence">
|
||||
<title>持久化</title>
|
||||
<para>本章我们将描述HornetQ的持久化技术,包括持久化的工作原理和配置方法。</para>
|
||||
<para>HornetQ拥有一个高性能的日志(journal)模块来处理持久化。因此它并不依赖一个外部的数据库或第三方持久化产品。这个
|
||||
<para>本章我们将描述ActiveMQ的持久化技术,包括持久化的工作原理和配置方法。</para>
|
||||
<para>ActiveMQ拥有一个高性能的日志(journal)模块来处理持久化。因此它并不依赖一个外部的数据库或第三方持久化产品。这个
|
||||
日志模块针对消息的处理进行了高度的优化。</para>
|
||||
<para>所谓HornetQ日志是一个<emphasis>只添加</emphasis>系统。它由一组磁盘文件构成。每个文件都是预先创建好的并且
|
||||
大小是固定的。文件在创建时都进行了格式化。随着HornetQ不断地处理消息,如消息的增加、更新、删除等,一个个记录被添加
|
||||
<para>所谓ActiveMQ日志是一个<emphasis>只添加</emphasis>系统。它由一组磁盘文件构成。每个文件都是预先创建好的并且
|
||||
大小是固定的。文件在创建时都进行了格式化。随着ActiveMQ不断地处理消息,如消息的增加、更新、删除等,一个个记录被添加
|
||||
到日志中。当一个日志文件写满时,新记录就会写到下一个文件。</para>
|
||||
<para>由于对日志的写入只是对文件的添加,这样有效减少了随机寻道的操作。而随机寻道的操作是磁盘操作中最耗时的操作。
|
||||
所以这种设计可以使磁头的运动降到最低,效率最高。</para>
|
||||
<para>而文件的大小是可以配置的。这使我们可以将文件大小配置为刚好占满一个磁盘柱面。不过现代的磁盘技术是复杂多样的,
|
||||
我们并不能控制文件与磁盘柱面的对应关系。尽管如此,我们通过最大限度地降低文件对磁盘柱面的占用,来降低磁头的运动。
|
||||
这是因为在同一个柱面的存取只需要盘面的转动而不需要磁头的运动。</para>
|
||||
<para>当被删除的记录越来越多时,有的文件最終会变成一个没有有效记录的文件。这样的文件就可以回收再利用。HornetQ有
|
||||
<para>当被删除的记录越来越多时,有的文件最終会变成一个没有有效记录的文件。这样的文件就可以回收再利用。ActiveMQ有
|
||||
一套复杂的文件回收算法来判断一个日志文件是否可以被回收。</para>
|
||||
<para>HornetQ还有一套文件整理的算法,它用来将日志文件中不用的空隙移除以达到更高的存贮效率。</para>
|
||||
<para>ActiveMQ还有一套文件整理的算法,它用来将日志文件中不用的空隙移除以达到更高的存贮效率。</para>
|
||||
<para>这个日志系统全面支持事务功能。根据需要它可以支持本地事务或XA型事务。</para>
|
||||
<para>日志系统的大部分是用Java实现的,但是HornetQ在其中实现了一层抽象的文件系统,这样就使得其它的语言实现能
|
||||
方便地“插入”到日志模块中。实际上HornetQ自带有两种实现:</para>
|
||||
<para>日志系统的大部分是用Java实现的,但是ActiveMQ在其中实现了一层抽象的文件系统,这样就使得其它的语言实现能
|
||||
方便地“插入”到日志模块中。实际上ActiveMQ自带有两种实现:</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>Java <ulink url="http://en.wikipedia.org/wiki/New_I/O">NIO</ulink>。</para>
|
||||
|
@ -44,7 +44,7 @@
|
|||
<listitem id="aio-journal">
|
||||
<para>Linux 异步IO (Asynchronous IO)</para>
|
||||
<para>第二种是采用的Linux系统中的异步IO技术(AIO)。它包括了少量的平台相关的代码(native code)来
|
||||
调用AIO的接口。当数据被保存到磁盘上后,AIO会回调HornetQ进行通知。这样,HornetQ就避免了磁盘写
|
||||
调用AIO的接口。当数据被保存到磁盘上后,AIO会回调ActiveMQ进行通知。这样,ActiveMQ就避免了磁盘写
|
||||
的同步操作。</para>
|
||||
<para>使用AIO通常可以有比NIO更高的性能。</para>
|
||||
<para>采用AIO的日志只能在运行 Linux kernel 2.6 或以上版本的内核的系统中才有。另外你需要安装libaio。
|
||||
|
@ -55,11 +55,11 @@
|
|||
<para>libaio是Linux内核项目的一部分。</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
<para>标准的HornetQ核心服务器使用了两种日志:</para>
|
||||
<para>标准的ActiveMQ核心服务器使用了两种日志:</para>
|
||||
<itemizedlist id="persistence.journallist">
|
||||
<listitem>
|
||||
<para>绑定日志</para>
|
||||
<para>这个日志用来保存与绑定有关的数据。其中包括在HornetQ上部署的队列及其属性,还有ID序列计数器。 </para>
|
||||
<para>这个日志用来保存与绑定有关的数据。其中包括在ActiveMQ上部署的队列及其属性,还有ID序列计数器。 </para>
|
||||
<para>绑定日志是一个NIO型日志。与消息日志相比它的呑吐量是比较低的。</para>
|
||||
<para>这种日志文件的名字采用<literal>hornetq-bindings</literal>作为前缀。每个文件都有
|
||||
<literal>bindings</literal>这样的扩展。文件大小是<literal
|
||||
|
@ -77,7 +77,7 @@
|
|||
<listitem>
|
||||
<para>消息日志</para>
|
||||
<para>这个日志用来存贮所有消息相关的数据,包括消息本身和重复ID缓存。</para>
|
||||
<para>默认情况下HornetQ总是优先使用AIO型日志。如果AIO型日志不可用(比如在非Linux平台上运行,或系统内核版本不同)
|
||||
<para>默认情况下ActiveMQ总是优先使用AIO型日志。如果AIO型日志不可用(比如在非Linux平台上运行,或系统内核版本不同)
|
||||
它将自动使用NIO型日志。</para>
|
||||
<para>这种日志文件的名字采用<literal>hornetq-data</literal>。作为前缀。每个文件都有
|
||||
<literal>hq</literal>作为扩展名。默认的文件大小是 <literal
|
||||
|
@ -85,8 +85,8 @@
|
|||
</listitem>
|
||||
</itemizedlist>
|
||||
<para>对于超大消息,Hornet将它们保存在消息日志之外的地方。详见<xref linkend="large-messages"/>.</para>
|
||||
<para>HornetQ还可以在内存不够用时将消息暂存到磁盘上。相关的配置和说明参见<xref linkend="paging"/>。</para>
|
||||
<para>如果不需要持久功能,HornetQ还可以配置成非持久的消息系统。参见<xref linkend="persistence.enabled"/>。</para>
|
||||
<para>ActiveMQ还可以在内存不够用时将消息暂存到磁盘上。相关的配置和说明参见<xref linkend="paging"/>。</para>
|
||||
<para>如果不需要持久功能,ActiveMQ还可以配置成非持久的消息系统。参见<xref linkend="persistence.enabled"/>。</para>
|
||||
<section id="configuring.bindings.journal">
|
||||
<title>配置绑定日志</title>
|
||||
<para>绑定日志的配置参数在 <literal
|
||||
|
@ -130,16 +130,16 @@
|
|||
<para>有效值是<literal>NIO</literal> 或者 <literal>ASYNCIO</literal>。</para>
|
||||
<para>Choosing <literal>NIO</literal> chooses the Java NIO journal. Choosing
|
||||
<literal>AIO</literal> 选择作用异步IO型日志。如果你的平台不是Linux或者你没有安装
|
||||
libaio,HornetQ会自动检测到并使用<literal>NIO</literal>。</para>
|
||||
libaio,ActiveMQ会自动检测到并使用<literal>NIO</literal>。</para>
|
||||
</listitem>
|
||||
<listitem id="configuring.message.journal.journal-sync-transactional">
|
||||
<para><literal>journal-sync-transactional</literal></para>
|
||||
<para>如果设为true,HornetQ会保证在事务的边界操作时(commit, prepare和rollback)将事务数据
|
||||
<para>如果设为true,ActiveMQ会保证在事务的边界操作时(commit, prepare和rollback)将事务数据
|
||||
写到磁盘上。默认的值是 <literal>true</literal>。</para>
|
||||
</listitem>
|
||||
<listitem id="configuring.message.journal.journal-sync-non-transactional">
|
||||
<para><literal>journal-sync-non-transactional</literal></para>
|
||||
<para>如果设为true HornetQ将保证每次都将非事务性消息数据(发送和通知)保存到磁盘上。默认值是 <literal>true</literal>。</para>
|
||||
<para>如果设为true ActiveMQ将保证每次都将非事务性消息数据(发送和通知)保存到磁盘上。默认值是 <literal>true</literal>。</para>
|
||||
</listitem>
|
||||
<listitem id="configuring.message.journal.journal-file-size">
|
||||
<para><literal>journal-file-size</literal></para>
|
||||
|
@ -148,9 +148,9 @@
|
|||
</listitem>
|
||||
<listitem id="configuring.message.journal.journal-min-files">
|
||||
<para><literal>journal-min-files</literal></para>
|
||||
<para>最少日志文件数。当HornetQ启动时会创建这一数量的文件。</para>
|
||||
<para>最少日志文件数。当ActiveMQ启动时会创建这一数量的文件。</para>
|
||||
<para>创建并初始化日志文件是一项费时的操作,通常不希望这些操作在服务运行时执行。预先创建并初始化这些
|
||||
日志文件将会使HornetQ在工作时避免浪费不必要的时间。</para>
|
||||
日志文件将会使ActiveMQ在工作时避免浪费不必要的时间。</para>
|
||||
<para>根据你的应用中队列中消息量的实际要求可以适当调节这一参数。</para>
|
||||
</listitem>
|
||||
<listitem id="configuring.message.journal.journal-max-io">
|
||||
|
@ -212,7 +212,7 @@
|
|||
</section>
|
||||
<section id="installing-aio">
|
||||
<title>安装AIO</title>
|
||||
<para>Java NIO日志的性能是很好的。但是如果你是在Linux 内核2.6版本以上的系统中运行HornetQ,我们强烈建议
|
||||
<para>Java NIO日志的性能是很好的。但是如果你是在Linux 内核2.6版本以上的系统中运行ActiveMQ,我们强烈建议
|
||||
你使用 <literal>AIO</literal>日志,以获得更佳的性能。</para>
|
||||
<para>在早期的Linux版本中或其它操作系统中不可以使用 AIO日志。</para>
|
||||
<para>如果你的Linux内核是2.6版本或以上但没有安装 <literal
|
||||
|
@ -223,8 +223,8 @@
|
|||
<programlisting>apt-get install libaio</programlisting></para>
|
||||
</section>
|
||||
<section id="persistence.enabled">
|
||||
<title>配置HornetQ不使用持久化</title>
|
||||
<para>在一些情况下消息系统并不需要持久化。这时可以配置HornetQ不使用持久层。只要将<literal
|
||||
<title>配置ActiveMQ不使用持久化</title>
|
||||
<para>在一些情况下消息系统并不需要持久化。这时可以配置ActiveMQ不使用持久层。只要将<literal
|
||||
>activemq-configuration.xml</literal>文件中的<literal>persistence-enabled</literal>
|
||||
参数设为<literal>false</literal>即可。 </para>
|
||||
<para>注意如果你将该参数设为 false来关闭持久化,就意味着所有的绑定数据、消息数据、超大消息数据、重复ID缓冲以及转移(paging)数据都将不会被持久。</para>
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
</itemizedlist>
|
||||
<para>还有一种情况JMS不支持:应用程序在出现故障时可以容忍消息丢失,这样可以在消息在传递给客户
|
||||
端<emphasis>之前</emphasis>就通知服务器。</para>
|
||||
<para>HornetQ支持这种模式,称为<emphasis>pre-acknowledge</emphasis>。</para>
|
||||
<para>ActiveMQ支持这种模式,称为<emphasis>pre-acknowledge</emphasis>。</para>
|
||||
<para>这种模式的缺点是消息在通知后,如果系统出现故障时,消息可能丢失。并且在系统重启后该消息
|
||||
不能恢复。</para>
|
||||
<para>使用<literal>pre-acknowledgement</literal>模式可以节省网络传输和CPU处理资源。</para>
|
||||
|
@ -56,12 +56,12 @@
|
|||
<pre-acknowledge>true</pre-acknowledge>
|
||||
</connection-factory></programlisting>
|
||||
<para>另一个选择是使用JMS接口来设置pre-acknowledgement模式。只需要在创建JMS会话(session)
|
||||
时使用<literal>HornetQSession.PRE_ACKNOWLEDGE</literal>常数即可。</para>
|
||||
时使用<literal>ActiveMQSession.PRE_ACKNOWLEDGE</literal>常数即可。</para>
|
||||
<programlisting>
|
||||
// messages will be acknowledge on the server *before* being delivered to the client
|
||||
Session session = connection.createSession(false, HornetQSession.PRE_ACKNOWLEDGE);
|
||||
Session session = connection.createSession(false, ActiveMQSession.PRE_ACKNOWLEDGE);
|
||||
</programlisting>
|
||||
<para>你还可以直接在<literal>HornetQConnectionFactory</literal>实例上设置该模式。</para>
|
||||
<para>你还可以直接在<literal>ActiveMQConnectionFactory</literal>实例上设置该模式。</para>
|
||||
<para>另外,如果使用核心接口,则在<literal>ClientSessionFactory</literal>实例上直接
|
||||
设置该模式。</para>
|
||||
</section>
|
||||
|
|
|
@ -18,26 +18,26 @@
|
|||
<!-- ============================================================================= -->
|
||||
<chapter id="preface">
|
||||
<title>前言</title>
|
||||
<para>什么是HornetQ?</para>
|
||||
<para>什么是ActiveMQ?</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>HornetQ 是一个开源的软件项目。它的目标是一个多协议、可嵌入、高性能、可集群的异步消息系统。</para>
|
||||
<para>ActiveMQ 是一个开源的软件项目。它的目标是一个多协议、可嵌入、高性能、可集群的异步消息系统。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>HornetQ 是一个消息中间件(MoM)。有关MoM和其它消息相关的概念解释请参见 <xref linkend="messaging-concepts"
|
||||
<para>ActiveMQ 是一个消息中间件(MoM)。有关MoM和其它消息相关的概念解释请参见 <xref linkend="messaging-concepts"
|
||||
/>。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>要了解有关HornetQ的更多信息请访问 <ulink url="http://www.jboss.org/community/wiki/HornetQGeneralFAQs"></ulink>。</para>
|
||||
<para>要了解有关ActiveMQ的更多信息请访问 <ulink url="http://www.jboss.org/community/wiki/ActiveMQGeneralFAQs"></ulink>。</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
<para>为什么要使用HornetQ? 以下给出了几个理由:</para>
|
||||
<para>为什么要使用ActiveMQ? 以下给出了几个理由:</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>HornetQ是100%的开源软件。 HornetQ 采用 Apache v 2.0开源协议,对用户的限制最小。</para>
|
||||
<para>ActiveMQ是100%的开源软件。 ActiveMQ 采用 Apache v 2.0开源协议,对用户的限制最小。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>HornetQ的设计强调可用性。</para>
|
||||
<para>ActiveMQ的设计强调可用性。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>采用Java语言编写。可以在任何Java 6+ 的平台上运行。这几乎包括了从Windows到IBM mainframes的每个平台。</para>
|
||||
|
@ -49,11 +49,11 @@
|
|||
<para>功能全面。不仅拥有其它成熟消息产品所具有的全部功能,而且还有很多独特的功能。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>HornetQ的设计遵从了简约的原则。对第三方软件的依赖极少。根据不同的需要,
|
||||
HornetQ可以单独运行,也可以运行于JEE应用服务器中。它还可以嵌入到你自己的应用程序中。</para>
|
||||
<para>ActiveMQ的设计遵从了简约的原则。对第三方软件的依赖极少。根据不同的需要,
|
||||
ActiveMQ可以单独运行,也可以运行于JEE应用服务器中。它还可以嵌入到你自己的应用程序中。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>完美的可获得性。HornetQ提供自动客户端失效备援(automatic client failover)功能,能保证在服务器故障时没有消息丢失或消息重复。</para>
|
||||
<para>完美的可获得性。ActiveMQ提供自动客户端失效备援(automatic client failover)功能,能保证在服务器故障时没有消息丢失或消息重复。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>超级灵活的集群方案。可以控制集群进行消息负载均衡的方式。分布在不同地理位置的各个集群间可以通过非可靠的网络连接形成一个全球网络。
|
||||
|
@ -61,8 +61,8 @@
|
|||
</listitem>
|
||||
<listitem>
|
||||
<para>请访问 <ulink
|
||||
url="http://www.jboss.org/community/wiki/HornetQFeatures">wiki
|
||||
</ulink>来全面了解HornetQ的所有功能介绍。</para>
|
||||
url="http://www.jboss.org/community/wiki/ActiveMQFeatures">wiki
|
||||
</ulink>来全面了解ActiveMQ的所有功能介绍。</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
</chapter>
|
||||
|
|
|
@ -18,11 +18,11 @@
|
|||
<!-- ============================================================================= -->
|
||||
<chapter id="project-info">
|
||||
<title>项目信息</title>
|
||||
<para>HornetQ的官方网址是 <ulink url="http://hornetq.org/"
|
||||
<para>ActiveMQ的官方网址是 <ulink url="http://hornetq.org/"
|
||||
>http://hornetq.org/</ulink>.</para>
|
||||
<section id="download.software">
|
||||
<title>软件下载</title>
|
||||
<para>HornetQ的下载地址为:<ulink
|
||||
<para>ActiveMQ的下载地址为:<ulink
|
||||
url="http://hornetq.org/downloads.html">http://hornetq.org/downloads.html</ulink></para>
|
||||
</section>
|
||||
<section id="download.git">
|
||||
|
@ -30,11 +30,11 @@
|
|||
<para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>HornetQ的 <ulink
|
||||
url="http://www.jboss.org/community/wiki/HornetQ">wiki</ulink></para>
|
||||
<para>ActiveMQ的 <ulink
|
||||
url="http://www.jboss.org/community/wiki/ActiveMQ">wiki</ulink></para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>如果在使用HornetQ中发生任何问题,可以去我们的 <ulink
|
||||
<para>如果在使用ActiveMQ中发生任何问题,可以去我们的 <ulink
|
||||
url="http://www.jboss.org/index.html?module=bb&op=viewforum&f=312">用户论坛
|
||||
</ulink></para>
|
||||
</listitem>
|
||||
|
@ -54,7 +54,7 @@
|
|||
<para>还可以跟踪我们的<ulink url="http://twitter.com/hornetq">twitter</ulink></para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>HornetQ的Git代码库地址 <ulink
|
||||
<para>ActiveMQ的Git代码库地址 <ulink
|
||||
url="https://github.com/hornetq/hornetq"
|
||||
>https://github.com/hornetq/hornetq</ulink></para>
|
||||
</listitem>
|
||||
|
@ -65,7 +65,7 @@
|
|||
</listitem>
|
||||
</itemizedlist>
|
||||
</para>
|
||||
<para>Red Hat 公司聘请全职工程师进行HornetQ项目的开发工作,他们是: <itemizedlist>
|
||||
<para>Red Hat 公司聘请全职工程师进行ActiveMQ项目的开发工作,他们是: <itemizedlist>
|
||||
<listitem>
|
||||
<para>
|
||||
<ulink url="http://jbossfox.blogspot.com">Tim Fox</ulink> (项目主管)</para>
|
||||
|
|
|
@ -98,7 +98,7 @@
|
|||
<para><literal>max-delivery-attempts</literal>定义了最大重传递的次数。一个消息如果反复传递超过
|
||||
了这个值将会被发往死信地址<literal>dead-letter-address</literal>。相关的完整的解释在
|
||||
<link linkend="undelivered-messages.configuring">这里</link>。</para>
|
||||
<para><literal>redelivery-delay</literal>定义了重新传递的延迟。它控制HornetQ在重新
|
||||
<para><literal>redelivery-delay</literal>定义了重新传递的延迟。它控制ActiveMQ在重新
|
||||
传递一个被取消的消息时要等待的时间。参见<link linkend="undelivered-messages.delay"
|
||||
>这里</link>。</para>
|
||||
<para><literal>expiry-address</literal>定义了过期消息的发送地址。参见<link linkend="message-expiry.configuring">这里</link>。</para>
|
||||
|
|
|
@ -18,17 +18,17 @@
|
|||
<!-- ============================================================================= -->
|
||||
<chapter id="security">
|
||||
<title>安全</title>
|
||||
<para>本章讲述HornetQ的安全机制以及如何配置它。要完全关闭安全,只要将<literal>activemq-configuration.xml</literal>
|
||||
<para>本章讲述ActiveMQ的安全机制以及如何配置它。要完全关闭安全,只要将<literal>activemq-configuration.xml</literal>
|
||||
文件中的<literal>security-enabled</literal>参数设为false即可。</para>
|
||||
<para>出于性能的考虑,安全在HornetQ中被缓存一定的时间。要改变这个时间,需要设置参数
|
||||
<para>出于性能的考虑,安全在ActiveMQ中被缓存一定的时间。要改变这个时间,需要设置参数
|
||||
<literal>security-invalidation-interval</literal>,单位是毫秒。默认值是
|
||||
<literal>10000</literal>毫秒。</para>
|
||||
<section id="security.settings.roles">
|
||||
<title>基于角色的地址安全</title>
|
||||
<para>HornetQ采用了基于角色的安全模型来配置地址的安全以及其队列的安全。</para>
|
||||
<para>正如在<xref linkend="using-core"/>解释的那样,HornetQ核心主要由绑定到地址上的队列组成。
|
||||
<para>ActiveMQ采用了基于角色的安全模型来配置地址的安全以及其队列的安全。</para>
|
||||
<para>正如在<xref linkend="using-core"/>解释的那样,ActiveMQ核心主要由绑定到地址上的队列组成。
|
||||
消息被发送到地址后,服务器查找与之绑定的队列,并将消息路由到这些队列中。</para>
|
||||
<para>HornetQ可以基于地址来给队列定义权限。在定义权限时可以使用通配符'<literal>#</literal>'和
|
||||
<para>ActiveMQ可以基于地址来给队列定义权限。在定义权限时可以使用通配符'<literal>#</literal>'和
|
||||
'<literal>*</literal>'。</para>
|
||||
<para>队列的权限有7种,它们是:</para>
|
||||
<itemizedlist>
|
||||
|
@ -75,11 +75,11 @@
|
|||
角色的用户可以在以开头的地址上创建临时的队列。</para>
|
||||
<para>任何具有<literal>admin</literal>或<literal>europe-users</literal>角色的用户可以向以"globalqueues.europe."开头的地址
|
||||
发送消息,并从绑定到相同地址上的队列接收消息。</para>
|
||||
<para>安全管理器处理一个用户和它的角色的对应关系。HornetQ本身自带一个用户管理器,能从文件中读取用户的身份信息。
|
||||
另外HornetQ还可以使用JAAS或JBoss应用服务器的安全管理机制。</para>
|
||||
<para>安全管理器处理一个用户和它的角色的对应关系。ActiveMQ本身自带一个用户管理器,能从文件中读取用户的身份信息。
|
||||
另外ActiveMQ还可以使用JAAS或JBoss应用服务器的安全管理机制。</para>
|
||||
<para>有关安全管理器的配置信息,请参见<xref linkend="change-security-manager"/>。</para>
|
||||
<para>在每个xml文件中可以有零个或多个 <literal>security-setting</literal>。当一组地址有多个这样的设置时,
|
||||
HornetQ总是选取<emphasis>更具体的</emphasis>匹配。</para>
|
||||
ActiveMQ总是选取<emphasis>更具体的</emphasis>匹配。</para>
|
||||
<para>让我们来看一个实例,下面是另一个<literal>security-setting</literal>:</para>
|
||||
<programlisting>
|
||||
<security-setting match="globalqueues.europe.orders.#">
|
||||
|
@ -101,13 +101,13 @@
|
|||
</section>
|
||||
<section>
|
||||
<title>安全套接字层(SSL)传输</title>
|
||||
<para>当消息客户端与服务器端,或服务器之间(比如使用桥的情况)通过一个不信任的网络相互通信时,HornetQ
|
||||
<para>当消息客户端与服务器端,或服务器之间(比如使用桥的情况)通过一个不信任的网络相互通信时,ActiveMQ
|
||||
支持使用加密的安全套接字(SSL)传输数据。</para>
|
||||
<para>关于SSL的详细配置信息,请参见<xref linkend="configuring-transports"/>。</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>基本用户身份信息(Credentials)</title>
|
||||
<para>HornetQ自带一个安全管理器(security manager)可以从xml文件中读取用户身份信息,即用户名、
|
||||
<para>ActiveMQ自带一个安全管理器(security manager)可以从xml文件中读取用户身份信息,即用户名、
|
||||
密码、角色信息。该xml文件名为<literal>activemq-users.xml</literal>,它必须要在classpath中。</para>
|
||||
<para>如果你要使用这个安全管理器,就将用户名,密码,角色等信息加入到这个文件中。</para>
|
||||
<para>让我们看一个例子:</para>
|
||||
|
@ -149,18 +149,18 @@
|
|||
<para>如果你不想用默认的安全管理器,可以通过修改配置文件<literal>hornetq-beans.xml</literal>
|
||||
(或者在运行JBoss应用服务器情况下<literal
|
||||
>hornetq-jboss-beans.xml</literal>文件)来更换。同时要更换
|
||||
<literal>HornetQSecurityManager</literal> bean 的类。</para>
|
||||
<literal>ActiveMQSecurityManager</literal> bean 的类。</para>
|
||||
<para>让我们看一段默认bean文件的内容:</para>
|
||||
<programlisting>
|
||||
<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>
|
||||
</programlisting>
|
||||
<para><literal>org.apache.activemq.spi.core.security.HornetQSecurityManagerImpl</literal>
|
||||
类就是HornetQ服务器的在独立运行时的默认的安全管理器。</para>
|
||||
<para>HornetQ自带有另外两个安全管理器可供使用。一个是JAAS安全管理器,另一个是用来与JBoss应用服务
|
||||
<para><literal>org.apache.activemq.spi.core.security.ActiveMQSecurityManagerImpl</literal>
|
||||
类就是ActiveMQ服务器的在独立运行时的默认的安全管理器。</para>
|
||||
<para>ActiveMQ自带有另外两个安全管理器可供使用。一个是JAAS安全管理器,另一个是用来与JBoss应用服务
|
||||
器集成的安全管理器。此外,你还可以编写实现你自己的安全管理器。首先要实现
|
||||
<literal>org.apache.activemq.core.security.SecurityManager</literal>接口,再将你的实现
|
||||
类定义到<literal>hornetq-beans.xml</literal>文件中即可(或者在JBoss应用服务器中
|
||||
|
@ -174,7 +174,7 @@
|
|||
<para>要配置使用你自己的JAAS安全实现,需要在bean文件中定义<literal>JAASSecurityManager</literal>。
|
||||
下面是一个例子:</para>
|
||||
<programlisting><![CDATA[
|
||||
<bean name="HornetQSecurityManager"
|
||||
<bean name="ActiveMQSecurityManager"
|
||||
class="org.apache.activemq.integration.jboss.security.JAASSecurityManager">
|
||||
<start ignored="true"/>
|
||||
<stop ignored="true"/>
|
||||
|
@ -202,23 +202,23 @@
|
|||
</itemizedlist>
|
||||
<section>
|
||||
<title>例子</title>
|
||||
<para>参见<xref linkend="examples.jaas"/>。这个例子展示了怎样在HornetQ中配置使用JAAS。</para>
|
||||
<para>参见<xref linkend="examples.jaas"/>。这个例子展示了怎样在ActiveMQ中配置使用JAAS。</para>
|
||||
</section>
|
||||
</section>
|
||||
<section>
|
||||
<title>JBoss 应用服务器安全管理器</title>
|
||||
<para>JBoss 应用服务器安全管理器适用于当HornetQ运行于JBoss应用服务器内时。它可以与JBoss应用服务器
|
||||
<para>JBoss 应用服务器安全管理器适用于当ActiveMQ运行于JBoss应用服务器内时。它可以与JBoss应用服务器
|
||||
的安全模型紧密集成。</para>
|
||||
<para>此安全管理器的类是 <literal
|
||||
>org.apache.activemq.integration.jboss.security.JBossASSecurityManager</literal>。</para>
|
||||
<para>要了解如何配置JBoss安全管理器,可以看一眼HornetQ发布包中相关例子中的
|
||||
<para>要了解如何配置JBoss安全管理器,可以看一眼ActiveMQ发布包中相关例子中的
|
||||
<literal>hornetq-jboss-beans.xml</literal>文件。</para>
|
||||
<section>
|
||||
<title>配置客户端登录</title>
|
||||
<para>JBoss可以配置使用客户登录。JEE的模块如servlet或EJB可以将安全认证信息设置到安全上下文(security context)中,
|
||||
用于整个调用过程。如果想在HornetQ在发送和接收消息时使用这些认证(credential)信息,需要将参数
|
||||
<literal>allowClientLogin</literal>设为true。它会越过HornetQ的身份验证过程并会传播安全上下文(security
|
||||
context)。如果你想要HornetQ使用传播的安全信息进行身份验证,需要同时将参数<literal>authoriseOnClientLogin</literal>
|
||||
用于整个调用过程。如果想在ActiveMQ在发送和接收消息时使用这些认证(credential)信息,需要将参数
|
||||
<literal>allowClientLogin</literal>设为true。它会越过ActiveMQ的身份验证过程并会传播安全上下文(security
|
||||
context)。如果你想要ActiveMQ使用传播的安全信息进行身份验证,需要同时将参数<literal>authoriseOnClientLogin</literal>
|
||||
设为true。</para>
|
||||
<para>关于客户端登录的详细信息请访问<ulink
|
||||
url="http://community.jboss.org/wiki/ClientLoginModule">这里</ulink>。 </para>
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
<title>发送与提交的保证</title>
|
||||
<section>
|
||||
<title>事务保证</title>
|
||||
<para>在提交或回滚事务时,HornetQ将提交或回滚的请求发送到服务器,客户端阻塞等待服务器的响应。</para>
|
||||
<para>在提交或回滚事务时,ActiveMQ将提交或回滚的请求发送到服务器,客户端阻塞等待服务器的响应。</para>
|
||||
<para>当服务器端收到提交或回滚的请求时,它将事务信息记录到日志(journal)中。然后向客户端发回
|
||||
响应。参数<literal>journal-sync-transactional</literal>控制着如何向客户端发回响应。
|
||||
如果它的值是<literal>false</literal>,服务器向客户端发回响应时事务的处理結果不一定已经被
|
||||
|
@ -32,7 +32,7 @@
|
|||
</section>
|
||||
<section id="non-transactional-sends">
|
||||
<title>非事务性消息发送的保证</title>
|
||||
<para>使用非事务性会话发送消息时,经过适当配置HornetQ,客户端在发送后以阻塞的方式等待,直到确认发出
|
||||
<para>使用非事务性会话发送消息时,经过适当配置ActiveMQ,客户端在发送后以阻塞的方式等待,直到确认发出
|
||||
的消息已经到达服务器后再返回。可以对持久化或非持久化的消息分别配置,具体参数如下:</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
|
@ -49,13 +49,13 @@
|
|||
</itemizedlist>
|
||||
<para>将发送设置为阻塞方式会降低程序的效率。因为每次发送都需要一次网络往返的过程,然后才可以进行下次发送。
|
||||
这样发送消息的速度将受网络往返时间(RTT)的限制。这样你的网络带宽就可能没有被充分利用。为了提高效率,我们
|
||||
建议采用事务来批量发送消息。因为在事务中,只有在提交或回滚时阻塞。另外你还可以利用HornetQ高级的
|
||||
建议采用事务来批量发送消息。因为在事务中,只有在提交或回滚时阻塞。另外你还可以利用ActiveMQ高级的
|
||||
<emphasis>异步发送通知功能</emphasis>。这一功能在<xref linkend="asynchronous-send-acknowledgements"/>
|
||||
进行了描述。</para>
|
||||
<para>使用JMS时,如果JMS的连接工厂是在服务器端被注册到JNDI服务,你需要配置
|
||||
<literal>hornetq-jms.xml</literal>文件中的<literal>block-on-durable-send</literal>
|
||||
和<literal>block-on-non-durable-send</literal>。如果不使用JNDI,可以调用
|
||||
<literal>HornetQConnectionFactory</literal>相应的设置方法进行配置。</para>
|
||||
<literal>ActiveMQConnectionFactory</literal>相应的设置方法进行配置。</para>
|
||||
<para>如果你使用的是内核服务,你可以直接在<literal
|
||||
>ClientSessionFactory</literal>上用相关的方法设置相应的参数。</para>
|
||||
<para>当服务器从一个非事务性的会话收到一个消息时,如果这个消息是持久的并且此消息被路由到至少一个持久的队列中,
|
||||
|
@ -65,14 +65,14 @@
|
|||
</section>
|
||||
<section id="send-guarantees.nontrans.acks">
|
||||
<title>非事务性通知的保证</title>
|
||||
<para>当客户端使用非事务性会话向服务器通知消息收到时,可以配置HornetQ使得客户端的通知阻塞直到服务器收到
|
||||
<para>当客户端使用非事务性会话向服务器通知消息收到时,可以配置ActiveMQ使得客户端的通知阻塞直到服务器收到
|
||||
了通知并返回为止。其相应的配置参数是<literal>BlockOnAcknowledge</literal>。如果该参数设为
|
||||
<literal>true</literal>则所有的通过非事务会话的消息通知都是阻塞式的。如果你想要的消息传递策略是
|
||||
<emphasis>最多一次</emphasis>的话,那么你需要将此参数设为。默认值是<literal>false</literal>。</para>
|
||||
</section>
|
||||
<section id="asynchronous-send-acknowledgements">
|
||||
<title>异步发送通知</title>
|
||||
<para>如果你使用的是非事务会话来发送消息,并且希望保证每个发送出去的消息都到达服务器的话,你可以将HornetQ配置
|
||||
<para>如果你使用的是非事务会话来发送消息,并且希望保证每个发送出去的消息都到达服务器的话,你可以将ActiveMQ配置
|
||||
成阻塞的方式,如<xref linkend="non-transactional-sends"/>讨论的那样。这样做的一个缺点是性能的降低。
|
||||
因为这样每发送一个消息就需要一次网络的往返通信。如果网络时延越长,消息发送的效率就越低。同时网络的带宽对消息
|
||||
的发送没有影响。</para>
|
||||
|
@ -82,7 +82,7 @@
|
|||
<para>如果每个消息的大小< 1500字节,而且网络的最大传输单元(MTU)是1500字节。那么理论上1GiB的网络
|
||||
最大的传输速率是 (1024 * 1024 * 1024 / 8) / 1500 = 89478 消息每秒!尽管这不是一个精确的工程计算但
|
||||
你可以看出阻塞式的发送对性能的影响会有多大。</para>
|
||||
<para>为了解决这个问题,HornetQ提供了一种新的功能,称为<emphasis>异步发送通知</emphasis>。
|
||||
<para>为了解决这个问题,ActiveMQ提供了一种新的功能,称为<emphasis>异步发送通知</emphasis>。
|
||||
它允许消息以非阻塞的方式发送,同时从另一个连接流中异步地接收服务器的通知。这样就使得消息的发送与通知分开来,
|
||||
避免了阻塞方式带来的缺点。在保证消息可行发送到服务器的同时提高了呑吐量。</para>
|
||||
<para>参数用来定义消息发送通知的窗口大小。它属于连接工厂或客户会话工厂。参见<xref linkend="client-reconnection"/>
|
||||
|
|
|
@ -18,23 +18,23 @@
|
|||
<!-- ============================================================================= -->
|
||||
<chapter id="thread-pooling">
|
||||
<title>线程管理</title>
|
||||
<para>本章讲述HornetQ如何使用线程池以及如何管理线程。</para>
|
||||
<para>本章讲述ActiveMQ如何使用线程池以及如何管理线程。</para>
|
||||
<para>首先我们讨论在服务器端线程是如何被管理的,然后我们再讨论客户端的情况。</para>
|
||||
<section>
|
||||
<title>服务器端线程的管理</title>
|
||||
<para>每个HornetQ服务器都有一个线程池作为一般线程使用,另外还有一个可计划线程池。Java的可计划线程池不能作为
|
||||
<para>每个ActiveMQ服务器都有一个线程池作为一般线程使用,另外还有一个可计划线程池。Java的可计划线程池不能作为
|
||||
标准的线程池使用,因此我们采用了两个单独的线程池。</para>
|
||||
<para>当使用旧的(阻塞)IO时,使用了一个单独的线程池来处理连接。但是旧的IO要求一个线程配一个连接,所以如果你
|
||||
的应用有很多并发的连接,这个线程池会很快用光所有的线程,造成服务器出现“挂起”现象。因此,对于大量并发连接
|
||||
的应用,一定要使用NIO。</para>
|
||||
<para>如果使用NIO,默认情况下HornetQ会使用系统中处理器内核(或超线程)数量三倍的线程来处理接收的数据包。
|
||||
<para>如果使用NIO,默认情况下ActiveMQ会使用系统中处理器内核(或超线程)数量三倍的线程来处理接收的数据包。
|
||||
内核的数量是通过调用<literal>Runtime.getRuntime().availableProcessors()</literal>来得到
|
||||
的。如果你想改变这个数量,可以设置传输层配置参数<literal>nio-remoting-threads</literal>。
|
||||
参见<xref linkend="configuring-transports"/>。</para>
|
||||
<para>另外在其它一些地方直接使用了线程,没有用线程池。我们将对这些线程作出解释。</para>
|
||||
<section id="server.scheduled.thread.pool">
|
||||
<title>服务器端可计划线程池</title>
|
||||
<para>服务器可计划线程池可以定期地或延迟地执行所交给的任务,它用来完成HornetQ中绝大部分这样的任务。
|
||||
<para>服务器可计划线程池可以定期地或延迟地执行所交给的任务,它用来完成ActiveMQ中绝大部分这样的任务。
|
||||
它内部使用的是一个 <literal
|
||||
>java.util.concurrent.ScheduledThreadPoolExecutor</literal>实例。</para>
|
||||
<para>最大线程数可以在<literal
|
||||
|
@ -61,36 +61,36 @@
|
|||
</section>
|
||||
<section>
|
||||
<title>过期回收线程</title>
|
||||
<para>HornetQ使用一个单独的线程来扫描队列中过期的消息。由于这个线程需要自己的优先级配置,所以不能使用上述的
|
||||
<para>ActiveMQ使用一个单独的线程来扫描队列中过期的消息。由于这个线程需要自己的优先级配置,所以不能使用上述的
|
||||
任何一个线程池。</para>
|
||||
<para>关于回收线程的配置请参阅<xref linkend="message-expiry"/>。</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>异步IO</title>
|
||||
<para>HornetQ使用一个线程池来进行异步IO的操作,包括事件的接收和发送。这些线程的名字都是以
|
||||
HornetQ-AIO-poller-pool为开头。每个打开的日志文件都对应有一个线程为其服务(通常只有
|
||||
<para>ActiveMQ使用一个线程池来进行异步IO的操作,包括事件的接收和发送。这些线程的名字都是以
|
||||
ActiveMQ-AIO-poller-pool为开头。每个打开的日志文件都对应有一个线程为其服务(通常只有
|
||||
一个)。</para>
|
||||
<para>还有一个单独的线程用于向libaio发送写请求。这样做是为了避免上下文转换带来的性能下降。该
|
||||
线程的名字以HornetQ-AIO-writer-pool开头。</para>
|
||||
线程的名字以ActiveMQ-AIO-writer-pool开头。</para>
|
||||
</section>
|
||||
</section>
|
||||
<section id="thread-pooling.client.side">
|
||||
<title>客户端线程管理</title>
|
||||
<para>在客户端HornetQ有一个静态的可计划线程池和一个静态的通用线程池,它们在一个JVM中由同一个classloader装载的所有客户端
|
||||
<para>在客户端ActiveMQ有一个静态的可计划线程池和一个静态的通用线程池,它们在一个JVM中由同一个classloader装载的所有客户端
|
||||
共同使用。</para>
|
||||
<para>静态的可计划的线程池的最大线程数为 <literal>5</literal>,通用线程池则没有线程数限制。</para>
|
||||
<para>如果需要还可以配置一个<literal
|
||||
>ClientSessionFactory</literal>实例以使它拥有自己的可计划与通用线程池。通过这个工厂创建的会话都
|
||||
将使用这些线程池。</para>
|
||||
<para>要想配置<literal>ClientSessionFactory</literal>使用自己的线程池,只要调用它相应的方法取出可,如:</para>
|
||||
<programlisting>ClientSessionFactory myFactory = HornetQClient.createClientSessionFactory(...);
|
||||
<programlisting>ClientSessionFactory myFactory = ActiveMQClient.createClientSessionFactory(...);
|
||||
myFactory.setUseGlobalPools(false);
|
||||
myFactory.setScheduledThreadPoolMaxSize(10);
|
||||
myFactory.setThreadPoolMaxSize(-1); </programlisting>
|
||||
<para>如果使用JMS,你可以先用同样的参数设置ClientSessionFactory,然后再用这样工厂创建<literal
|
||||
>ConnectionFactory</literal>的实例。如:</para>
|
||||
<programlisting>ConnectionFactory myConnectionFactory = HornetQJMSClient.createConnectionFactory(myFactory); </programlisting>
|
||||
<para>如果你使用JNDI来创建<literal>HornetQConnectionFactory</literal>
|
||||
<programlisting>ConnectionFactory myConnectionFactory = ActiveMQJMSClient.createConnectionFactory(myFactory); </programlisting>
|
||||
<para>如果你使用JNDI来创建<literal>ActiveMQConnectionFactory</literal>
|
||||
实例,你还可以在<literal>hornetq-jms.xml</literal>文件中进行配置。如:</para>
|
||||
<programlisting><connection-factory name="ConnectionFactory">
|
||||
<connectors>
|
||||
|
|
|
@ -18,12 +18,12 @@
|
|||
<!-- ============================================================================= -->
|
||||
<chapter id="transaction-config">
|
||||
<title>配置资源管理器(Resource Manager)</title>
|
||||
<para>HornetQ有自己的资源管理器来管理JTA事务。当一个事务开始时,资源管理器就得到通知并记录下该事务和它的状态。
|
||||
<para>ActiveMQ有自己的资源管理器来管理JTA事务。当一个事务开始时,资源管理器就得到通知并记录下该事务和它的状态。
|
||||
有的时候一个事务开始后,最終被忘记。有时客户端崩溃并且再也不能恢复,这样的话该事务就一直存在下去。</para>
|
||||
<para>为了解决这个问题,可以配置HornetQ来扫描过期的事务,并且将它们回滚。默认值是3000000毫秒(5分钟)。
|
||||
<para>为了解决这个问题,可以配置ActiveMQ来扫描过期的事务,并且将它们回滚。默认值是3000000毫秒(5分钟)。
|
||||
它表示任何超过5分钟的事务都将被删除。这个超时对应的参数是<literal
|
||||
>transaction-timeout</literal>,它在配置文件<literal>activemq-configuration.xml</literal>中(单位毫秒)。
|
||||
参数<literal>transaction-timeout-scan-period</literal>定义了HornetQ扫描过期事务的间隔。</para>
|
||||
<para>注意HornetQ不会单方面回滚一个已经处于准备状态的XA事务。如果你认为这些事务永远不会被事务管理器(transaction manager)
|
||||
参数<literal>transaction-timeout-scan-period</literal>定义了ActiveMQ扫描过期事务的间隔。</para>
|
||||
<para>注意ActiveMQ不会单方面回滚一个已经处于准备状态的XA事务。如果你认为这些事务永远不会被事务管理器(transaction manager)
|
||||
来处理的话,你必须通过管理接口来进行回滚。</para>
|
||||
</chapter>
|
||||
|
|
|
@ -47,7 +47,7 @@
|
|||
<redelivery-delay>5000</redelivery-delay>
|
||||
</address-setting>
|
||||
</programlisting>
|
||||
<para>如果定义了<literal>redelivery-delay</literal>,HornetQ在再传递之前等待所定义的时间。</para>
|
||||
<para>如果定义了<literal>redelivery-delay</literal>,ActiveMQ在再传递之前等待所定义的时间。</para>
|
||||
<para>默认是没有延时的(即<literal>redelivery-delay</literal>的值是0)。</para>
|
||||
<para>可以使用通配符为一组地址定义再传递的延迟(参见<xref linkend="wildcard-syntax"/>)。
|
||||
</para>
|
||||
|
@ -62,7 +62,7 @@
|
|||
<para>通过定义一个<emphasis role="italic">死信地址</emphasis>也可以防止同一个消息被无休止地传递:
|
||||
当一个消息被重复传递一定次数后,就会从队列中删除并传递到定义好的死信地址中。</para>
|
||||
<para>这些死信中的消息之后可以转发到某个队列中,以供系统管理员分析处理。</para>
|
||||
<para>每个HornetQ的地址可以有一个死信地址。当一个消息被反复传递达一定次数时,它就会被从队列中删除并送到
|
||||
<para>每个ActiveMQ的地址可以有一个死信地址。当一个消息被反复传递达一定次数时,它就会被从队列中删除并送到
|
||||
死信地址。这些<emphasis>死信</emphasis>消息可以被接收进行分析处理。</para>
|
||||
<section id="undelivered-messages.configuring">
|
||||
<title>配置死信地址</title>
|
||||
|
@ -101,13 +101,13 @@
|
|||
</section>
|
||||
<section id="configuring.delivery.count.persistence">
|
||||
<title>传递计数的持久化</title>
|
||||
<para>通常情况下HornetQ在一个消息被回滚之前并不更新持久的传递计数(即在消息传递到接收者之前不会更新传递计数)。
|
||||
<para>通常情况下ActiveMQ在一个消息被回滚之前并不更新持久的传递计数(即在消息传递到接收者之前不会更新传递计数)。
|
||||
大多数情况下消息被接收、通知、然后被忘掉。这样对<emphasis>每一个消息</emphasis>的传递都要更新一次持久的
|
||||
传递计数,会显著降低系统的性能。</para>
|
||||
<para>介是如果在消息传递之前不进行持久传递计数的更新,服务器一旦发生故障而崩溃,就会造成消息可能被传递出去而传递
|
||||
计数却没有正确反映出传递的結果。在恢复阶段,服务器将错误地将该消息的<literal>redelivered</literal>设为
|
||||
<literal>false</literal>而不是<literal>true</literal>。 </para>
|
||||
<para>这样是不符合严格的JMS要求的。因此HornetQ允许在消息传递前更新传递计数。但是默认不这样做,目的是优先考虑
|
||||
<para>这样是不符合严格的JMS要求的。因此ActiveMQ允许在消息传递前更新传递计数。但是默认不这样做,目的是优先考虑
|
||||
了它对性能的影响。</para>
|
||||
<para>要想打开传递计数更新功能,将<literal>activemq-configuration.xml</literal>文件中的
|
||||
<literal>persist-delivery-count-before-delivery</literal>设为<literal>true</literal>即可:</para>
|
||||
|
|
|
@ -17,8 +17,8 @@
|
|||
<!-- permitted by applicable law. -->
|
||||
<!-- ============================================================================= -->
|
||||
<chapter id="using-core">
|
||||
<title>使用HornetQ内核</title>
|
||||
<para>HornetQ内核是一个与JMS无关的消息系统,它有一套自己的API。我们称它为<emphasis>内核API</emphasis>.</para>
|
||||
<title>使用ActiveMQ内核</title>
|
||||
<para>ActiveMQ内核是一个与JMS无关的消息系统,它有一套自己的API。我们称它为<emphasis>内核API</emphasis>.</para>
|
||||
<para>你可以直接使用内核API。使用内核API可以完成JMS同样的功能,只是比起JMS API使用更加简单方便。另外,内核API
|
||||
还提供了JMS不具有的额外的功能。</para>
|
||||
<section>
|
||||
|
@ -52,23 +52,23 @@
|
|||
非持久消息则会因为服务器的故障或重启而丢失。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>消息具有优先级。优先级的值为从0到9的整数。0代表最低优先级,9代表最高优先级。HornetQ总
|
||||
<para>消息具有优先级。优先级的值为从0到9的整数。0代表最低优先级,9代表最高优先级。ActiveMQ总
|
||||
会尝试先传送优先级高的消息。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>消息还有一个可选的失效时间。如果一个消息过了失效时间,HornetQ将不再传送它。</para>
|
||||
<para>消息还有一个可选的失效时间。如果一个消息过了失效时间,ActiveMQ将不再传送它。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>消息还有一个可选的时间戳(timestamp)。这个时间戳表示的是消息被发送的时间。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>HornetQ还支持大消息的发送。它可以处理大到内存装不下的超大消息。</para>
|
||||
<para>ActiveMQ还支持大消息的发送。它可以处理大到内存装不下的超大消息。</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
</section>
|
||||
<section>
|
||||
<title>地址(Address)</title>
|
||||
<para>HornetQ服务器保存有地址和queue的映射集。一个地址对应零个或多个queue。每个queue还可以拥有消息
|
||||
<para>ActiveMQ服务器保存有地址和queue的映射集。一个地址对应零个或多个queue。每个queue还可以拥有消息
|
||||
过滤器(filter)。当一个消息在服务器内进行路由时,它将会被送往与其地址相绑定的所有的queue中。但是
|
||||
如果其中某个queue有过滤器,那么只有与其过滤器相匹配的消息才会被发到这个queue中。</para>
|
||||
<para>其它的实体如<emphasis role="italic">diverts</emphasis>也可以与一地址进行绑定,消息也会被同样
|
||||
|
@ -95,7 +95,7 @@
|
|||
>ClientSession</literal> 实例。 <literal>ClientSessionFactory</literal>
|
||||
知道如何连接到服务器并创建会话(session)。它是可以根据不同需要灵活配置的。</para>
|
||||
<para><literal>ClientSessionFactory</literal>实例是通过 <literal
|
||||
>HornetQClient</literal> 工厂类创建的。</para>
|
||||
>ActiveMQClient</literal> 工厂类创建的。</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>ClientSession</title>
|
||||
|
@ -105,15 +105,15 @@
|
|||
交易中。</para>
|
||||
<para>ClientSession 管理着ClientConsumers和ClientProducers。</para>
|
||||
<para>ClientSession 实例可以注册一个可选的 <literal
|
||||
>SendAcknowledgementHandler</literal>。每当消息被送达HornetQ服务器中时,
|
||||
HornetQ就用它来异步地发出通知。有了这个独特的功能,客户可以不必阻塞在每次消息的发送操作上来保证
|
||||
>SendAcknowledgementHandler</literal>。每当消息被送达ActiveMQ服务器中时,
|
||||
ActiveMQ就用它来异步地发出通知。有了这个独特的功能,客户可以不必阻塞在每次消息的发送操作上来保证
|
||||
消息安全到达服务器。如果采用阻塞的方法,那么每一个消息的发送都要包括往返两次的网络传递操作,开销
|
||||
是很大的。有了这个异步方式就可以避免这种开销,建立真正的异步的端到端间的系统。这是标准的JMS接口
|
||||
无法做到的。参见 <xref linkend="send-guarantees"/>了解相关的更详细的信息。</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>ClientConsumer</title>
|
||||
<para>客户端使用 <literal>ClientConsumer</literal> 实例来接收来自queue的消息。HornetQ的内核同时支持
|
||||
<para>客户端使用 <literal>ClientConsumer</literal> 实例来接收来自queue的消息。ActiveMQ的内核同时支持
|
||||
同步与异步的消息接收。<literal>ClientConsumer</literal> 实例可以配置有可选的过滤器。它只接收与过滤
|
||||
器相匹配的消息。</para>
|
||||
</section>
|
||||
|
@ -134,7 +134,7 @@
|
|||
<title>一个内核的应用实例</title>
|
||||
<para>下面是一个非常简单的使用内核API来发送的接收消息的实例:</para>
|
||||
<programlisting>
|
||||
ClientSessionFactory factory = HornetQClient.createClientSessionFactory(
|
||||
ClientSessionFactory factory = ActiveMQClient.createClientSessionFactory(
|
||||
new TransportConfiguration(
|
||||
InVMConnectorFactory.class.getName()));
|
||||
|
||||
|
|
|
@ -18,14 +18,14 @@
|
|||
<!-- ============================================================================= -->
|
||||
<chapter id="using-jms">
|
||||
<title>使用JMS</title>
|
||||
<para>很多用户喜欢使JMS,因此HornetQ提供了JMS服务。</para>
|
||||
<para>很多用户喜欢使JMS,因此ActiveMQ提供了JMS服务。</para>
|
||||
<para>JMS是一个普遍使用API标准,绝大多数的消息系统都提供JMS接口。如果你对JMS还不熟悉,建议你先参考一下
|
||||
Sun的<ulink url="http://java.sun.com/products/jms/tutorial/1_3_1-fcs/doc/jms_tutorialTOC.html">
|
||||
JMS 教程</ulink>。</para>
|
||||
<para>HornetQ还提供了许多的JMS的示例程序(examples)。比如简单的JMS Queue和Topic的示例,就很适合初学者做为了
|
||||
解HornetQ JMS的起点。<xref linkend="examples"/>对这些示例作了详细的说明。</para>
|
||||
<para>下面我们将带领读者一步步地配置HornetQ的JMS服务,并创建一个简单的JMS程序。我们还将展示如何在没有JNDI的情况下
|
||||
来使用HornetQ中的JMS。</para>
|
||||
<para>ActiveMQ还提供了许多的JMS的示例程序(examples)。比如简单的JMS Queue和Topic的示例,就很适合初学者做为了
|
||||
解ActiveMQ JMS的起点。<xref linkend="examples"/>对这些示例作了详细的说明。</para>
|
||||
<para>下面我们将带领读者一步步地配置ActiveMQ的JMS服务,并创建一个简单的JMS程序。我们还将展示如何在没有JNDI的情况下
|
||||
来使用ActiveMQ中的JMS。</para>
|
||||
<section>
|
||||
<title>一个简单的订购系统</title>
|
||||
<para>本章我们将用一个简单的订购系统做为一个例子。尽管它十分简单,但是它能够很好地向大家展示JMS的设置和使用。</para>
|
||||
|
@ -68,13 +68,13 @@
|
|||
中即可。</para>
|
||||
<note>
|
||||
<para>在JMS ConnectionFactory的配置中引用了一个名为 <literal>netty</literal>的<literal>connector</literal>。
|
||||
它实际上指向的是HornetQ核心中部署的一个连接器(connector)。它的配置在HornetQ的核心配置文件
|
||||
它实际上指向的是ActiveMQ核心中部署的一个连接器(connector)。它的配置在ActiveMQ的核心配置文件
|
||||
<literal>activemq-configuration.xml</literal> 中。它定义了采用何种传输与服务器连接。</para>
|
||||
</note>
|
||||
</section>
|
||||
<section id="using-jms.configure.factory.types">
|
||||
<title>连接工厂的类型</title>
|
||||
<para>在JMS API文档中有几种不同类型的连接工厂供用户使用。HornetQ为用户提供了配置连接工厂类型的参数。用户可以通过
|
||||
<para>在JMS API文档中有几种不同类型的连接工厂供用户使用。ActiveMQ为用户提供了配置连接工厂类型的参数。用户可以通过
|
||||
配置连接工厂的”signature"属性和"xa"参数来得到想要的类型。“singature"属性是字符串类型,它有三个可选值:
|
||||
<emphasis>generic</emphasis>、<emphasis>queue</emphasis>和<emphasis>topic</emphasis>;
|
||||
<literal>xa</literal>是一个布尔型参数。下表给出了不同类型连接工厂对应的配置值:</para>
|
||||
|
@ -176,8 +176,8 @@ java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces
|
|||
千万不能用<literal>localhost</literal>!</para>
|
||||
</note>
|
||||
<note>
|
||||
<para><emphasis>只有当HornetQ作为独立服务器运行时</emphasis>
|
||||
才可以配置JNDIServer bean。当HornetQ运行于JBoss应用服务器中时,由于JBOSS服务器已经提供了
|
||||
<para><emphasis>只有当ActiveMQ作为独立服务器运行时</emphasis>
|
||||
才可以配置JNDIServer bean。当ActiveMQ运行于JBoss应用服务器中时,由于JBOSS服务器已经提供了
|
||||
JNDI服务,所以就不需要再进行配置了。</para>
|
||||
</note>
|
||||
</section>
|
||||
|
@ -207,7 +207,7 @@ producer.send(message);</programlisting>
|
|||
<programlisting>TextMessage receivedMessage = (TextMessage)consumer.receive();
|
||||
System.out.println("Got order: " + receivedMessage.getText());
|
||||
</programlisting>
|
||||
<para>看起来就是这么简单。 在HornetQ有发布包中有很多各种各样的JMS例子供用户参考。</para>
|
||||
<para>看起来就是这么简单。 在ActiveMQ有发布包中有很多各种各样的JMS例子供用户参考。</para>
|
||||
<warning>
|
||||
<para>请注意,JMS的连接(connection)、会话(session)、生产者(producer)和消费者(consumer)
|
||||
对象是可以<emphasis>重用</emphasis>的。</para>
|
||||
|
@ -220,19 +220,19 @@ System.out.println("Got order: " + receivedMessage.getText());
|
|||
<para>尽管采用JNDI对 JMS 的各种<emphasis>管理对象(Administered
|
||||
Objects)</emphasis> (即JMS Queue, Topic and ConnectionFactory)是很常用的方法,但在有些
|
||||
情况时JNDI不可用,或者你不需要用JNDI时,如何还能正常使用JMS呢?</para>
|
||||
<para>HornetQ允许你不通过JNDI也能使用JMS。HornetQ支持直接创建JMS的各种对象而无需JNDI的存在。</para>
|
||||
<para>ActiveMQ允许你不通过JNDI也能使用JMS。ActiveMQ支持直接创建JMS的各种对象而无需JNDI的存在。</para>
|
||||
<para>在<xref linkend="examples"/>中包括有这样的例子供读者参考。</para>
|
||||
<para>下面我们就将上述那个简单的例子重写,以抛开对JNDI的依赖:</para>
|
||||
<para>我们通过HornetQJMSClient类来方便地创建JMS的ConnectionFactory。注意这里要提供各种连接参数和定义
|
||||
<para>我们通过ActiveMQJMSClient类来方便地创建JMS的ConnectionFactory。注意这里要提供各种连接参数和定义
|
||||
所用的传输方式。有关连接器(connector)的信息参见<xref linkend="configuring-transports"
|
||||
/>。</para>
|
||||
<programlisting>
|
||||
TransportConfiguration transportConfiguration =
|
||||
new TransportConfiguration(NettyConnectorFactory.class.getName());
|
||||
ConnectionFactory cf = HornetQJMSClient.createConnectionFactory(transportConfiguration);
|
||||
ConnectionFactory cf = ActiveMQJMSClient.createConnectionFactory(transportConfiguration);
|
||||
</programlisting>
|
||||
<para>同样利用HornetQJMSClient类创建JMS Queue对象:</para>
|
||||
<programlisting>Queue orderQueue = HornetQJMSClient.createQueue("OrderQueue");</programlisting>
|
||||
<para>同样利用ActiveMQJMSClient类创建JMS Queue对象:</para>
|
||||
<programlisting>Queue orderQueue = ActiveMQJMSClient.createQueue("OrderQueue");</programlisting>
|
||||
<para>然后用连接工厂创建 JMS 连接:</para>
|
||||
<programlisting>Connection connection = cf.createConnection();</programlisting>
|
||||
<para>还有非事务的\AUTO_ACKNOWLEDGE方式的 JMS 会话(session):</para>
|
||||
|
|
|
@ -17,21 +17,21 @@
|
|||
<!-- permitted by applicable law. -->
|
||||
<!-- ============================================================================= -->
|
||||
<chapter id="using-server">
|
||||
<title>使用HornetQ服务</title>
|
||||
<para>本章将介绍如何使用HornetQ服务。</para>
|
||||
<para>其中的内容包括服务器的位置,如何启动和停止HornetQ服务器。本章还将解释HornetQ的目录结构,其中的文件及其用途。</para>
|
||||
<para>本章中所提到的HornetQ服务器是指HornetQ默认配置的独立服务器,包含JMS服务和JNDI服务。</para>
|
||||
<para>对于运行于JBoss应用服务器中的HornetQ,其基本结构是一样的,只是有一些小的差别。</para>
|
||||
<title>使用ActiveMQ服务</title>
|
||||
<para>本章将介绍如何使用ActiveMQ服务。</para>
|
||||
<para>其中的内容包括服务器的位置,如何启动和停止ActiveMQ服务器。本章还将解释ActiveMQ的目录结构,其中的文件及其用途。</para>
|
||||
<para>本章中所提到的ActiveMQ服务器是指ActiveMQ默认配置的独立服务器,包含JMS服务和JNDI服务。</para>
|
||||
<para>对于运行于JBoss应用服务器中的ActiveMQ,其基本结构是一样的,只是有一些小的差别。</para>
|
||||
<section>
|
||||
<title>服务的启动和停止</title>
|
||||
<para>在HornetQ的安装目录下<literal>bin</literal>子目录中包含有一个unit/linux脚本run.sh和对应的Windows批处理文件run.bat。</para>
|
||||
<para>在ActiveMQ的安装目录下<literal>bin</literal>子目录中包含有一个unit/linux脚本run.sh和对应的Windows批处理文件run.bat。</para>
|
||||
<para>如果你是在Unix/Linux环境,在bin目录下运行<literal>./run.sh</literal>。</para>
|
||||
<para>如果是在Windows环境,则在bin目录下运行 <literal>run.bat</literal>。</para>
|
||||
<para>这个脚本文件会设置classpath以及各种JVM参数,并启动JBoss Microcontainer。JBoss Microcontainer是一个轻量级的容器。
|
||||
它被用来部署HornetQ的POJO对象。</para>
|
||||
它被用来部署ActiveMQ的POJO对象。</para>
|
||||
<para>要停止服务,运行其中的相应脚本:在Unix/Linux环境下,运行 <literal>stop.sh</literal>。
|
||||
在Windows环境,运行 <literal>run.bat</literal>。</para>
|
||||
<para>注意HornetQ需要在Java 6及以上版本才能正常运行。</para>
|
||||
<para>注意ActiveMQ需要在Java 6及以上版本才能正常运行。</para>
|
||||
<para>启动和停止脚本在默认条件下读取<literal>config/stand-alone/non-clustered</literal>目录下的配置文件。
|
||||
如果要指向其他目录,可以在命令行实现,例如: <literal>./run.sh ../config/stand-alone/clustered</literal>。
|
||||
这一方法同样适用于Windows批处理文件。</para>
|
||||
|
@ -41,14 +41,14 @@
|
|||
<para>在启动脚本<literal>run.sh</literal>和<literal>run.bat</literal>中设置了一些JVM参数,
|
||||
这些参数主要是调整Java 6的运行环境及拉圾回收的策略。我们建议采用并行拉圾回收的方法。
|
||||
这种方法可以将拉圾回收所造成的延时进行平均分配,有效减少由于拉圾回收引起的长时间暂停的情况。</para>
|
||||
<para>默认条件下HornetQ需要最大1GB的内存空间。通过<literal>-Xms</literal>和<literal>-Xmx</literal>可以调整Java程序内存的使用。</para>
|
||||
<para>默认条件下ActiveMQ需要最大1GB的内存空间。通过<literal>-Xms</literal>和<literal>-Xmx</literal>可以调整Java程序内存的使用。</para>
|
||||
<para>你可以向启动脚本中添加其它的参数或修改已有的参数,已满足你的需要。</para>
|
||||
</section>
|
||||
<section>
|
||||
<title>服务器端的classpath</title>
|
||||
<para>HornetQ在其classpath中寻找配置文件。</para>
|
||||
<para>classpath被定义在<literal>run.sh</literal>和<literal>run.bat</literal>脚本中。在HornetQ的发布中,启动脚本将非集群的配置文件目录加进了classpath中。该目录包括了一组配置文件,可以让HornetQ以基本的非集群方式运行。它的具体位置是在HornetQ发布根目录下 config/stand-along/non-clustered/ 子目录。</para>
|
||||
<para>在HornetQ的发布包中包括了一组标准的配置目录,它们是:</para>
|
||||
<para>ActiveMQ在其classpath中寻找配置文件。</para>
|
||||
<para>classpath被定义在<literal>run.sh</literal>和<literal>run.bat</literal>脚本中。在ActiveMQ的发布中,启动脚本将非集群的配置文件目录加进了classpath中。该目录包括了一组配置文件,可以让ActiveMQ以基本的非集群方式运行。它的具体位置是在ActiveMQ发布根目录下 config/stand-along/non-clustered/ 子目录。</para>
|
||||
<para>在ActiveMQ的发布包中包括了一组标准的配置目录,它们是:</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>非集群方式的独立服务器配置</para>
|
||||
|
@ -63,7 +63,7 @@
|
|||
<para>集群方式运行于JBoss应用服务器</para>
|
||||
</listitem>
|
||||
</itemizedlist>
|
||||
<para>当然你可以创建自己定义的配置文件目录。要注意的是将你的目录加到classpath中以便HornetQ能正确找到并加载。</para>
|
||||
<para>当然你可以创建自己定义的配置文件目录。要注意的是将你的目录加到classpath中以便ActiveMQ能正确找到并加载。</para>
|
||||
</section>
|
||||
<section id="using-server.library.path">
|
||||
<title>Library Path</title>
|
||||
|
@ -73,7 +73,7 @@
|
|||
</section>
|
||||
<section>
|
||||
<title>系统变量</title>
|
||||
<para>HornetQ命令行可以接受系统变量来配置日志(logging)。有关logging配置的具体信息参见<xref linkend="logging"/>。</para>
|
||||
<para>ActiveMQ命令行可以接受系统变量来配置日志(logging)。有关logging配置的具体信息参见<xref linkend="logging"/>。</para>
|
||||
</section>
|
||||
<section id="using-server.configuration">
|
||||
<title>配置文件</title>
|
||||
|
@ -81,27 +81,27 @@
|
|||
<itemizedlist>
|
||||
<listitem>
|
||||
<para><literal>hornetq-beans.xml</literal> (如果是运行在JBoss应用服务器内,则为 <literal
|
||||
>hornetq-jboss-beans.xml</literal>)。这是JBoss Microcontainer的bean配置文件。其中定义了HornetQ的
|
||||
各种bean,以及它们之间的依赖关系。HornetQ的bean都是一些POJO。是JBoss Microcontainer保证了这些bean的正确装载和运行。</para>
|
||||
>hornetq-jboss-beans.xml</literal>)。这是JBoss Microcontainer的bean配置文件。其中定义了ActiveMQ的
|
||||
各种bean,以及它们之间的依赖关系。ActiveMQ的bean都是一些POJO。是JBoss Microcontainer保证了这些bean的正确装载和运行。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>activemq-configuration.xml</literal>。这个是HornetQ的主要的配置文件。
|
||||
<para><literal>activemq-configuration.xml</literal>。这个是ActiveMQ的主要的配置文件。
|
||||
其中的所有参数在<xref linkend="configuration-index"/>中给出了解释. 在 <xref
|
||||
linkend="usingserver.mainconfig"/> 也有更多的相关信息。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>activemq-queues.xml</literal>。这个文件里包含了预定义的queue以及它们的配置,包括安全设置。
|
||||
这是一个可选的文件,里面所有的内容都可以放在 <literal>activemq-configuration.xml</literal>文件中。
|
||||
在默认的配置文件目录下并没有这个文件。HornetQ之所以提供这个文件是为了用户便于管理他们的queue。在classpath中
|
||||
在默认的配置文件目录下并没有这个文件。ActiveMQ之所以提供这个文件是为了用户便于管理他们的queue。在classpath中
|
||||
允许包含多个 <literal>activemq-queues.xml</literal> 文件。所有的这些文件都会被加载。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>activemq-users.xml</literal>。用户信息文件。HornetQ本身实现了一个基本的
|
||||
<para><literal>activemq-users.xml</literal>。用户信息文件。ActiveMQ本身实现了一个基本的
|
||||
安全管理器(security manager),它从这个文件内读取用户的安全信息,如用户名,密码和角色。
|
||||
想了解更多关于安全的信息,参见 <xref linkend="security"/>。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para><literal>hornetq-jms.xml</literal>。这个文件包含有JMS对象。HornetQ的默认配置中包含有JMS服务,
|
||||
<para><literal>hornetq-jms.xml</literal>。这个文件包含有JMS对象。ActiveMQ的默认配置中包含有JMS服务,
|
||||
它从这个文件中读取JMS Queue,Topic和ConnectionFactory并将它们部署到JNDI服务中。如果你不使用JMS,
|
||||
或者你不需要部署这些JMS对象,那么你就不需要这个文件。有关JMS的使用详见<xref linkend="using-jms"
|
||||
/>。</para>
|
||||
|
@ -116,7 +116,7 @@
|
|||
</itemizedlist>
|
||||
<note>
|
||||
<para>如果在<literal>activemq-configuration.xml</literal>文件中将<literal>file-deployment-enabled</literal> 参数
|
||||
定义为false,则HornetQ将不会加载其它的配置文件。这个参数的默认值是true。</para>
|
||||
定义为false,则ActiveMQ将不会加载其它的配置文件。这个参数的默认值是true。</para>
|
||||
</note>
|
||||
<para>所有配置文件中的参数都可以用系统变量来定义其值。以下用一个connector的配置来说明:</para>
|
||||
<programlisting><connector name="netty">
|
||||
|
@ -133,13 +133,13 @@
|
|||
</section>
|
||||
<section id="server.microcontainer.configuration">
|
||||
<title>JBoss Microcontainer Beans 文件</title>
|
||||
<para>HornetQ的POJO对象是由<ulink url="http://www.jboss.org/jbossmc/"> JBoss Microcontainer
|
||||
<para>ActiveMQ的POJO对象是由<ulink url="http://www.jboss.org/jbossmc/"> JBoss Microcontainer
|
||||
</ulink>进行加载和运行的。JBoss Microcontainer是一个轻量级的加载工具。</para>
|
||||
<note>
|
||||
<para>如果是在JBoss应用服务器内运行,HornetQ同样需要一个bean的配置文件来将其部署到JBoss中。但是这与单独运行时的配置文件略有不同。
|
||||
这是因为应用服务器内已经部署了一些服务,如安全服务等。所以在HornetQ中这些服务就不需要再部署了。</para>
|
||||
<para>如果是在JBoss应用服务器内运行,ActiveMQ同样需要一个bean的配置文件来将其部署到JBoss中。但是这与单独运行时的配置文件略有不同。
|
||||
这是因为应用服务器内已经部署了一些服务,如安全服务等。所以在ActiveMQ中这些服务就不需要再部署了。</para>
|
||||
</note>
|
||||
<para>让我们看一个HornetQ作为单独服务器时的一个配置文件例子:</para>
|
||||
<para>让我们看一个ActiveMQ作为单独服务器时的一个配置文件例子:</para>
|
||||
<para>
|
||||
<programlisting><?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
|
@ -169,14 +169,14 @@
|
|||
</bean>
|
||||
|
||||
<!-- The security manager -->
|
||||
<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 core server -->
|
||||
<bean name="HornetQServer" class="org.apache.activemq.core.server.impl.HornetQServerImpl">
|
||||
<bean name="ActiveMQServer" class="org.apache.activemq.core.server.impl.ActiveMQServerImpl">
|
||||
<start ignored="true"/>
|
||||
<stop ignored="true"/>
|
||||
<constructor>
|
||||
|
@ -187,7 +187,7 @@
|
|||
<inject bean="MBeanServer"/>
|
||||
</parameter>
|
||||
<parameter>
|
||||
<inject bean="HornetQSecurityManager"/>
|
||||
<inject bean="ActiveMQSecurityManager"/>
|
||||
</parameter>
|
||||
</constructor>
|
||||
</bean>
|
||||
|
@ -197,14 +197,14 @@
|
|||
class="org.apache.activemq.jms.server.impl.JMSServerManagerImpl">
|
||||
<constructor>
|
||||
<parameter>
|
||||
<inject bean="HornetQServer"/>
|
||||
<inject bean="ActiveMQServer"/>
|
||||
</parameter>
|
||||
</constructor>
|
||||
</bean>
|
||||
|
||||
</deployment></programlisting>
|
||||
</para>
|
||||
<para>我们从上可以看出HornetQ的单独服务器(以及核心服务器)包括了一些POJO对象:</para>
|
||||
<para>我们从上可以看出ActiveMQ的单独服务器(以及核心服务器)包括了一些POJO对象:</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>JNDIServer</para>
|
||||
|
@ -218,17 +218,17 @@
|
|||
</listitem>
|
||||
<listitem>
|
||||
<para>Configuration</para>
|
||||
<para>这是HornetQ的Configuration对象。默认时它是一个FileConfiguration对象。它可以从文件系统中读取
|
||||
配置信息。有些情况下(如嵌入式HornetQ)你可以将它定义为其它对象,以便用其它方法获得配置信息。</para>
|
||||
<para>这是ActiveMQ的Configuration对象。默认时它是一个FileConfiguration对象。它可以从文件系统中读取
|
||||
配置信息。有些情况下(如嵌入式ActiveMQ)你可以将它定义为其它对象,以便用其它方法获得配置信息。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>Security Manager. 可配置的安全管理器。默认的安全管理器使用 <literal>activemq-users.xml</literal> 文件中的配置信息。
|
||||
它也可以配置为一个JAAS的安全管理器。当HornetQ运行于JBoss应用服务器中时,它还可以配置为JBoss的安全管理器,以达到更紧密的集成。
|
||||
它也可以配置为一个JAAS的安全管理器。当ActiveMQ运行于JBoss应用服务器中时,它还可以配置为JBoss的安全管理器,以达到更紧密的集成。
|
||||
如果不需要安全管理,你也可以将它删除。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>HornetQServer</para>
|
||||
<para>这是HornetQ的核心服务对象,几乎所有的核心功能都在这里。</para>
|
||||
<para>ActiveMQServer</para>
|
||||
<para>这是ActiveMQ的核心服务对象,几乎所有的核心功能都在这里。</para>
|
||||
</listitem>
|
||||
<listitem id="bean-jmsservermanager">
|
||||
<para>JMSServerManager</para>
|
||||
|
@ -241,45 +241,45 @@
|
|||
<section id="server.microkernel.configuration">
|
||||
<title>JBoss AS4 MBean 服务</title>
|
||||
<note>
|
||||
<para>本节只讨论在JBoss AS 4上配置HornetQ。其与JBoss Microcontainer的配置很相似。</para>
|
||||
<para>本节只讨论在JBoss AS 4上配置ActiveMQ。其与JBoss Microcontainer的配置很相似。</para>
|
||||
</note>
|
||||
<para>
|
||||
<programlisting><?xml version="1.0" encoding="UTF-8"?>
|
||||
<server>
|
||||
|
||||
<mbean code="org.apache.activemq.service.HornetQFileConfigurationService"
|
||||
name="org.apache.activemq:service=HornetQFileConfigurationService">
|
||||
<mbean code="org.apache.activemq.service.ActiveMQFileConfigurationService"
|
||||
name="org.apache.activemq:service=ActiveMQFileConfigurationService">
|
||||
</mbean>
|
||||
|
||||
<mbean code="org.apache.activemq.service.JBossASSecurityManagerService"
|
||||
name="org.apache.activemq:service=JBossASSecurityManagerService">
|
||||
</mbean>
|
||||
|
||||
<mbean code="org.apache.activemq.service.HornetQStarterService"
|
||||
name="org.apache.activemq:service=HornetQStarterService">
|
||||
<mbean code="org.apache.activemq.service.ActiveMQStarterService"
|
||||
name="org.apache.activemq:service=ActiveMQStarterService">
|
||||
<!--let's let the JMS Server start us-->
|
||||
<attribute name="Start">false</attribute>
|
||||
|
||||
<depends optional-attribute-name="SecurityManagerService"
|
||||
proxy-type="attribute">org.apache.activemq:service=JBossASSecurityManagerService</depends>
|
||||
<depends optional-attribute-name="ConfigurationService"
|
||||
proxy-type="attribute">org.apache.activemq:service=HornetQFileConfigurationService</depends>
|
||||
proxy-type="attribute">org.apache.activemq:service=ActiveMQFileConfigurationService</depends>
|
||||
</mbean>
|
||||
|
||||
<mbean code="org.apache.activemq.service.HornetQJMSStarterService"
|
||||
name="org.apache.activemq:service=HornetQJMSStarterService">
|
||||
<depends optional-attribute-name="HornetQServer"
|
||||
proxy-type="attribute">org.apache.activemq:service=HornetQStarterService</depends>
|
||||
<mbean code="org.apache.activemq.service.ActiveMQJMSStarterService"
|
||||
name="org.apache.activemq:service=ActiveMQJMSStarterService">
|
||||
<depends optional-attribute-name="ActiveMQServer"
|
||||
proxy-type="attribute">org.apache.activemq:service=ActiveMQStarterService</depends>
|
||||
</mbean>
|
||||
|
||||
</server>
|
||||
</programlisting>
|
||||
</para>
|
||||
<para>这个jboss-service.xml包含在hornetq-service.sar文件中,它用来配置AS4中嵌入运行的HornetQ。
|
||||
<para>这个jboss-service.xml包含在hornetq-service.sar文件中,它用来配置AS4中嵌入运行的ActiveMQ。
|
||||
在这个配置文件中我们启动了以下几个服务:</para>
|
||||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>HornetQFileConfigurationService</para>
|
||||
<para>ActiveMQFileConfigurationService</para>
|
||||
<para>这个MBean服务的任务是管理 <literal>FileConfiguration POJO</literal>的生命周期。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
|
@ -287,12 +287,12 @@
|
|||
<para>这个MBean服务管理着 <literal>JBossASSecurityManager</literal> POJO的生命周期。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>HornetQStarterService</para>
|
||||
<para>这个MBean服务管理着<literal>HornetQServer</literal> POJO。它依赖于 JBossASSecurityManagerService 和
|
||||
HornetQFileConfigurationService 这两个MBean。</para>
|
||||
<para>ActiveMQStarterService</para>
|
||||
<para>这个MBean服务管理着<literal>ActiveMQServer</literal> POJO。它依赖于 JBossASSecurityManagerService 和
|
||||
ActiveMQFileConfigurationService 这两个MBean。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
<para>HornetQJMSStarterService</para>
|
||||
<para>ActiveMQJMSStarterService</para>
|
||||
<para>这个MBean服务管理着 <literal>JMSServerManagerImpl</literal> POJO对象。如果不需要JMS,可以去掉这个服务。</para>
|
||||
</listitem>
|
||||
<listitem>
|
||||
|
@ -303,9 +303,9 @@
|
|||
</section>
|
||||
<section id="usingserver.mainconfig">
|
||||
<title>主配置文件</title>
|
||||
<para>HornetQ 核心服务的配置保存在 <literal>activemq-configuration.xml</literal>文件中。
|
||||
<para>ActiveMQ 核心服务的配置保存在 <literal>activemq-configuration.xml</literal>文件中。
|
||||
FileConfiguration bean 读取这个文件来对消息服务器进行配置。</para>
|
||||
<para>HornetQ有很多的配置参数。采用默认的配置在绝大多数情况下可以很好的运行。事实上每一个参数都有默认的处理,因此一个只包含有一个空
|
||||
<para>ActiveMQ有很多的配置参数。采用默认的配置在绝大多数情况下可以很好的运行。事实上每一个参数都有默认的处理,因此一个只包含有一个空
|
||||
的<literal>configuration</literal>的配置文件是一个有效的文件。对各个参数的解释贯穿于本手册。你还可参参照
|
||||
<link linkend="configuration-index">这里</link>来查找你想看的参数。</para>
|
||||
</section>
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
|
||||
<chapter id="wildcard-routing">
|
||||
<title>使用通配符实现消息路由</title>
|
||||
<para>HornetQ支持使用带通配符的地址对消息路由。</para>
|
||||
<para>ActiveMQ支持使用带通配符的地址对消息路由。</para>
|
||||
<para>例如,当创建一个队列时使用了地址<literal>queue.news.#</literal>,那么它就能接收
|
||||
所有和这个地址通配符相配的每一个地址的消息。这样的地址如 <literal
|
||||
>queue.news.europe</literal> 或 <literal>queue.news.usa</literal> 或 <literal
|
||||
|
|
|
@ -19,10 +19,10 @@
|
|||
<!-- ============================================================================= -->
|
||||
|
||||
<chapter id="wildcard-syntax">
|
||||
<title>了解 HornetQ 通配符的语法</title>
|
||||
<para>HornetQ使用了一种专门的通配符语法来配置安全、地址及接收者(consumer)的创建。</para>
|
||||
<title>了解 ActiveMQ 通配符的语法</title>
|
||||
<para>ActiveMQ使用了一种专门的通配符语法来配置安全、地址及接收者(consumer)的创建。</para>
|
||||
<para>这种语法与 <ulink url="http://www.amqp.org">AMQP</ulink>所用的语法相似。</para>
|
||||
<para>一个HornetQ的通配符表达式是由一些由“<literal
|
||||
<para>一个ActiveMQ的通配符表达式是由一些由“<literal
|
||||
>.</literal>”分隔的单词组成。</para>
|
||||
<para>特殊字符“<literal>#</literal>”和“<literal>*</literal>”在表达式中可作为一个单词,它们代表
|
||||
特殊的意义。</para>
|
||||
|
|
Binary file not shown.
|
@ -37,7 +37,7 @@
|
|||
|
||||
<!-- Comparison is correct within its context -->
|
||||
<Match>
|
||||
<Class name="org.apache.activemq.ra.HornetQRaUtils"/>
|
||||
<Class name="org.apache.activemq.ra.ActiveMQRaUtils"/>
|
||||
<Or>
|
||||
<Method name="compare" params="java.lang.Integer,java.lang.Integer" returns="boolean"/>
|
||||
<Method name="compare" params="java.lang.Long,java.lang.Long" returns="boolean"/>
|
||||
|
@ -115,7 +115,7 @@
|
|||
|
||||
<Match>
|
||||
<!-- Files generated by JBoss Logging are ignored -->
|
||||
<Class name="~org\.hornetq\..*\.HornetQ.*(Logger_\$logger|Bundle_\$bundle)"/>
|
||||
<Class name="~org\.hornetq\..*\.ActiveMQ.*(Logger_\$logger|Bundle_\$bundle)"/>
|
||||
</Match>
|
||||
|
||||
<!-- Ignore checks on return values, example File.delete(), on samples/examples -->
|
||||
|
@ -130,7 +130,7 @@
|
|||
</Match>
|
||||
|
||||
<Match>
|
||||
<Class name="org.apache.activemq.core.server.impl.HornetQServerImpl$SharedNothingLiveActivation"/>
|
||||
<Class name="org.apache.activemq.core.server.impl.ActiveMQServerImpl$SharedNothingLiveActivation"/>
|
||||
<Method name="isNodeIdUsed"/>
|
||||
<Bug pattern="RV_RETURN_VALUE_IGNORED"/>
|
||||
</Match>
|
||||
|
|
|
@ -49,11 +49,11 @@ cleanup.use_this_for_non_static_field_access=true
|
|||
cleanup.use_this_for_non_static_field_access_only_if_necessary=true
|
||||
cleanup.use_this_for_non_static_method_access=true
|
||||
cleanup.use_this_for_non_static_method_access_only_if_necessary=true
|
||||
cleanup_profile=_HornetQ profile
|
||||
cleanup_profile=_ActiveMQ profile
|
||||
cleanup_settings_version=2
|
||||
eclipse.preferences.version=1
|
||||
editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
|
||||
formatter_profile=_'HornetQ'
|
||||
formatter_profile=_'ActiveMQ'
|
||||
formatter_settings_version=12
|
||||
org.eclipse.jdt.ui.exception.name=e
|
||||
org.eclipse.jdt.ui.gettersetter.use.is=true
|
||||
|
|
|
@ -1,21 +1,21 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>HornetQ Embedded Example</title>
|
||||
<title>ActiveMQ Embedded Example</title>
|
||||
<link rel="stylesheet" type="text/css" href="../../common/common.css" />
|
||||
<link rel="stylesheet" type="text/css" href="../../common/prettify.css" />
|
||||
<script type="text/javascript" src="../../common/prettify.js"></script>
|
||||
</head>
|
||||
<body onload="prettyPrint()">
|
||||
<h1>Embedded Example</h1>
|
||||
<p>This example shows how to setup and run HornetQ embedded with remote clients connecting.</p>
|
||||
<p>HornetQ was designed to use POJOs (Plain Old Java Objects), what makes embedding HornetQ as simple as instantiating a few objects.</p>
|
||||
<p>This example shows how to setup and run ActiveMQ embedded with remote clients connecting.</p>
|
||||
<p>ActiveMQ was designed to use POJOs (Plain Old Java Objects), what makes embedding ActiveMQ as simple as instantiating a few objects.</p>
|
||||
|
||||
<p>HornetQ Embedded could be used from very simple use cases with only InVM support to very complex cases with clustering, persistence and fail over.</p>
|
||||
<p>ActiveMQ Embedded could be used from very simple use cases with only InVM support to very complex cases with clustering, persistence and fail over.</p>
|
||||
|
||||
|
||||
<h2>Example step-by-step</h2>
|
||||
<p><i>To run the example, simply type <code>mvn -Pserver</code> from this directory to start the server and <code>mvn -Pclient</code> to run the client example</i></p>
|
||||
<p>In this we don't use any configuration files. (Everything is embedded). We simply instantiate ConfigurationImpl, HornetQServer, start it and operate on JMS regularly</p>
|
||||
<p>In this we don't use any configuration files. (Everything is embedded). We simply instantiate ConfigurationImpl, ActiveMQServer, start it and operate on JMS regularly</p>
|
||||
<br/>
|
||||
<ol>
|
||||
<li>On EmbeddedServer: Create the Configuration, and set the properties accordingly</li>
|
||||
|
@ -27,13 +27,13 @@
|
|||
|
||||
<li>On EmbeddedServer: Create and start the server</li>
|
||||
<pre class="prettyprint">
|
||||
HornetQServer server = HornetQ.newHornetQServer(configuration);
|
||||
ActiveMQServer server = ActiveMQ.newActiveMQServer(configuration);
|
||||
server.start();
|
||||
</pre>
|
||||
|
||||
<li>As we are not using a JNDI environment we instantiate the objects directly</li>
|
||||
<pre class="prettyprint">
|
||||
ServerLocator serverLocator = HornetQClient.createServerLocatorWithoutHA(new TransportConfiguration(NettyConnectorFactory.class.getName()));
|
||||
ServerLocator serverLocator = ActiveMQClient.createServerLocatorWithoutHA(new TransportConfiguration(NettyConnectorFactory.class.getName()));
|
||||
ClientSessionFactory sf = serverLocator.createSessionFactory();
|
||||
</pre>
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>HornetQ Embedded Example</title>
|
||||
<title>ActiveMQ Embedded Example</title>
|
||||
<link rel="stylesheet" type="text/css" href="../../common/common.css" />
|
||||
<link rel="stylesheet" type="text/css" href="../../common/prettify.css" />
|
||||
<script type="text/javascript" src="../../common/prettify.js"></script>
|
||||
|
@ -8,19 +8,19 @@
|
|||
<body onload="prettyPrint()">
|
||||
<h1>Embedded Example</h1>
|
||||
|
||||
<p>This example shows how to setup and run HornetQ embedded.</p>
|
||||
<p>HornetQ was designed to use POJOs (Plain Old Java Objects), what makes embedding HornetQ as simple as instantiating a few objects.</p>
|
||||
<p>This example shows how to setup and run ActiveMQ embedded.</p>
|
||||
<p>ActiveMQ was designed to use POJOs (Plain Old Java Objects), what makes embedding ActiveMQ as simple as instantiating a few objects.</p>
|
||||
<p>In this example, we are using two jars:</p>
|
||||
<ul>
|
||||
<li>hornetq-server.jar</li>
|
||||
<li>netty.jar</li>
|
||||
</ul>
|
||||
|
||||
<p>HornetQ Embedded could be used from very simple use cases with only InVM support to very complex cases with clustering, persistence and fail over.</p>
|
||||
<p>ActiveMQ Embedded could be used from very simple use cases with only InVM support to very complex cases with clustering, persistence and fail over.</p>
|
||||
|
||||
<h2>Example step-by-step</h2>
|
||||
<p><i>To run the example, simply type <code>mvn -Pexample</code> from this directory</i></p>
|
||||
<p>In this we don't use any configuration files. (Everything is embedded). We simply instantiate ConfigurationImpl, HornetQServer, start it and operate on JMS regularly</p>
|
||||
<p>In this we don't use any configuration files. (Everything is embedded). We simply instantiate ConfigurationImpl, ActiveMQServer, start it and operate on JMS regularly</p>
|
||||
|
||||
<ol>
|
||||
<li>Create the Configuration, and set the properties accordingly</li>
|
||||
|
@ -33,13 +33,13 @@
|
|||
|
||||
<li>Create and start the server</li>
|
||||
<pre class="prettyprint">
|
||||
HornetQServer server = HornetQ.newHornetQServer(configuration);
|
||||
ActiveMQServer server = ActiveMQ.newActiveMQServer(configuration);
|
||||
server.start();
|
||||
</pre>
|
||||
|
||||
<li>As we are not using a JNDI environment we instantiate the objects directly</li>
|
||||
<pre class="prettyprint">
|
||||
ServerLocator serverLocator = HornetQClient.createServerLocatorWithoutHA(new TransportConfiguration(InVMConnectorFactory.class.getName()));
|
||||
ServerLocator serverLocator = ActiveMQClient.createServerLocatorWithoutHA(new TransportConfiguration(InVMConnectorFactory.class.getName()));
|
||||
ClientSessionFactory sf = serverLocator.createSessionFactory();
|
||||
</pre>
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>HornetQ Twitter Connector Service Example</title>
|
||||
<title>ActiveMQ Twitter Connector Service Example</title>
|
||||
<link rel="stylesheet" type="text/css" href="../../common/common.css" />
|
||||
<link rel="stylesheet" type="text/css" href="../../common/prettify.css" />
|
||||
<script type="text/javascript" src="../../common/prettify.js"></script>
|
||||
|
@ -8,9 +8,9 @@
|
|||
<body onload="prettyPrint()">
|
||||
<h1>Twitter Connector Service Example</h1>
|
||||
|
||||
<p>This example shows you how to configure HornetQ to use the Twitter Connector Service.</p>
|
||||
<p>This example shows you how to configure ActiveMQ to use the Twitter Connector Service.</p>
|
||||
|
||||
<p>HornetQ supports 2 types of Twitter connector, incoming and outgoing.
|
||||
<p>ActiveMQ supports 2 types of Twitter connector, incoming and outgoing.
|
||||
Incoming connector consumes from twitter and forwards to a configurable address.
|
||||
Outgoing connector consumes from a configurable address and forwards to twitter.
|
||||
</p>
|
||||
|
@ -28,7 +28,7 @@
|
|||
<ol>
|
||||
<li>First we need to create a ClientSessionFactory with Netty transport configuration</li>
|
||||
<pre class="prettyprint">
|
||||
<code>csf = HornetQClient.createClientSessionFactory(new TransportConfiguration(NettyConnectorFactory.class.getName()));</code>
|
||||
<code>csf = ActiveMQClient.createClientSessionFactory(new TransportConfiguration(NettyConnectorFactory.class.getName()));</code>
|
||||
</pre>
|
||||
|
||||
<li>We create a core session with auto-commit mode</li>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>HornetQ Vert.x Connector Service Example</title>
|
||||
<title>ActiveMQ Vert.x Connector Service Example</title>
|
||||
<link rel="stylesheet" type="text/css" href="../../common/common.css" />
|
||||
<link rel="stylesheet" type="text/css" href="../../common/prettify.css" />
|
||||
<script type="text/javascript" src="../../common/prettify.js"></script>
|
||||
|
@ -8,9 +8,9 @@
|
|||
<body onload="prettyPrint()">
|
||||
<h1>Vert.x Connector Service Example</h1>
|
||||
|
||||
<p>This example shows you how to configure HornetQ to use the Vert.x Connector Service.</p>
|
||||
<p>This example shows you how to configure ActiveMQ to use the Vert.x Connector Service.</p>
|
||||
|
||||
<p>HornetQ supports 2 types of Vert.x connector, incoming and outgoing.
|
||||
<p>ActiveMQ supports 2 types of Vert.x connector, incoming and outgoing.
|
||||
Incoming connector consumes from Vert.x event bus and forwards to a configurable address.
|
||||
Outgoing connector consumes from a configurable address and forwards to a configurable Vert.x event bus.
|
||||
</p>
|
||||
|
@ -18,8 +18,8 @@
|
|||
<p>In this example, an incoming connector and an outgoing connector are configured. A simple java Verticle
|
||||
is deployed. The verticle registers a message handler on the outgoing connector's address ("outgoing.vertx.address").
|
||||
A String message is sent to Vert.x event bus on the incoming connector's address("incoming.vertx.address").
|
||||
The message then will be forwarded to a HornetQ queue by the incoming connector. The outgoing connector listens to
|
||||
the HornetQ queue and forwards the message from HornetQ to Vert.x event bus on the outgoing connector's address.
|
||||
The message then will be forwarded to a ActiveMQ queue by the incoming connector. The outgoing connector listens to
|
||||
the ActiveMQ queue and forwards the message from ActiveMQ to Vert.x event bus on the outgoing connector's address.
|
||||
The verticle finally receives the message from it's event bus.</p>
|
||||
|
||||
<p>For more information on Vert.x concept please visit the <a href="http://vertx.io/">Vertx site</a></p>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>HornetQ EJB/JMS Transaction Example</title>
|
||||
<title>ActiveMQ EJB/JMS Transaction Example</title>
|
||||
<link rel="stylesheet" type="text/css" href="../../common/common.css" />
|
||||
<link rel="stylesheet" type="text/css" href="../../common/prettify.css" />
|
||||
<script type="text/javascript" src="../../common/prettify.js"></script>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>HornetQ Java EE JCA Configuration Example</title>
|
||||
<title>ActiveMQ Java EE JCA Configuration Example</title>
|
||||
<link rel="stylesheet" type="text/css" href="../../common/common.css" />
|
||||
<link rel="stylesheet" type="text/css" href="../../common/prettify.css" />
|
||||
<script type="text/javascript" src="../../common/prettify.js"></script>
|
||||
|
@ -8,7 +8,7 @@
|
|||
<body onload="prettyPrint()">
|
||||
<h1>Java EE Resource Adapter Configuration Example</h1>
|
||||
|
||||
<p>This example demonstrates how to configure several properties on the HornetQ Resource Adapter. We setup two
|
||||
<p>This example demonstrates how to configure several properties on the ActiveMQ Resource Adapter. We setup two
|
||||
WildFly. The enterprise application is being deployed in one application server while the MDBs and JMS
|
||||
Connections are pointing to a remote server</p>
|
||||
<p>This example is composed of two message-driven beans (MDB), MDBQueueA and MDBQueueB, and a stateless session
|
||||
|
@ -48,8 +48,8 @@
|
|||
|
||||
<li>On the second server we invoke the EJB StatelessSender: This will send 2 messages to server 1 using the configured outbound adapter</li>
|
||||
<pre class="prettyprint">
|
||||
Queue destQueueA = HornetQJMSClient.createQueue("A");
|
||||
Queue destQueueB = HornetQJMSClient.createQueue("B");
|
||||
Queue destQueueA = ActiveMQJMSClient.createQueue("A");
|
||||
Queue destQueueB = ActiveMQJMSClient.createQueue("B");
|
||||
</pre>
|
||||
|
||||
<li>Create a connection to a remote server using a connection-factory we injected. JCA will actually manage this through a <i>connection pool</i></li>
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>HornetQ Java EE JCA Remote Server Configuration Example</title>
|
||||
<title>ActiveMQ Java EE JCA Remote Server Configuration Example</title>
|
||||
<link rel="stylesheet" type="text/css" href="../../common/common.css" />
|
||||
<link rel="stylesheet" type="text/css" href="../../common/prettify.css" />
|
||||
<script type="text/javascript" src="../../common/prettify.js"></script>
|
||||
</head>
|
||||
<body onload="prettyPrint()">
|
||||
<h1>Java EE JCA Resource Adapter Remote Server Configuration Example</h1>
|
||||
<p>This example demonstrates how to configure the Resource adapter to connect to a remote HornetQ server</p>
|
||||
<p>This example demonstrates how to configure the Resource adapter to connect to a remote ActiveMQ server</p>
|
||||
<p>This example is composed of a message driven bean and a client<p>
|
||||
<p>MDBRemoteServerClientExample will send a message to the MDB via a queue and wait for the MDB to send a response via
|
||||
a reply queue</p>
|
||||
|
@ -42,7 +42,7 @@
|
|||
|
||||
<h2>Configuring the outgoing JCA resource adapter</h2>
|
||||
|
||||
<p>The same pooled-connection-factory used for JCA inflow also configures an outgoing JCA connection factory which Java EE components can use to send messages to the same remote HornetQ Server.</p>
|
||||
<p>The same pooled-connection-factory used for JCA inflow also configures an outgoing JCA connection factory which Java EE components can use to send messages to the same remote ActiveMQ Server.</p>
|
||||
<pre class="prettyprint">
|
||||
<pooled-connection-factory name="hornetq-ra-remote">
|
||||
<transaction mode="xa"/>
|
||||
|
@ -106,7 +106,7 @@
|
|||
</pre>
|
||||
<li>The MDB looks up the reply queue</li>
|
||||
<pre class="prettyprint">
|
||||
Queue destQueue = HornetQJMSClient.createQueue("mdbReplyQueue");
|
||||
Queue destQueue = ActiveMQJMSClient.createQueue("mdbReplyQueue");
|
||||
</pre>
|
||||
<li>The MDB creates a connection</li>
|
||||
<pre class="prettyprint">
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>HornetQ JMS Bridge Example</title>
|
||||
<title>ActiveMQ JMS Bridge Example</title>
|
||||
<link rel="stylesheet" type="text/css" href="../../common/common.css" />
|
||||
<link rel="stylesheet" type="text/css" href="../../common/prettify.css" />
|
||||
<script type="text/javascript" src="../../common/prettify.js"></script>
|
||||
|
@ -11,7 +11,7 @@
|
|||
<p>This example shows how to configure and run a JMS Bridge in WildFly.<br />
|
||||
A bridge receives messages from a <em>source</em> JMS destination and forwards them to a <em>target</em> destination.</p>
|
||||
<p>The source and target destinations can be on different servers, even from different JMS providers. For example, you can use this
|
||||
JMS Bridge to bridge a legacy JMS provider to HornetQ during migration.</p>
|
||||
JMS Bridge to bridge a legacy JMS provider to ActiveMQ during migration.</p>
|
||||
|
||||
<p>This example will show how to configure and run the simplest bridge:</p>
|
||||
<ul>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>HornetQ Java EE Injected JMSContext Example</title>
|
||||
<title>ActiveMQ Java EE Injected JMSContext Example</title>
|
||||
<link rel="stylesheet" type="text/css" href="../../common/common.css" />
|
||||
<link rel="stylesheet" type="text/css" href="../../common/prettify.css" />
|
||||
<script type="text/javascript" src="../../common/prettify.js"></script>
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<html>
|
||||
<head>
|
||||
<title>HornetQ Java EE MDB Bean Managed Transaction Example</title>
|
||||
<title>ActiveMQ Java EE MDB Bean Managed Transaction Example</title>
|
||||
<link rel="stylesheet" type="text/css" href="../../common/common.css" />
|
||||
<link rel="stylesheet" type="text/css" href="../../common/prettify.css" />
|
||||
<script type="text/javascript" src="../../common/prettify.js"></script>
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue