`
longgangbai
  • 浏览: 7338915 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

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的属性:

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

 

2、KahaDB

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

KahaDB的属性:

property name default value Comments
directory activemq-data 消息文件和日志的存储目录
indexWriteBatchSize 1000 一批索引的大小,当要更新的索引量到达这个值时,更新到消息文件中
indexCacheSize 10000 内存中,索引的页大小
enableIndexWriteAsync false 索引是否异步写到消息文件中
journalMaxFileLength 32mb 一个消息文件的大小
enableJournalDiskSyncs true 是否讲非事务的消息同步写入到磁盘
cleanupInterval 30000 清除操作周期,单位ms
checkpointInterval 5000 索引写入到消息文件的周期,单位ms
ignoreMissingJournalfiles false 忽略丢失的消息文件,false,当丢失了消息文件,启动异常
checkForCorruptJournalFiles false 检查消息文件是否损坏,true,检查发现损坏会尝试修复
checksumJournalFiles false 产生一个checksum,以便能够检测journal文件是否损坏。
5.4版本之后有效的属性:    
archiveDataLogs false 当为true时,归档的消息文件被移到directoryArchive,而不是直接删除
directoryArchive null 存储被归档的消息文件目录
databaseLockedWaitDelay 10000 在使用负载时,等待获得文件锁的延迟时间,单位ms
maxAsyncJobs 10000 同个生产者产生等待写入的异步消息最大量
concurrentStoreAndDispatchTopics false 当写入消息的时候,是否转发主题消息
concurrentStoreAndDispatchQueues true 当写入消息的时候,是否转发队列消息
5.6版本之后有效的属性:    
archiveCorruptedIndex false 是否归档错误的索引

从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

 

分享到:
评论
3 楼 makemyownlife 2012-06-18  
问个问题,一般监听器在处理消息时候 要是处理时间比较长的情况下,如何才能保证监听顺畅呢? 
2 楼 longgangbai 2012-05-25  
phane 写道

多谢支持,谢谢!
1 楼 phane 2012-03-06  

相关推荐

    ActiveMQ 消息队列

    ### ActiveMQ 消息队列概述 #### 一、ActiveMQ简介 ActiveMQ是由Apache基金会提供的一个开源消息中间件,其作为业界最成熟且功能强大的消息总线之一,在分布式系统和微服务架构中发挥着核心作用。ActiveMQ遵循Java...

    ActiveMQ的activemq.xml详细配置讲解

    - `&lt;policyEntries&gt;`用于定义基于主题或队列的策略,如大小限制、死信处理、消息存活时间等。 - `&lt;destinationPolicy&gt;`元素内的`&lt;policyEntry&gt;`可以指定特定的队列或主题策略。 4. **Destinations** - `...

    实验三 消息中间件应用开发:ActiveMQ实现单线程多队列

    【标题】:“实验三 消息中间件应用开发:ActiveMQ实现单线程多队列” 在IT领域,消息中间件是一种重要的软件架构组件,它主要用于应用程序之间的异步通信,提高系统的可扩展性和解耦性。本实验主要关注的是如何...

    ActiveMQ的队列模式

    **ActiveMQ队列模式的理解:** 1. **创建连接和会话**:在使用ActiveMQ之前,首先需要创建一个到ActiveMQ服务器的连接以及一个或多个会话。连接是与消息服务器建立的物理链路,而会话则是用于发送和接收消息的工作...

    ActiveMQ 配置文件详解

    ActiveMQ允许通过`&lt;destinationPolicy&gt;`标签来设定不同目的地的策略,比如限制队列的大小、消息的存活时间等: ```xml &lt;policyEntry queue="&gt;" maxQueueMessages="10000" /&gt; ``` ### 4. 安全性配置 在`...

    消息队列activeMQ

    **消息队列ActiveMQ详解** ActiveMQ是Apache软件基金会下的一个开源项目,它是一个功能强大的消息中间件,广泛应用于分布式系统中的异步处理和解耦。消息队列ActiveMQ允许应用程序通过发送和接收消息来进行通信,而...

    7道消息队列ActiveMQ面试题!.zip

    消息队列ActiveMQ是Java开发中的重要组件,尤其在分布式系统和高并发场景下,它扮演着关键角色。本文将围绕ActiveMQ展开,基于提供的标题和描述,详细讲解与ActiveMQ相关的七个面试知识点。 1. **什么是消息队列...

    activemq5配置文档

    - **配置文件**:ActiveMQ的配置主要通过`activemq.xml`文件进行,这个XML文件定义了服务器的启动参数、网络连接、消息存储和安全设置等。 - **Broker配置**:Broker是ActiveMQ的核心,配置中包括了broker的名称、...

    ActiveMQ 使用Ajax 收发消息实战

    10. **性能优化**:最后,根据应用场景调整ActiveMQ的配置,比如消息缓存大小、消费者并发数等,以提高系统性能。 在提供的文件名称列表中,我们看到的是一个典型的Java Maven项目的结构,包含`.classpath`、`....

    Java面试题7道消息队列ActiveMQ面试题!

    可以通过配置消息的持久性属性(persistent=true),以及设置数据存储路径,确保消息在磁盘上持久化。 6. **ActiveMQ的公平消费是什么意思?** - 公平消费是指在多消费者竞争同一队列时,ActiveMQ会尽可能保证消息...

    ActiveMQ消息中间件面试专题.pdf

    如果文件大小达到配置的最大限制,消息生产者会阻塞,但消费者仍能连接并消费消息。在持久化消息达到文件大小限制时,生产者同样会阻塞,但消费者可以正常连接并消费,系统能够在空间释放后恢复正常运行。为了避免因...

    消息队列在项目中的应用.docx

    3. 消息队列的配置:根据项目需求配置消息队列的参数,例如队列大小、消息超时时间等。 4. 消息队列的监控:对消息队列进行监控,例如队列长度、消息延迟时间等。 消息队列在项目中的应用可以解决高并发环境下的...

    activemq安装.rar

    通过以上步骤和知识点,你可以在Linux环境中成功安装和配置Apache ActiveMQ,利用其强大的消息传递功能来构建可靠、可扩展的应用系统。不过,请记得在实际操作中根据你的具体需求和环境进行相应的调整。

    Java实现的线程池、消息队列功能

    在实际应用中,根据业务需求,我们可以自定义线程池配置,如设置合适的线程数量和队列大小,以优化系统的资源利用率和性能。同时,消息队列的使用可以改善系统的吞吐量和可靠性,提高系统的整体效率。 关于“工具”...

    文档对应activemq和配置文件

    这个压缩包文件“文档对应mq和配置文件”很可能包含了与ActiveMQ相关的详细文档和配置文件,帮助用户理解和配置这个强大的消息代理。 在了解ActiveMQ时,首先需要知道它的核心概念: 1. **消息**:消息是数据的...

    ActiveMQ消息中间件面试专题.zip

    - **性能优化**:如何调整ActiveMQ配置以提升性能,例如消息大小限制、缓存设置等。 5. **实战经验** - **实际项目中的应用案例**:分享你在项目中如何使用ActiveMQ解决具体问题的经验。 - **异常处理**:如何...

    ActiveMQwindow安装包

    - 配置文件:主要的配置文件是`%ACTIVEMQ_HOME%\conf\activemq.xml`,它定义了服务器的行为,包括网络连接、存储策略、消息传递等。 - 修改配置:根据需求,可以修改这个XML文件来调整端口、增加安全设置、设置...

    自己写的ActiveMQ的Demo例子

    通过修改 `activemq.xml` 配置文件,你可以配置 ActiveMQ 如何管理这些文件,例如设置数据存储路径、大小限制等。 2. **持久化到数据库**:为了提高可靠性,ActiveMQ 还可以配置为将消息存储在关系型数据库(如 ...

    ActiveMQ的配置问题

    - **性能调优**:包括调整队列大小、内存使用、线程池大小等,以适应不同的负载情况。 在实际操作中,可能还需要考虑与其他系统的集成,例如Spring框架、Web应用程序或其他消息消费者。确保理解ActiveMQ的特性和...

Global site tag (gtag.js) - Google Analytics