我在上一章节中,给大家介绍了JMS协议及消息中间件,消息队列等概念,本节中我会介绍ActiveMQ的概念及其环境配置。
Apache ActiveMQ ™ is the most popular and powerful open source messaging and Integration Patterns server.
Apache ActiveMQ is fast, supports many Cross Language Clients and Protocols,
comes with easy to use Enterprise Integration Patterns and many advanced features while fully supporting JMS 1.1 and J2EE 1.4.
ActiveMQ是由Apache出品的,一款流行的,能力强劲的开源消息总线,ActiveMQ实现了JMS消息协议。ActiveMQ是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,它非常快速,支持多种语言的客户端和协议,而且可以非常容易的嵌入到企业的应用环境中,并有许多高级功能。
1️⃣.多种语言和协议编写客户端.
语言: Java, C, C++, C#, Ruby, Perl, Python, PHP。
应用协议: OpenWire,Stomp REST,WS Notification,XMPP,AMQP;
2️⃣.完全支持JMS1.1和J2EE 1.4规范 (持久化,XA消息,事务);
3️⃣.对Spring的支持,ActiveMQ可以很容易内嵌到使用Spring的系统里面去,而且也支持Spring2.0的特性;
4️⃣.通过了常见J2EE服务器(如 Geronimo,JBoss 4,GlassFish,WebLogic)的测试,其中通过 JCA 1.5 resource adaptors的配置,可以让ActiveMQ可以自动的部署到任何兼容J2EE1.4商业服务器上;
5️⃣.支持多种传送协议:in-VM,TCP,SSL,NIO,UDP,JGroups,JXTA;
6️⃣.支持通过JDBC和journal提供高速的消息持久化;
7️⃣.从设计上保证了高性能的集群,客户端-服务器,点对点;
8️⃣.支持Ajax;
9️⃣.支持与Axis的整合;
.可以很容易得调用内嵌JMS provider,进行测试.
1️⃣.多个项目之间集成
(1) 跨平台;
(2) 多语言;
(3) 多项目.
2️⃣.降低系统间模块的耦合度,解耦;
3️⃣. 流量削峰。
P2P (点对点)消息域使用 queue 作为 Destination,消息可以被同步或异步的发送和接收,每个消息只会给一个 Consumer 传送一次。
Pub/Sub(发布/订阅,Publish/Subscribe)消息域使用 topic 作为 Destination,发布者向 topic 发送消息,订阅者注册接收来自 topic 的消息。
发送到 topic 的任何消息都将自动传递给所有订阅者。接收方式(同步和异步)与 P2P 域相同。
官方网站:
http://activemq.apache.org/
下载后解压缩.
大家下载好之后,将apache-activemq-5.11.1-bin.zip解压缩,我们可以看到它的整体目录结构:
ActiveMQ目录结构介绍:
我们了解ActiveMQ的基本目录,下面我们运行一下ActiveMQ服务,双击bin目录下的activemq.bat脚本文件或运行自己电脑版本下的activemq.bat,就可以看下图的效果.
从上图我们可以看到ActiveMQ的存放地址,以及浏览器要访问的地址.
ActiveMQ默认使用的TCP连接端口是61616,通过查看该端口的信息可以测试ActiveMQ是否成功启动.
C:\Documents and Settings\Administrator>netstat -an|find "61616"
TCP 0.0.0.0:61616 0.0.0.0:0 LISTENING
ActiveMQ默认启动时,启动了内置的jetty服务器,提供一个用于监控ActiveMQ的admin应用.
admin:admin 用户名和密码默认都是admin。
ActiveMQ主界面简介:
若要停止ActiveMQ服务器,只需要按着Ctrl+Shift+C,之后输入y即可.
解决方法:创建一个消息状态表,通俗来说就是一个账本,用来记录消息的处理状态。在每次处理消息之前,都去状态表中查询一次,如果已经有相同的消息存在,那么就不处理,这样可以防止重复发送。
解决方案:进行消息持久化【比如对消息数据进行持久化JDBC,AMQ(日志文件),KahaDB和LevelDB】,或者对非持久化的消息及时处理不要堆积,或者启动事务,启动事务后,commit()方法会负责的等待服务器的返回,也就不会关闭连接导致消息丢失了。
默认的情况下,非持久化的消息是异步发送的,持久化的消息是同步发送的,遇到慢一点的硬盘,发送消息的速度是无法忍受的。但是在开启事务的情况下,消息都是异步发送的,效率会有2个数量级的提升。所以在发送持久化消息时,请务必开启事务模式。其实发送非持久化消息时也建议开启事务,这并不会影响性能。
这得从ActiveMQ的储存机制说起。在通常的情况下,非持久化消息是存储在内存中的,持久化消息是存储在文件中的。但是,当非持久化消息堆积到一定的程度,内存告急的时候,ActiveMQ会将内存中的非持久化消息写入临时文件中,以腾出内存。虽然都保存到了文件里,但它和持久化消息的区别是,重启后持久化消息会从文件中恢复,非持久化的临时文件会直接删除。