概述
首先简单的介绍一下MQ,MQ英文名MessageQueue,中文名也就是大家用的消息队列,干嘛用的呢,说白了就是一个消息的接受和转发的容器,可用于消息推送。
ActiveMQ是Apache所提供的一个开源的消息系统,完全采用Java来实现,因此,它能很好地支持J2EE提出的JMS(Java Message Service,即Java消息服务)规范。JMS是一组Java应用程序接口,它提供消息的创建、发送、读取等一系列服务。JMS提供了一组公共应用程 序接口和响应的语法,类似于Java数据库的统一访问接口JDBC,它是一种与厂商无关的API,使得Java程序能够与不同厂商的消息组件很好地进行通 信。
JMS支持两种消息发送和接收模型。一种称为P2P(Ponit to Point)模型,即采用点对点的方式发送消息。P2P模型是基于队列的,消息生产者发送消息到队列,消息消费者从队列中接收消息,队列的存在使得消息的 异步传输称为可能,P2P模型在点对点的情况下进行消息传递时采用。
另一种称为Pub/Sub(Publish/Subscribe,即发布-订阅)模型,发布-订阅模型定义了如何向一个内容节点发布和订阅消息,这 个内容节点称为topic(主题)。主题可以认为是消息传递的中介,消息发布这将消息发布到某个主题,而消息订阅者则从主题订阅消息。主题使得消息的订阅 者与消息的发布者互相保持独立,不需要进行接触即可保证消息的传递,发布-订阅模型在消息的一对多广播时采用。
ActiveMQ的安装
ActiveMQ的安装比较简单,解压即可。我下载的版本是apache-activemq-5.13.3-bin.zip。这是windows下的版本,也有linux版本提供下载.
官方网站:http://activemq.apache.org/
解压后的目录结构为
从它的目录来说,还是很简单的:
--bin存放的是脚本文件
--conf存放的是基本配置文件
--data存放的是日志文件
--docs存放的是说明文档
--examples存放的是简单的实例
--lib存放的是activemq所需jar包
--webapps用于存放项目的目录
启动ActiveMQ
- 进入到C:\apache-activemq-5.13.3\bin\win32(我的电脑是32位的win7,所以进到win32这个目录)
- 运行批处理命令activemq.bat(用命令行运行比较好,有异常会停留在黑窗,如果双击运行一旦有异常窗口会自动关闭)
我们发现报以下异常
Failed to start Apache ActiveMQ ([localhost, ID:winner_0715-PC-49825-1467734408129-0:1], java.net.URISyntaxExcept ion: Illegal character in hostname at index 11: ws://winner_0715-PC:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600)
发现这边的winner_0715-PC正好是我的机器名异常描述大概意思是有不合法的字符,打开conf目录下的activemq.xml文件,发现有以下配置:
<transportConnectors> <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB --> <transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> <transportConnector name="amqp" uri="amqp://0.0.0.0:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> <transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> <transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> </transportConnectors>
把这些配置中的ip改为127.0.0.1,如下:
<transportConnectors> <!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB --> <transportConnector name="openwire" uri="tcp://127.0.0.1:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> <transportConnector name="amqp" uri="amqp://127.0.0.1:5672?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> <transportConnector name="stomp" uri="stomp://127.0.0.1:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> <transportConnector name="mqtt" uri="mqtt://127.0.0.1:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> <transportConnector name="ws" uri="ws://127.0.0.1:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/> </transportConnectors>
再启动就成功了,怀疑是因为C:\Windows\System32\drivers\etc\hosts文件中未配置0.0.0.0对应的域名导致程序会使用默认的主机名,而域名是不能下划线导致的。
3. 测试
ActiveMQ默认使用的TCP连接端口是61616, 通过查看该端口的信息可以测试ActiveMQ是否成功启动 netstat -an|find “61616”
4. 监控
ActiveMQ默认启动时,启动了内置的jetty服务器,提供一个用于监控ActiveMQ的admin应用。
admin:http://127.0.0.1:8161/admin/
用户名和密码都是admin
5. 至此,服务端启动完毕
停止服务器,只需要按着Ctrl+Shift+C,之后输入y即可。
我们简单说说ActiveMQ特性,网上很多,只是为了保证博文的完整。
ActiveMQ特性列表
- 多种语言和协议编写客户端。语言: Java, C, C++, C#, Ruby, Perl, Python, PHP。应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP
- 完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务)
- 对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性
- 通过了常见J2EE服务器(如 Geronimo,JBoss 4, GlassFish,WebLogic)的测试,其中通过JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE 1.4 商业服务器上
- 支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA
- 支持通过JDBC和journal提供高速的消息持久化
- 从设计上保证了高性能的集群,客户端-服务器,点对点
- 支持Ajax
- 支持与Axis的整合
- 可以很容易得调用内嵌JMS provider,进行测试
- 什么情况下使用ActiveMQ?
- 多个项目之间集成
(1) 跨平台
(2) 多语言
(3) 多项目 - 降低系统间模块的耦合度,解耦
(1) 软件扩展性 - 系统前后端隔离
(1) 前后端隔离,屏蔽高安全区