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

## Modify value of kafka.host and kafka.port before running application

kafka.host=localhost
kafka.port=9092

# Producer properties
producer.topic=TestLog
producer.partitioner=org.apache.camel.example.kafka.StringPartitioner

# Consumer properties 

# One consumer can listen to more than one topics.[ TestLog,AccessLog ] 
consumer.topic=TestLog
consumer.group=kafkaGroup
consumer.maxPollRecords=5000

# No of consumers that connect to Kafka server
consumer.consumersCount=1

# Get records from the beginning
consumer.seekTo=beginning
