ActiveMQ. xml配置文件详解
ActiveMQ(XML)配置文件详解
<beans
xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd">
<!-- Allows us to use system properties as variables in this configuration file -->
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<value>file:${activemq.conf}/credentials.properties</value>
</property>
</bean>
<!-- Allows accessing the server log -->
<bean id="logQuery" class="io.fabric8.insight.log.log4j.Log4jLogQuery"
lazy-init="false" scope="singleton"
init-method="start" destroy-method="stop">
</bean>
<!--
The <broker>
broker节点:
|参数名:类型|默认值|说明|
brokerName:Str|localhost|机器名网络内唯一
persistent:Boolean|true|是否持久化
true表示需要持久化,需要与元素persistenceAdapter结合使用
false表示不持久化 重启后消息丢失 且十分消耗内存
dataDirectory:Str|默认持久化数据的目录
deleteAllMessagesOnStartup:Boolean|false|启动时是否清空持久化的消息
enableStatistics:Boolean|true|是否启用数据收集
-->
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}">
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry topic=">" >
<!-- 【消息限制策略,面向Slow Consumer的】
此策略只对Topic有效,只对nondurable订阅者有效,当通道中有大量的消息积压时,broker可以保留的消息量。
为了防止Topic中有慢速消费者,导致整个通道消息积压。(对于Topic而言,一条消息只有所有的订阅者都消费才
会被删除) -->
<!-- 速度慢的消费者可能会在非持久性主题上引起问题,因为它们可以迫使中间人将旧消息保留在RAM中,一旦旧消息被填满,就会迫使中间人减慢生产者的速度,从而导致快速消费者的速度变慢。我们将来可以实现的一种选择是后台处理到磁盘-但是后台处理到磁盘也可能减慢快速的使用者。
当前,我们有一种策略可以让您配置代理,除了其预取缓冲区外,代理还将为消费者保留的匹配消息的最大数量。一旦达到此最大值,随着新邮件的到来,旧邮件将被丢弃。这使您可以保留当前消息的RAM,并继续将消息发送给速度较慢的使用者,但可以丢弃旧消息。
待处理邮件限制策略
您可以PendingMessageLimitStrategy在目标映射上配置 实现类,以便主题名称空间的不同区域可以具有不同的策略来处理缓慢的使用者。例如,您可能希望对高交易量的价格使用此策略,但对于低交易量的订单和交易,可能不希望丢弃旧消息。
该策略为使用者计算要保留在RAM中的待处理消息的最大数量(大于其预取大小)。值为零表示除预取量外,不保留其他任何消息。大于零的值将保持最多的消息量,随着新消息的到来而丢弃较旧的消息。值 -1禁用禁用消息的丢弃。
当前,该策略有两种不同的实现方式:
ConstantPendingMessageLimitStrategy
PrefetchRatePendingMessageLimitStrategy
http://activemq.apache.org/slow-consumer-handling.html
-->
<pendingMessageLimitStrategy>
<!-- 此策略对所有使用者使用恒定限制(超过其预取大小)。 -->
<constantPendingMessageLimitStrategy limit="1000"/>
<!-- 此策略使用使用者预取大小的乘数来计算未决消息的最大数量。因此,例如,您可以为每个消费者保留大约2.5倍的预取计数。 -->
<!-- <prefetchRatePendingMessageLimitStrategy multiplier="2.5"/> -->
</pendingMessageLimitStrategy>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
<!-- 【什么是预取限制?】 -->
ActiveMQ的设计目标之一是成为高性能的消息总线。这意味着使用暂存体系结构来异步执行尽可能多的工作。为了有效地利用网络资源,代理使用“推送”模型将消息分发给消费者。这样可以确保使用者始终具有准备处理的本地消息缓冲区。替代方案是让消费者从代理中明确提取消息。单独提取消息不是很有效,并且会显着增加每条消息的延迟。
但是,存在这样一种危险,即如果不限制发送给使用者的消息数量,其客户端资源就会耗尽。这是消息消耗的自然结果,通常比消息传递要慢得多。为了避免这种情况,ActiveMQ因此采用了预取限制,以限制可以立即分发给单个使用者的最大消息数。使用者进而使用预取限制来调整其预取消息缓冲区的大小。
一旦代理已向消费者发送了预取限制消息数量,它将不会再向该消费者发送更多消息,直到该消费者确认已接收到的至少50%的预取消息,例如prefetch / 2。当代理收到上述确认后,它将向用户发送进一步的预取/2数量的消息给消费者以“充值”它的预取缓冲区。请注意,可以根据每个使用者指定预取限制,建议使用较大的预取值,以实现高性能和高消息量。但是,对于较低的消息量,其中每条消息都需要花费很长时间进行处理,因此应将预取设置为1。这样可以确保使用者一次只处理一条消息。但是,将预取限制指定为零将导致使用者一次轮询一次消息,而不是将消息推送到使用者。指定PrefetchPolicy
您可以在ActiveMQConnectionFactory或ActiveMQConnection上指定ActiveMQPrefetchPolicy的实例。这使您可以配置所有单独的预取值。因为每种不同的服务质量都有不同的价值。例如
持久性的队列(默认值: 1000)
非持久性队列(默认值: 1000)
持续的主题(默认值: 100)
非持久性主题(默认值: Short.MAX_VALUE - 1)
还可以在用于建立代理连接的连接URI上配置预取限制。要更改所有使用者类型的预取限制,请配置连接URI,如下所示:
【tcp://localhost:61616?jms.prefetchPolicy.all=50】
要更改队列使用者的预取限制,请仅按以下方式配置连接URI:
【tcp://localhost:61616?jms.prefetchPolicy.queuePrefetch=1】
也可以使用“目标选项”针对每个用户配置它:
queue = new ActiveMQQueue("TEST.QUEUE?consumer.prefetchSize=10");
consumer = session.createConsumer(queue);
<!--
The managementContext is used to configure how ActiveMQ is exposed in
JMX. By default, ActiveMQ uses the MBean server that is started by
the JVM. For more information, see:
确保启用了JMX,但告诉ActiveMQ不要创建自己的连接器,以便它将使用默认的JVM JMX连接器。
http://activemq.apache.org/jmx.html
-->
<managementContext>
<managementContext createConnector="false"/>
</managementContext>
<!--
配置消息的持久性,默认的消息持久性是KahaDB存储
http://activemq.apache.org/persistence.html
-->
<persistenceAdapter>
<!-- KahaDB存储 -->
<kahaDB directory="${activemq.data}/kahadb"/>
<!--JDBC存储 -->
<!-- <jdbcPersistenceAdapter dataSource="#mysql-ds"/> -->
</persistenceAdapter>
<!-- MySql DataSource Sample Setup -->
<!--
<bean id="mysql-ds" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost/activemq?relaxAutoCommit=true"/>
<property name="username" value="activemq"/>
<property name="password" value="activemq"/>
<property name="poolPreparedStatements" value="true"/>
</bean>
-->
<!--
systemUsage控制代理将占用的最大空间量在禁用缓存或减慢生产者速度之前使用.
如果代理检测到已超出目标的内存限制,或代理的临时或文件存储限制,则消息流可能会减慢。生产者将被阻塞,直到资源可用或将收到JMSException为止:此行为是可配置的,并将在下面的部分中进行描述<systemUsage>。值得注意的是,默认<systemUsage>设置会在达到或限制时导致生产者阻塞:这种阻塞行为有时会被误解为“悬挂生产者”,而实际上生产者只是在勤奋地等待着直到空间可用。memoryLimit<systemUsage同步发送的消息将根据生产者流控制自动使用;这通常适用于同步发送的持久性消息,除非您启用该useAsyncSend标志。使用异步发送的生产者-通常来说,非持久消息的生产者-不必费心等待代理的任何确认。因此,如果超出了内存限制,您将不会受到限制。
http://activemq.apache.org/producer-flow-control.html
-->
<systemUsage>
<systemUsage>
<memoryUsage>
<memoryUsage percentOfJvmHeap="70" />
</memoryUsage>
<storeUsage>
<storeUsage limit="100 gb"/>
</storeUsage>
<tempUsage>
<tempUsage limit="50 gb"/>
</tempUsage>
</systemUsage>
</systemUsage>
<!--
传输连接器通过给定的协议将ActiveMQ公开给客户和其他经纪人。
http://activemq.apache.org/configuring-transports.html
-->
<transportConnectors>
<!-- DOS protection, limit concurrent connections to 1000 and frame size to 100MB -->
<transportConnector name="openwire" uri="tcp://0.0.0.0:61616?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="amqp" uri="amqp://0.0.0.0:5673?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61613?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1883?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://0.0.0.0:61614?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
<!-- destroy the spring context on shutdown to stop jetty -->
<shutdownHooks>
<bean xmlns="http://www.springframework.org/schema/beans" class="org.apache.activemq.hooks.SpringContextHook" />
</shutdownHooks>
</broker>
<!--
Enable web consoles, REST and Ajax APIs and demos
The web consoles requires by default login, you can disable this in the jetty.xml file
Take a look at ${ACTIVEMQ_HOME}/conf/jetty.xml for more details
-->
<import resource="jetty.xml"/>
</beans>
<!-- END SNIPPET: example -->