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

# the name of Camel
camel.springboot.name = RabbitCamel

# to automatic shutdown the JVM after a period of time
#camel.springboot.duration-max-seconds=60
#camel.springboot.duration-max-messages=100

# properties used in the Camel route and beans
# --------------------------------------------

# configure connection to the rabbit mq broker using spring rabbitmq style
spring.rabbitmq.host = 127.0.0.1
spring.rabbitmq.port = 5672
spring.rabbitmq.username = guest
spring.rabbitmq.password = guest

# turn on auto declare so the exchange, queues are automatic created if not already present in rabbitmq broker
camel.component.spring-rabbitmq.auto-declare = true

# to configure logging levels
#logging.level.org.springframework = INFO
#logging.level.org.apache.camel.spring.boot = INFO
#logging.level.org.springframework.amqp.rabbit = DEBUG
#logging.level.org.apache.camel.impl = DEBUG
#logging.level.sample.camel = DEBUG
