您的位置:首页 > 运维架构 > Apache

Apache ActiveMQ 官方文档中文版

2017-02-07 00:00 375 查看

1 前言

Apache ActiveMQ™是最流行和功能强大的开源消息传递和集成模式服务器。
Apache ActiveMQ速度快,支持许多跨语言客户端和协议,具有易于使用的企业集成模式许多高级功能,同时完全支持JMS 1.1和J2EE 1.4。 Apache ActiveMQ是根据Apache 2.0许可证发布的。
自己赶紧下载一个吧,尝试我们的入门指南,浏览我们的常见问题开始贡献或加入我们的 讨论论坛

1.1 ActiveMQ特点

1 支持来自Java,C,C ++,C#,Ruby,Perl,Python,PHP的各种跨语言客户端和协议
a)支持Java,C,C ++,C#等高性能客户端。
b) 支持Stomp ,使客户端可以轻松地在C,Ruby,Perl,Python,PHP,ActionScript / Flash,
Smalltalk以及任何其他流行的Message Broker中跟ActiveMQ对话。
c) 支持AMQP v1.0
d) 支持MQTT v3.1,允许在IoT环境中进行连接。
2 完全支持JMS客户端和Message Broker中的企业集成模式
3 支持许多高级功能,如消息组虚拟目标通配符组合目标
4 完全支持JMS 1.1和J2EE 1.4,支持瞬态,持久,事务和XA消息传递
5支持Spring,使ActiveMQ可以轻松地嵌入到Spring应用程序中并使用Spring 的XML配置机制进行配置
6 在流行的J2EE服务器(如TomEEGeronimo,JBoss,GlassFish和WebLogic)中测试
a) 包括用于入站和出站消息的JCA 1.5资源适配器,以便ActiveMQ应在任何符合J2EE 1.4的服务器中自动部署
7 支持可插拔传输协议,如VM,TCP,SSL,NIO,UDP,多播,JGroups和JXTA传输
8 支持使用JDBC和高性能日志的快速持久性
9 专为高性能集群,客户端 - 服务器,基于对等体的通信设计
10 REST API提供技术无关性和语言中立的基于Web的API到消息传递
11 Ajax支持使用纯DHTML的Web浏览器的Web流支持,从而允许Web浏览器成为消息架构的一部分
12 CXF和Axis支持,以便ActiveMQ可以轻松地放入这些Web服务堆栈中的任一个以提供可靠的消息传递
13 可作为一个在内存中的JMS提供者,是单元测试JMS的理想选择

2 正文

2.1 Apache ActiveMQ特性

Apache ActiveMQ包装了功能;你可以通过功能概述来获取一些思路,或者查看下面所有的主要功能的列表...

2.1.1 活动组

活动组是一个动态协作框架,因此简化了消息传递和组成员之间的共享状态。它在ActiveMQ 6.0中可用。
活动组包括以下内容:
1)动态成员信息
2)广播消息
3)点对点
4)在框中
5)分布式状态(Map)
6)监听分布式状态更改
7)写锁
8)锁定到期
9)当成员离开时可选状态和锁定删除
10)自动状态、锁复制和故障转移
11)可配置心跳
活动组(Active Group)只是基于对等体的协作 - 尽管底层传输是JMS(也可以是基于对等体)。 虽然可以使用任何JMS提供的程序,活动组(Active Group)可以使用通过ActiveMQ可用的成员资格信息来补充其心跳基础结构。

2.1.2 实时 ActiveMQ (ActiveMQ Real Time)

ActiveMQ Real Time是流行的Apache ActiveMQ消息系统的子项目,是专门设计用于满足低延迟高吞吐量协作实时应用程序的需求。
它被设计为使用在不同平台、不同语言上使用 - 并有三个主要目标:
1 低延迟可插拔可靠多播 - 具有不同的服务质量。 群通信的复杂性意味着必须使用不同的可靠多播协议来满足实时应用协作的需要。 ActiveBlaze支持可插入协议,包括:
NACK的可靠协议
图腾协议
前向纠错
2 活动组成员资格管理,以允许真正的点对点通信和组消息传递
3 共享状态,容错,可靠性和可用性的集群管理。
对低延迟的需求意味着JMS(Java消息服务)API并不总是合适的,并且ActiveBlaze具有其自己的定制API以实现非常高的吞吐量。 该项目的目标是在核心ActiveBlaze API的顶部提供可选的JMS API层,以使其成为替代更传统的中心和辐射消息传递部署的一个替代品。
要启用跨语言支持,启用有线格式的版本控制,并帮助快速的吞吐量 - Apache ActiveBlaze建立在谷歌的protobuf的基础上 - 高效编码可扩展的数据结构的框架。

2.1.2.1 特性预览

2.1.2.1.1 低延迟可靠多播

此部分没有内容

2.1.2.1.2 组成员资格

支持动态加入和离开组,成员通知和真正的点对点和队列消息传递:
a) 动态成员信息
b) 广播消息
c) 点对点
d) 在框中
e) 可配置心跳

2.1.2.1.3 集群管理

分布式状态图,具有以下内容:
a) 分布式状态(Map) b) 地图更改侦听器
c) 写锁
d) 锁定到期
e) 当成员离开时可选状态和锁定删除
f) 自动状态和锁复制和故障转移

2.1.2.1.4 更多详情…

a) 广播
b) 组成员资格
c) 生命周期
d) ActiveBlaze消息类型

2.1.2.2 广播

ActiveBlaze为快速,可靠的对等消息传递提供基础设施,以满足高性能和协作应用的需求。
使用通道的基本构造块,存在用于不同问题域的功能层级,每个层级是前一层的超级集合。
BlazeChannel支持在主题上广播 - 使用可靠的多播或点播。
要使用BlazeChannel从工厂创建一个:

import  org.apache.activeblaze.*;
...
BlazeChannelFactory  factory  =  new  BlazeChannelFactory();
BlazeChannel  sender  =  factory.createChannel();
//start  the  channel  and  send  a  message
sender.start();

String  destination  =  "foo.bar";
BlazeMessage  msg  =  new  BlazeMessage("test  payload");
sender.broadcast(destination,msg);
//shutdown  the  sender
sender.shutDown();


您可以使用侦听器类似地订阅主题消息

BlazeChannel  receiver  =  factory.createChannel();
receiver.start();

//add  a  listener

receiver.addBlazeTopicMessageListener(destination,  new  BlazeMessageListener()  {
public  void  onMessage(BlazeMessage  msg)  {
System.out.println("Got  a  msg:  "  +  msg);
}
});

receiver.shutDown();


2.1.2.3 组成员资格

ActiveBlaze使用GroupChannel支持组成员身份,GroupChannel可以从GroupChannelFactory创建。
您必须明确说明您要加入/离开哪个群组,并且您可以加入多个群组。
每个GroupChannel都有一个全局唯一的ID和一个名称。

import  org.apache.activeblaze.group.*;

...
BlazeGroupChannelFactory  factory  =  new  BlazeGroupChannelFactory();

BlazeGroupChannel  channel  =  factory.createGroupChannel("My  Channel");
//join  a  group
channel.addToGroup("test");
channel.start();

//listen  for  other  members

channel.addMemberChangedListener(new  MemberChangedListener(){

public  void  memberStarted(Member  member)  {
System.out.println("Member  started");
}

public  void  memberStopped(Member  member)  {
System.out.println("Member  stopped");
}
});


2.1.2.4 生命周期

2.1.2.4.1 通道生命周期

Blaze通道处于以下五种状态之一:

2.1.2.4.1.1 构造 - 通道未初始化或已关闭

此部分没内容

2.1.2.4.1.2 初始化(initialized)

您可以通过调用其init()方法显式初始化一个通道。 此时,其配置已设置:

BlazeChannelFactory  factory  =  new  BlazeChannelFactory();
BlazeChannel  channel  =  factory.createChannel();
channel.init();


2.1.2.4.1.3 启动(started)

这将隐式地初始化该信道并开始该信道与其对等体的基础通信:

BlazeChannelFactory  factory  =  new  BlazeChannelFactory();
BlazeChannel  channel  =  factory.createChannel();
channel.start();


2.1.2.4.1.4 停止(stopped)

这将停止通信 - 但是您能够在后一点重新启动通道:

BlazeChannelFactory  factory  =  new  BlazeChannelFactory();
BlazeChannel  channel  =  factory.createChannel();
channel.start();


2.1.2.4.1.5 关闭(shut down)

这将隐式调用stop() - 并解除构建的通道。 可以再次重新初始化信道,并且建议将配置改成channel(它会被关闭并重新启动)。

BlazeChannelFactory  factory  =  new  BlazeChannelFactory();
BlazeChannel  channel  =  factory.createChannel();
channel.shutDown();
//  change  the  congiguration
channel.getConfiguration().setBroadcastURI("tcp://localhost:60661");
//re-start
channel.start();


2.1.2.5 ActiveBlaze消息类型

ActiveBlaze中消息和事件解析的基础是BlazeMessage。
BlazeMessage是一个键值对的映射,其中键是字符串,值是基本对象。
支持的值为:
a) byte字节
b) bytes [] 数组
c) char
d) short
e) int
f) long
g) float
h) doble
i) map(支持递归)
您可以通过其默认构造函数创建BlazeMessage - 例如:

import  org.apache.activeblaze.*;
...

BlazeMessage  msg  =  new  BlazeMessage();
msg.setFloatValue("rate",0.94f);


有几个实用程序方法支持传递标准对象 - 例如:

import  org.apache.activeblaze.*;
...

BlazeMessage  msg  =  new  BlazeMessage("test  string");
String  text  =  msg.getText();

BlazeMessage  msg  =  new  BlazeMessage();
msg.setText("test  string");
String  text  =  msg.getText();

...

byte[]  data  =  getSomeData();
BlazeMessage  msg  =  new  BlazeMessage(data);
byte[]  result   =  msg.getBytes();

BlazeMessage  msg  =  new  BlazeMessage();
msg.setBytes("data);
byte[]  result  =  msg.getData();

...

Date  date  =  new  Date();
BlazeMessage  msg  =  new  BlazeMessage(date);
Date  result  =  msg.getObject();

BlazeMessage  msg  =  new  BlazeMessage();
msg.setObject(date);
Object  result  =  msg.getObject();


2.1.3 Camel 组件提供商

2.1.3.1 从ActiveMQ 5.9起可用.

Apache Camel嵌入到ActiveMQ代理为使用Camel的集成功能扩展消息代理提供了极大的灵活性。如果您使用activemq组件,Apache Camel路由还有利于避免连接到ActiveMQ的远程串行化以及网络成本。
但是,如果您想要更改流经ActiveMQ消息代理本身的消息的行为,您将被限制到已发送的一组ActiveMQ代理拦截器 - 或者开发您自己的Broker插件,然后将其作为一个jar引入到类路径 ActiveMQ代理。 代理Camel组件使这更容易。 它在通过代理本身移动时拦截消息,允许它们在被持久化到消息存储器或传递给最终消费者之前被修改和操纵。
例如,通过定义一个在JVM中运行的CamelContext代理,代理组件可以拦截发布到主题的所有消息,并将它们发布到队列,改变它们的优先级:

<route  id="setPriority">
<from  uri="broker:topic:test.broker.>"/>
<setHeader  headerName="JMSPriority">
<constant>9</constant>
</setHeader>
<to  uri="broker:queue:test.broker.component.queue"/>
</route>


[注意]:
1) 代理组件只在代理启动时向代理添加拦截 - 因此代理组件不会在运行的代理使用之前向其添加任何开销 - 然后开销将很小。
2) 当代理已经接收到代理时,但在它们被处理(持久或路由到目的地)之前,代理组件拦截消息。
3) Exchange上的IN消息是CamelMessage,但也是JMS消息(通过ActiveMQ从STOMP / MQTT / AMQP等路由的消息始终转换为JMS消息)。
4) 通配符可以在目标上使用,以拦截来自匹配通配符的目标的邮件。
5) 拦截之后,您必须显式地将消息发送回代理组件 - 这允许您删除选择消息(通过不发送),或者,像在上面的情况下 - 重新路由消息到不同的目的地。
提示:只有拦截的消息可以发送到代理组件。 例如,假如从一个文件组件路由过来的一个Camel 消息,将会导致错误。
在activemq-broker包中已添加了额外的类以支持代理组件。 它们允许在不使用JMX的情况下查询运行中的代理的状态。 这些类是:
1) MessageBrokerView - 提供在代理上检索统计信息的方法
2) 从MessageBrokerView - 您可以检索特定目的地的BrokerDestinationView。

2.1.3.2 例子

当目标的队列深度达到某个限制时,如何路由邮件:当目标的队列深度达到某个限制时,如何路由邮件:

<camelContext  id="camel"  trace="false"  xmlns=<a target="_blank" href="http://camel.apache.org/schema/spring">></a>
<route  id="routeAboveQueueLimitTest">
<from  uri="broker:queue:test.broker.queue"/>
<choice>
<when>
<spel>#{@destinationView.queueSize  >=  100}</spel>
<to  uri="broker:queue:test.broker.processLater"/>
</when>
<otherwise>
<to  uri="broker:queue:test.broker.queue"/>
</otherwise>
</choice>
</route>
</camelContext>

<bean  id="brokerView"  class="org.apache.activemq.broker.view.MessageBrokerView">
<constructor-arg  value="testBroker"/>
</bean>
<bean  id="destinationView"  factory-bean="brokerView"  factory-method="getDestinationView">
<constructor-arg  value="test.broker.component.route"/>
</bean>


这是使用Camel Camel消息路由器模式。 注意在when子句中使用Spring表达式语言。

2.1.4 聚类

聚类是一个大主题,通常意味着不同的人不同的东西。 我们将尝试列出聚类的各个方面以及它们如何与ActiveMQ相关。

2.1.4.1 队列使用者集群

ActiveMQ支持跨消费者的队列上的消息的可靠高性能负载平衡。 在企业集成中,这种情况被称为竞争消费者模式。 下图说明了这个概念:



该解决方案接收由生产者发送的消息,将它们排队并在所有注册的消费者之间分发它们。这有很多好处:
1) 负载以非常动态的方式分布。可以在高负载时段中配置和附加到队列的附加消费者,而不修改队列中的任何配置,因为新消费者将表现为只是另一个竞争消费者。
2) 比使用负载平衡器的系统更好的可用性。负载平衡器通常依靠监视系统来找出哪些真实服务器不可用。对于竞争消费者,失败的消费者不会竞争消息,因此即使没有监控,消息也不会传递给消费者。
3) 高可靠性,如果消费者失败,任何未确认的消息被重新传递给队列上的其他消费者。
不利的一面是,这种模式可能不是理想的系统中需要订单处理。为了缓解这个问题,同时保持好处,竞争消费者模式应该与其他ActiveMQ功能结合使用,如ActiveMQ常见问题中所述的独占消费者消息组

2.1.4.2 代理集群

在JMS上下文中聚类的最常见的模型是有一个JMS代理的集合,JMS客户端将连接到它们中的一个;那么如果JMS代理断开,它将自动重新连接到另一个代理。
我们在JMS客户端中使用failover://协议来实现这一点。有关如何配置故障转移协议的详细信息,请参阅“故障转移传输参考”页。注意:ActiveMQ 3.x中的可靠://协议现在已更改为failover://协议
如果我们只在网络上运行多个代理,并使用静态发现动态发现告诉客户端它们,那么客户端可以轻松地从一个代理故障转移到另一个。然而,一个代理不知道其他代理的消费者;因此如果在某个代理上没有消费者,则消息可以仅仅堆积而不被消费。我们有一个突出的功能请求来解决这个问题在客户端 - 但目前解决这个问题是创建一个代理网络来存储和在代理之间转发消息。

2.1.4.3 发现代理(Broker clusters)

我们支持使用静态发现或动态发现来自动发现代理,因此客户端可以自动检测并连接到一个逻辑代理组中的代理,以及代理发现和连接到其他代理以形成大型网络。

2.1.4.4 网络代理(Networks of brokers)

如果您使用客户端/服务器或中心/辐条式拓扑,并且您有许多客户端和许多代理,则有一个代理有生产者但没有消费者的机会,因此消息堆积而不进行处理。 为了避免这种情况,ActiveMQ支持Brokers网络,它提供存储和转发,以便将消息从生产者到代理与消费者之间移动,这使我们能够跨代理网络支持分布式队列和主题。
这允许客户端连接到任何代理 - 如果出现故障,则故障切换到另一个代理 - 从客户端角度提供一组代理。
网络代理还使我们能够扩展到网络中的大量客户,因为我们可以运行与我们需要的许多代理。
您可以将其视为与具有自动故障转移和发现的代理集群连接的客户端集群,从而构成一个简单易用的消息传送结构。

2.1.4.5 主从(Master Slave)

在网络中运行大量独立代理或代理的问题是,消息在任何时间点都由单个物理代理拥有。 如果该代理断开,您必须等待它重新启动,然后才能发送消息。 (如果您使用非持久消息传递和代理关闭,您通常会丢失您的消息)。
MasterSlave背后的理念是将消息复制到从属代理,以便即使主机的机器,文件系统或数据中心发生灾难性的硬件故障,也能立即进行故障切换,而不会丢失任何消息。

2.1.4.6 消息存储复制(Replicated Message Stores)

MasterSlave的一个替代方法是有一些方法来复制消息存储; 所以要以某种方式共享磁盘文件。 例如,使用SAN或共享网络驱动器,您可以共享代理的文件,以便如果失败,另一个代理可以立即接管。
因此,通过支持复制消息存储,您可以减少消息丢失的风险,以提供HA备份或能够在数据中心故障时保持活动的完整DR解决方案。

2.1.4.7 主/从介绍(Introduction to Master / Slave)

以下是可用的不同类型的主/从配置:

主从类型要求优点缺点
共享文件系统主从共享文件系统(如SAN)根据需要运行多个从站。 自动恢复旧主需要共享文件系统
JDBC主从设备共享数据库根据需要运行多个从站。 自动恢复旧主需要共享数据库。 也比较慢,因为它不能使用高性能日志
复制的LevelDB存储ZooKeeper服务器根据需要运行多个从站。 自动恢复旧主。 非常快。需要ZooKeeper服务器。
如果您使用共享网络文件系统(如SAN),我们建议使用共享文件系统主从。 如果你乐意放弃高性能日志,并且使用纯JDBC作为持久化引擎,那么你应该使用JDBC主从设备。 对于那些愿意尝试新技术的人来说,复制LevelDB存储提供的速度类似于SAN解决方案,而无需设置高可用性的共享文件系统。
------------------------------------------------------------------------------------------------------------------------- http://activemq.apache.org/features.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: