##
## 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
##


##
## Container section - Configures the general operation of the AMQP container.
##
container {
    ##
    ## workerThreads - The number of threads that will be created to
    ## process message traffic and other application work (timers, non-amqp
    ## file descriptors, etc.)
    ##
    ## The number of threads should be related to the number of available
    ## processor cores.  To fully utilize a quad-core system, set the
    ## number of threads to 4.
    ##
    workerThreads: 4

    ##
    ## containerName - The name of the AMQP container.  If not specified,
    ## the container name will be set to a value of the container's
    ## choosing.  The automatically assigned container name is not
    ## guaranteed to be persistent across restarts of the container.
    ##
    containerName: Qpid.Dispatch.Router.B
}


##
## Listeners and Connectors
##
listener {
    addr: 0.0.0.0
    port: 20101
    saslMechanisms: ANONYMOUS
}

connector {
    role: inter-router
    addr: 0.0.0.0
    port: 20102
    saslMechanisms: ANONYMOUS
}

router {
    mode: interior
    routerId: QDR.B
}

fixedAddress {
    prefix: /closest/
    fanout: single
    bias: closest
}

fixedAddress {
    prefix: /spread/
    fanout: single
    bias: spread
}

fixedAddress {
    prefix: /multicast/
    fanout: multiple
}

fixedAddress {
    prefix: /
    fanout: multiple
}

log {
    module: ROUTER_LS
    enable: trace+
}

log {
    module: ROUTER_MA
    enable: trace+
}

log {
    module: ROUTER_HELLO
    enable: trace+
}

