<!--
    Licensed to the Apache Software Foundation (ASF) under one or more
    contributor license agreements.  See the NOTICE file distributed with
    this work for additional information regarding copyright ownership.
    The ASF licenses this file to You under the Apache License, Version 2.0
    (the "License"); you may not use this file except in compliance with
    the License.  You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
-->
<!--
    Tune ActiveMQ broker so it can handle large number of queues (tens of thousands)
    For more information, see:
    http://activemq.apache.org/how-do-i-configure-10s-of-1000s-of-queues-in-a-single-broker-.html

    Be sure to make necessary changes in your startup script, to

    1. Give broker enough memory
    2. Disable dedicated task runner

    e.g. ACTIVEMQ_OPTS="-Xmx1024M -Dorg.apache.activemq.UseDedicatedTaskRunner=false"

    To run ActiveMQ with this configuration add xbean:conf/activemq-scalability.xml to your command
    e.g. $ bin/activemq console xbean:conf/activemq-scalability.xml
 -->
<beans
  xmlns="http://www.springframework.org/schema/beans"
  xmlns:amq="http://activemq.apache.org/schema/core"
  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"/>

    <broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}" useJmx="false" advisorySupport="false">

        <!--
            Turn on optimizedDispatch
            For more information, see:
            http://activemq.apache.org/per-destination-policies.html
        -->
        <destinationPolicy>
            <policyMap>
                <policyEntries>
                    <policyEntry queue=">" optimizedDispatch="true" />
                </policyEntries>
            </policyMap>
        </destinationPolicy>

        <!--
            Use KahaDB for persistence
            For more information, see:
            http://activemq.apache.org/kahadb.html
        -->
        <persistenceAdapter>
            <kahaDB directory="${activemq.data}/kahadb" enableIndexWriteAsync="true"/>
        </persistenceAdapter>

        <!--
            Use NIO transport
            For more information, see:
            http://activemq.apache.org/configuring-transports.html#ConfiguringTransports-TheNIOTransport
        -->
        <transportConnectors>
            <transportConnector name="nio" uri="nio://0.0.0.0:61616"/>
        </transportConnectors>

    </broker>

</beans>
