求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Modeler   Code  
会员   
 
  
 
 
     
   
分享到
activemq的消息存储机制
 

发布于2013-4-25

 

ctiveMQ是当下最流行和强大的开源企业消息集成组件。

ActiveMQ性能优良,支持多种跨语言的客户端和协议,支持JMS1.1和J2EE1.4,易于使用并且特性多多。

ActiveMQ基于Apache 2.0 License软件协议。

当前最新版本为5.2.0

最新特性

  • 多语言多协议支持,Java、C、C++、C#可以通过OpenWire协议编写高效的客户端;
  • Stomp协议的支持使得我们可以用Ruby、Perl、Python、AS等等语言方便的编写客户端程序。
  • 通过集成Apache Camel 库,中间件和客户端可以完全支持Enterprise Integration Patterns(企业集成模式)
  • 支持许多高级特性如:消息群组(Message Groups)、虚拟端点(Virtual Destinations)、通配符(Wildcards)、复合端点(Composite Destinations)等
  • 完全支持JMS1.1和J2EE1.4规范包括对临时、持久、XA事务消息的支持
  • spring支持JMS规范,所以Acticemq可以集成到spring,集中管理。
  • 在支持J2EE1.4规范的多个流行J2EE服务器上通过测试。
  • 可插拔的传输协议支持 比如:in-VM, TCP, SSL, NIO, UDP, multicast, JGroups and JXTA transports
  • 支持超快的JDBC消息持久化和高效的日志系统
  • 为高效服务集群、客户服务机、基于点通信系统而设计。
  • REST-ful支持。
  • Ajax支持。
  • 对CXF和Axis的支持可以帮助Activemq通过web service来提供可靠的消息服务。
  • 等等。。。

ActiveMq5.2.0 对JDK的要求是 JDK 5 and later。如果要搭建MQ服务,那么在目标机器上必须设置JAVA_HOME变 量,指向JDK的安装目录。

依赖:

要正常使用ActiveMq的功能至少需要activemq-core.jar、commons-logging.jar、J2EE API。

AMQ Message Store 是什么?

默认的activemq消息存储是通过一个所谓的AMQ Message Store来完成。

AMQ Message Store是一个高效的可嵌入支持事务的消息存储解决方案。

在此方案下消息(Message)本身以日志的形式实现持久化,存放在Data Log里。并且还对日志里的消息做了引用索引,方便快速取回Message。

一般情况下消息索引存放于内存(Cache)中,MQ Server定期将索引内容持久化,存放到Reference Store。

Message Data Log文件是有容量限制的,默认是32MB,可自行配置容量。当该Data Log文件里所有消息都被消费完的时候,Data Log文件就会被加上一个标记,通知下一次消息清理时可以被处理掉(处理方式可以是delete或是转移到Achieve目录)。

AMQ Message Store方案中 Cache 、Data Log、Reference Store 协作图如下:

AMQ Message Store的属性是可以配置的,你可以在conf/activemq.xml配置文件里添加上如下配置:

Xml代码

 <persistenceAdapter> 
<amqPersistenceAdapter directory="activemq-data" maxFileLength="32mb"/>
</persistenceAdapter>

属性说明

property name

default value

Comments

directory

activemq-data

存储消息文件和日志的目录

useNIO

true

使用 NIO 特性

syncOnWrite

false

同步写文件到磁盘

maxFileLength

32mb

Message Data日志文件的最大 Size

persistentIndex

true

持久化日志索引,如果设为 false ,则在内存中保存

maxCheckpointMessageAddSize

4kb

在自动提交前在事务中能保持的最大消息数

cleanupInterval

30000

每隔多少时间清理不再使用的消息日志(毫秒)

indexBinSize

1024

这个值是用来提升索引的性能的,值越大,索引相对性能越好

indexKeySize

96

index key的size,index key基于message id

indexPageSize

16kb

索引页的size

directoryArchive

archive

消费完的Data Log存放的目录

archiveDataLogs

false

设置为true的话,消费完的Data Log就放到Archive目录,而不是删除。

AMQ Message Store体系中 目录结构参照下图 :

顶层目录broker name

用broker name命名,默认目录名是localhost,broker name在activemq的配置文件里指定,以下是它的子目录:

archive

丢弃的Data Log就放到这里,当archiveDataLogs 属性配置为true时才会存在

journal

message data log的所在

kr-store

reference store 目录

data

引用索引所在目录

state

记录store的状态

tmp-storage

用来存储一些事物性的消息以减轻内存的负担例如等待正常但是速度很慢的消费端来消费非持久化的Topic.

其他持久化方式

activemq同样支持JDBC持久化Message,我们只需要把配置层

Xml代码

 <persistenceAdapter> 
<amqPersistenceAdapter directory="activemq-data" maxFileLength="32mb"/>
</persistenceAdapter>

改成AMQ Message Store and JDBC(推荐,同时使用两者可以同时保证效率和可靠性):

Xml代码

 <persistenceAdapter>
<journaledJDBC dataDirectory="${activemq.base}/data" dataSource="#oracle-ds"/>
</persistenceAdapter>

或是 JDBC only(现阶段不推荐,单独的JDBC存储效率不高):

Xml代码

 <persistenceAdapter>
<jdbcPersistenceAdapter dataSource="#oracle-ds"/>
</persistenceAdapter>

Oracle数据源的配置如下:

Xml代码

 <bean id="oracle-ds" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:AMQDB"/>
<property name="username" value="scott"/>
<property name="password" value="tiger"/>
<property name="maxActive" value="200"/>
<property name="poolPreparedStatements" value="true"/>
</bean>

其他数据源配置参照Activemq的文档。


 
分享到
 
 


Java 中的中文编码问题
Java基础知识的三十个经典问答
玩转 Java Web 应用开发
使用Spring更好地处理Struts
用Eclipse开发iPhone Web应用
插件系统框架分析
更多...   


Struts+Spring+Hibernate
基于J2EE的Web 2.0应用开发
J2EE设计模式和性能调优
Java EE 5企业级架构设计
Java单元测试方法与技术
Java编程方法与技术


Struts+Spring+Hibernate/EJB+性能优化
华夏基金 ActiveMQ 原理与管理
某民航公司 Java基础编程到应用开发
某风电公司 Java 应用开发平台与迁移
日照港 J2EE应用开发技术框架与实践
某跨国公司 工作流管理JBPM
东方航空公司 高级J2EE及其前沿技术
更多...