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万以上/秒。