activemq消息队列的大小配置的配置

           在网上有人问,如何在activemq.xml里面配置消息队列的大小,这样才保证队列不会溢出!如果采用非持久化消息,那么当大量发送失败时候,首先大量占用内存。造成消息堆积,容易造成内存溢出,所以个人比较倾向于持久化消息的同时配合其他方式的master/slave或者failover机制,尽量保持消息的畅通。当我们开发的Java的使用应用程序的时候,有的时候需要为java应用指定对应的内存大小。当在测试的时候,有的同学也许会遇到ActiveMQ报内存不足的问题,我们可以修改ActiveMQ使用的内存的多少类似Java 的内存的设置,在ActiveMQ.bat或者activemq(linux)文件中

如下:

if "%ACTIVEMQ_BASE%" == "" set ACTIVEMQ_BASE=%ACTIVEMQ_HOME%

if "%ACTIVEMQ_OPTS%" == "" set ACTIVEMQ_OPTS=-Xmx512M -Dorg.apache.activemq.UseDedicatedTaskRunner=true -Djava.util.logging.config.file=logging.properties

if "%SUNJMX%" == "" set SUNJMX=-Dcom.sun.management.jmxremote

 

其中ACTIVEMQ_OPTS中指定ActiveMQ的使用的内存的大小。

 

 

 

  下面为ActiveMQ的内存分配信息。activemq.xml中的配置情况:

 

        
          <!--
            The systemUsage controls the maximum amount of space the broker will 
            use before slowing down producers. For more information, see:
            
            http://activemq.apache.org/producer-flow-control.html
             
        <systemUsage   sendFailIfNoSpaceAfterTimeout="3000"  sendFailIfNoSpace="true">
            <systemUsage>
                <memoryUsage>
                    <memoryUsage limit="20 mb"/>
                </memoryUsage>
                <storeUsage>
                    <storeUsage limit="1 gb"/>
                </storeUsage>
                <tempUsage>
                    <tempUsage limit="100 mb"/>
                </tempUsage>
            </systemUsage>
        </systemUsage>
      -->

 

 

 memoryUsage:表示所有队列对象占用的内存大小为20mb;

 

AbstractPendingMessageCursor计算空间的方法源代码如下:

    public boolean hasSpace() {
        return systemUsage != null ? (systemUsage.getMemoryUsage().getPercentUsage() < memoryUsageHighWaterMark) : true;
    }

    public boolean isFull() {
        return systemUsage != null ? systemUsage.getMemoryUsage().isFull() : false;
    }

 
 ActiveMQ消息持久化

在broker中设置属性persistent=”true”(默认是true),同时发送的消息也应该是persitent类型的。ActiveMQ消息持久化有三种方式:AMQ、KahaDB、JDBC。

1、AMQ

AMQ是一种文件存储形式,它具有写入速度快和容易恢复的特点。消息存储在一个个文件中,文件的默认大小为32兆,如果一条消息的大小超过了32兆,那么这个值必须设置大点。当一个存储文件中的消息已经全部被消费,那么这个文件将被标识为可删除,在下一个清除阶段,这个文件被删除。默认配置如下:

AMQ的属性:

属性名称默认值描述
directoryactivemq-data消息文件和日志的存储目录
useNIOtrue使用NIO协议存储消息
syncOnWritefalse同步写到磁盘,这个选项对性能影响非常大
maxFileLength32mb一个消息文件的大小
persistentIndextrue消息索引的持久化,如果为false,那么索引保存在内存中
maxCheckpointMessageAddSize4kb一个事务允许的最大消息量
cleanupInterval30000清除操作周期,单位ms
indexBinSize1024索引文件缓存页面数,缺省为1024,当amq扩充或者缩减存储时,会锁定整个broker,导致一定时间的阻塞,所以这个值应该调整到比较大,但是代码中实现会动态伸缩,调整效果并不理想。
indexKeySize96索引key的大小,key是消息ID
indexPageSize16kb索引的页大小
directoryArchivearchive存储被归档的消息文件目录
archiveDataLogsfalse当为true时,归档的消息文件被移到directoryArchive,而不是直接删除

 

2、KahaDB

KahaDB是基于文件的本地数据库储存形式,虽然没有AMQ的速度快,但是它具有强扩展性,恢复的时间比AMQ短,从5.4版本之后KahaDB做为默认的持久化方式。默认配置如下:

KahaDB的属性:

property namedefault valueComments
directoryactivemq-data消息文件和日志的存储目录
indexWriteBatchSize1000一批索引的大小,当要更新的索引量到达这个值时,更新到消息文件中
indexCacheSize10000内存中,索引的页大小
enableIndexWriteAsyncfalse索引是否异步写到消息文件中
journalMaxFileLength32mb一个消息文件的大小
enableJournalDiskSyncstrue是否讲非事务的消息同步写入到磁盘
cleanupInterval30000清除操作周期,单位ms
checkpointInterval5000索引写入到消息文件的周期,单位ms
ignoreMissingJournalfilesfalse忽略丢失的消息文件,false,当丢失了消息文件,启动异常
checkForCorruptJournalFilesfalse检查消息文件是否损坏,true,检查发现损坏会尝试修复
checksumJournalFilesfalse产生一个checksum,以便能够检测journal文件是否损坏。
5.4版本之后有效的属性:  
archiveDataLogsfalse当为true时,归档的消息文件被移到directoryArchive,而不是直接删除
directoryArchivenull存储被归档的消息文件目录
databaseLockedWaitDelay10000在使用负载时,等待获得文件锁的延迟时间,单位ms
maxAsyncJobs10000同个生产者产生等待写入的异步消息最大量
concurrentStoreAndDispatchTopicsfalse当写入消息的时候,是否转发主题消息
concurrentStoreAndDispatchQueuestrue当写入消息的时候,是否转发队列消息
5.6版本之后有效的属性:  
archiveCorruptedIndexfalse是否归档错误的索引

从5.6版本之后,有可能发布通过多个kahadb持久适配器来实现分布式目标队列存储。什么时候用呢?如果有一个快速的生产者和消费者,当某一个时刻生产者发生了不规范的消费,那么有可能产生一条消息被存储在两个消息文件中,同时,有些目标队列是危险的并且要求访问磁盘。在这种情况下,你应该用通配符来使用mKahaDB。如果目标队列是分布的,事务是可以跨越多个消息文件的。

每个KahaDB的实例都可以配置单独的适配器,如果没有目标队列提交给filteredKahaDB,那么意味着对所有的队列有效。如果一个队列没有对应的适配器,那么将会抛出一个异常。配置如下:

如果filteredKahaDB的perDestination属性设置为true,那么匹配的目标队列将会得到自己对应的KahaDB实例。配置如下:

3、JDBC

配置JDBC适配器:

dataSource指定持久化数据库的bean,createTablesOnStartup是否在启动的时候创建数据表,默认值是true,这样每次启动都会去创建数据表了,一般是第一次启动的时候设置为true,之后改成false。

MYSQL持久化bean

 

 

SQL Server持久化bean

 

Oracle持久化bean

 

 

DB2持久化bean

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值