ActiveMQ是Apache软件基金下的一个开源软件,它遵循JMS规范(Java Message Service),是消息驱动中间件软件(MOM)。它为企业消息传递提供高可用,出色性能,可扩展,稳定和安全保障。

基本概念

1、Broker,消息代理,表示消息队列服务器实体,接受客户端连接,提供消息通信的核心服务。

2、Producer,消息生产者,业务的发起方,负责生产消息并传输给 Broker 。

3、Consumer,消息消费者,业务的处理方,负责从 Broker 获取消息并进行业务逻辑处理。

4、Topic,主题,发布订阅模式下的消息统一汇集地,不同生产者向 Topic 发送消息,由 Broker 分发到不同的订阅者,实现消息的广播。

5、Queue,队列,点对点模式下特定生产者向特定队列发送消息,消费者订阅特定队列接收消息并进行业务逻辑处理。

6、Message,消息体,根据不同通信协议定义的固定格式进行编码的数据包,来封装业务 数据,实现消息的传输。

主要特点

1、多种语言和协议编写客户端。语言: Java, C, C++, C#, Ruby, Perl, Python, PHP。应用协议: OpenWire,Stomp REST,WSNotification,XMPP,AMQP

2、完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务)

3、对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性

4、通过了常见J2EE服务器(如 Geronimo,JBoss 4,GlassFish,WebLogic)的测试,其中通过JCA 1.5resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上

5、支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA

6、支持通过JDBC和journal提供高速的消息持久化

7、从设计上保证了高性能的集群,客户端-服务器,点对点

8、支持Ajax

9、支持与Axis的整合

10、可以很容易得调用内嵌JMS provider,进行测试

因为java编写可见对java使用还是很友好的。

ActiveMQ的安装

进入http://activemq.apache.org/ 下载ActiveMQ。

安装环境:

1、需要jdk
2、安装Linux系统。生产环境都是Linux系统。

安装步骤

第一步: 把ActiveMQ 的压缩包上传到Linux系统。
第二步:解压缩。
第三步:启动。

使用bin目录下的activemq命令

启动:[root@localhost bin]# ./activemq start

关闭:[root@localhost bin]# ./activemq stop

查看状态:

[root@localhost bin]# ./activemq status

进入管理后台:

http://192.168.25.168:8161/admin

用户名:admin
密码:admin

ActiveMQ类别及开发流程

1、Point-to-Point (点对点)消息模式开发流程 :

  • 生产者(producer)开发流程(ProducerTool.java): 
    • 创建Connection: 根据url,user和password创建一个jms Connection。 
    • 创建Session: 在connection的基础上创建一个session,同时设置是否支持事务和ACKNOWLEDGE标识。 
    • 创建Destination对象: 需指定其对应的主题(subject)名称,producer和consumer将根据subject来发送/接收对应的消息。 
    • 创建MessageProducer: 根据Destination创建MessageProducer对象,同时设置其持久模式。 
    • 发送消息到队列(Queue): 封装TextMessage消息,使用MessageProducer的send方法将消息发送出去。 
  • 消费者(consumer)开发流程(ConsumerTool.java): 
    • 实现MessageListener接口: 消费者类必须实现MessageListener接口,然后在onMessage()方法中监听消息的到达并处理。 
    • 创建Connection: 根据url,user和password创建一个jms Connection,如果是durable模式,还需要给connection设置一个clientId。  - 创建Session和Destination: 与ProducerTool.java中的流程类似,不再赘述。 
    • 创建replyProducer【可选】:可以用来将消息处理结果发送给producer。 
    • 创建MessageConsumer:  根据Destination创建MessageConsumer对象。 
    • 消费message:  在onMessage()方法中接收producer发送过来的消息进行处理,并可以通过replyProducer反馈信息给producer 

2、当然还是支持发布/订阅的广播模式。

  • Producer

    • 创建ConnectionFactory对象,需要指定服务端ip及端口号。
    • 使用ConnectionFactory对象创建一个Connection对象。
    • 开启连接,调用Connection对象的start方法。
    • 使用Connection对象创建一个Session对象。
    • 使用Session对象创建一个Destination对象(topic、queue),此处创建一个Topic对象。
    • 使用Session对象创建一个Producer对象。
    • 创建一个Message对象,创建一个TextMessage对象。
    • 使用Producer对象发送消息。
    • 关闭资源。
  • Consumer消费者:接收消息。

    • 创建一个ConnectionFactory对象。
    • 从ConnectionFactory对象中获得一个Connection对象。
    • 开启连接。调用Connection对象的start方法。
    • 使用Connection对象创建一个Session对象。
    • 使用Session对象创建一个Destination对象。和发送端保持一致topic,并且话题的名称一致。
    • 使用Session对象创建一个Consumer对象。
    • 接收消息。
    • 打印消息。
    • 关闭资源

基本就是这两种使用方式。我们可以使用golang来编写生产者和消费者,使用现成的库,然后当着一个mq来传递数据即可。这也是我们最常使用,跨语言进行使用。使得业务和技术实现解耦,也是我们所说的中间件的概念。这样可以跨语言来使用优秀的开源产品,只要知道原理,使用方法,就可以直接使用。其他的mq比如kafka,也是这么个使用道理。所以要理解架构才是道理。

性能

ActiveMQ,在赛扬(2.40GHz)机器上能够达到2000/s,消息大小为1-2k。好一些的服务器可以达到2万以上/秒。