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

name=CamelJmsSourceConnector
tasks.max=1
connector.class=org.apache.camel.kafkaconnector.sjms2.CamelSjms2SourceConnector
key.converter=org.apache.kafka.connect.storage.StringConverter
value.converter=org.apache.kafka.connect.storage.StringConverter

topics=mytopic

camel.source.url=sjms2://queue:myqueue

camel.component.sjms2.connection-factory=#class:org.apache.activemq.ActiveMQConnectionFactory
camel.component.sjms2.connection-factory.brokerURL=tcp://localhost:61616

# If using AMQP via QPid JMS:
# camel.component.sjms2.connection-factory=#class:org.apache.qpid.jms.JmsConnectionFactory
# camel.component.sjms2.connection-factory.remoteURI=amqp://localhost:5672

# If using CORE via Artemis JMS:
# camel.component.sjms2.connection-factory=#class:org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory
# camel.component.sjms2.connection-factory.remoteURI=tcp://localhost:61616
