在网上有人问,如何在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实例。配置如下:
1
2
3
4
5
6
7
8
9
10
11
12
|
<persistenceAdapter>
<mKahaDB directory="${activemq.base}/data/kahadb">
<filteredPersistenceAdapters>
<!--kahaDB per destinations-->
<filteredKahaDB perDestination="true">
<persistenceAdapter>
<kahaDB journalMaxFileLength="32mb"/>
</persistenceAdapter>
</filteredKahaDB>
</filteredPersistenceAdapters>
</mKahaDB>
</persistenceAdapter>
|
3、JDBC
配置JDBC适配器:
dataSource指定持久化数据库的bean,createTablesOnStartup是否在启动的时候创建数据表,默认值是true,这样每次启动都会去创建数据表了,一般是第一次启动的时候设置为true,之后改成false。
MYSQL持久化bean
SQL Server持久化bean
Oracle持久化bean
1
2
3
4
5
6
7
8
|
<bean id="oracle-ds"class="org.apache.commons.dbcp.BasicDataSource"destroy-method="close">
<propertyname="driverClassName"value="oracle.jdbc.driver.OracleDriver"/>
<propertyname="url"value="jdbc:oracle:thin:@10.53.132.47:1521:activemq"/>
<propertyname="username"value="activemq"/>
<propertyname="password"value="activemq"/>
<propertyname="maxActive"value="200"/>
<propertyname="poolPreparedStatements"value="true"/>
</bean>
|
DB2持久化bean
相关推荐
### ActiveMQ 消息队列概述 #### 一、ActiveMQ简介 ActiveMQ是由Apache基金会提供的一个开源消息中间件,其作为业界最成熟且功能强大的消息总线之一,在分布式系统和微服务架构中发挥着核心作用。ActiveMQ遵循Java...
- `<policyEntries>`用于定义基于主题或队列的策略,如大小限制、死信处理、消息存活时间等。 - `<destinationPolicy>`元素内的`<policyEntry>`可以指定特定的队列或主题策略。 4. **Destinations** - `...
【标题】:“实验三 消息中间件应用开发:ActiveMQ实现单线程多队列” 在IT领域,消息中间件是一种重要的软件架构组件,它主要用于应用程序之间的异步通信,提高系统的可扩展性和解耦性。本实验主要关注的是如何...
**ActiveMQ队列模式的理解:** 1. **创建连接和会话**:在使用ActiveMQ之前,首先需要创建一个到ActiveMQ服务器的连接以及一个或多个会话。连接是与消息服务器建立的物理链路,而会话则是用于发送和接收消息的工作...
ActiveMQ允许通过`<destinationPolicy>`标签来设定不同目的地的策略,比如限制队列的大小、消息的存活时间等: ```xml <policyEntry queue=">" maxQueueMessages="10000" /> ``` ### 4. 安全性配置 在`...
**消息队列ActiveMQ详解** ActiveMQ是Apache软件基金会下的一个开源项目,它是一个功能强大的消息中间件,广泛应用于分布式系统中的异步处理和解耦。消息队列ActiveMQ允许应用程序通过发送和接收消息来进行通信,而...
消息队列ActiveMQ是Java开发中的重要组件,尤其在分布式系统和高并发场景下,它扮演着关键角色。本文将围绕ActiveMQ展开,基于提供的标题和描述,详细讲解与ActiveMQ相关的七个面试知识点。 1. **什么是消息队列...
- **配置文件**:ActiveMQ的配置主要通过`activemq.xml`文件进行,这个XML文件定义了服务器的启动参数、网络连接、消息存储和安全设置等。 - **Broker配置**:Broker是ActiveMQ的核心,配置中包括了broker的名称、...
10. **性能优化**:最后,根据应用场景调整ActiveMQ的配置,比如消息缓存大小、消费者并发数等,以提高系统性能。 在提供的文件名称列表中,我们看到的是一个典型的Java Maven项目的结构,包含`.classpath`、`....
可以通过配置消息的持久性属性(persistent=true),以及设置数据存储路径,确保消息在磁盘上持久化。 6. **ActiveMQ的公平消费是什么意思?** - 公平消费是指在多消费者竞争同一队列时,ActiveMQ会尽可能保证消息...
如果文件大小达到配置的最大限制,消息生产者会阻塞,但消费者仍能连接并消费消息。在持久化消息达到文件大小限制时,生产者同样会阻塞,但消费者可以正常连接并消费,系统能够在空间释放后恢复正常运行。为了避免因...
3. 消息队列的配置:根据项目需求配置消息队列的参数,例如队列大小、消息超时时间等。 4. 消息队列的监控:对消息队列进行监控,例如队列长度、消息延迟时间等。 消息队列在项目中的应用可以解决高并发环境下的...
通过以上步骤和知识点,你可以在Linux环境中成功安装和配置Apache ActiveMQ,利用其强大的消息传递功能来构建可靠、可扩展的应用系统。不过,请记得在实际操作中根据你的具体需求和环境进行相应的调整。
在实际应用中,根据业务需求,我们可以自定义线程池配置,如设置合适的线程数量和队列大小,以优化系统的资源利用率和性能。同时,消息队列的使用可以改善系统的吞吐量和可靠性,提高系统的整体效率。 关于“工具”...
这个压缩包文件“文档对应mq和配置文件”很可能包含了与ActiveMQ相关的详细文档和配置文件,帮助用户理解和配置这个强大的消息代理。 在了解ActiveMQ时,首先需要知道它的核心概念: 1. **消息**:消息是数据的...
- **性能优化**:如何调整ActiveMQ配置以提升性能,例如消息大小限制、缓存设置等。 5. **实战经验** - **实际项目中的应用案例**:分享你在项目中如何使用ActiveMQ解决具体问题的经验。 - **异常处理**:如何...
- 配置文件:主要的配置文件是`%ACTIVEMQ_HOME%\conf\activemq.xml`,它定义了服务器的行为,包括网络连接、存储策略、消息传递等。 - 修改配置:根据需求,可以修改这个XML文件来调整端口、增加安全设置、设置...
通过修改 `activemq.xml` 配置文件,你可以配置 ActiveMQ 如何管理这些文件,例如设置数据存储路径、大小限制等。 2. **持久化到数据库**:为了提高可靠性,ActiveMQ 还可以配置为将消息存储在关系型数据库(如 ...
- **性能调优**:包括调整队列大小、内存使用、线程池大小等,以适应不同的负载情况。 在实际操作中,可能还需要考虑与其他系统的集成,例如Spring框架、Web应用程序或其他消息消费者。确保理解ActiveMQ的特性和...