##
## 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 {
    ##
    ## worker-threads - 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.
    ##
    worker-threads: 4

    ##
    ## container-name - 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.
    ##
    container-name: Qpid.Dispatch.Router.A
}

##
## SSL Profile section - Zero or more SSL profiles may be defined here and
## then referenced later in listeners (for incoming connections) or
## connectors (for outgoing connectors).
##
ssl-profile {
    name: ssl-profile-name
    cert-db: ${QPID_DISPATCH_HOME_INSTALLED}/tests/config-2/ca-certificate.pem
    cert-file: ${QPID_DISPATCH_HOME_INSTALLED}/tests/config-2/server-certificate.pem
    key-file: ${QPID_DISPATCH_HOME_INSTALLED}/tests/config-2/server-private-key.pem
    password: server-password
}

##
## Listeners and Connectors
##
listener {
    addr: 0.0.0.0
    port: 20100
    sasl-mechanisms: ANONYMOUS
}

listener {
    role: inter-router
    addr: 0.0.0.0
    port: 20102
    sasl-mechanisms: EXTERNAL
    ssl-profile: ssl-profile-name
    requirePeerAuth: yes
}

router {
    mode: interior
    router-id: QDR.A
}

fixed-address {
    prefix: /closest/
    fanout: single
    bias: closest
}

fixed-address {
    prefix: /spread/
    fanout: single
    bias: spread
}

fixed-address {
    prefix: /multicast/
    fanout: multiple
}

fixed-address {
    prefix: /
    fanout: multiple
}
