// spring-boot-auto-configure options: START
:page-partial:
:doctitle: Camel Spring Boot Starter for aws-kinesis

== Spring Boot Auto-Configuration

When using aws-kinesis with Spring Boot make sure to use the following Maven dependency to have support for auto configuration:

[source,xml]
----
<dependency>
  <groupId>org.apache.camel.springboot</groupId>
  <artifactId>camel-aws-kinesis-starter</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>
----


The component supports 30 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *camel.component.aws-kinesis-firehose.access-key* | Amazon AWS Access Key |  | String
| *camel.component.aws-kinesis-firehose.amazon-kinesis-firehose-client* | Amazon Kinesis Firehose client to use for all requests for this endpoint. The option is a com.amazonaws.services.kinesisfirehose.AmazonKinesisFirehose type. |  | AmazonKinesisFirehose
| *camel.component.aws-kinesis-firehose.auto-discover-client* | Setting the autoDiscoverClient mechanism, if true, the component will look for a client instance in the registry automatically otherwise it will skip that checking | true | Boolean
| *camel.component.aws-kinesis-firehose.autowired-enabled* | Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching type, which then gets configured on the component. This can be used for automatic configuring JDBC data sources, JMS connection factories, AWS Clients, etc. | true | Boolean
| *camel.component.aws-kinesis-firehose.configuration* | The component configuration. The option is a org.apache.camel.component.aws.firehose.KinesisFirehoseConfiguration type. |  | KinesisFirehoseConfiguration
| *camel.component.aws-kinesis-firehose.enabled* | Whether to enable auto configuration of the aws-kinesis-firehose component. This is enabled by default. |  | Boolean
| *camel.component.aws-kinesis-firehose.lazy-start-producer* | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | Boolean
| *camel.component.aws-kinesis-firehose.proxy-host* | To define a proxy host when instantiating the Kinesis Firehose client |  | String
| *camel.component.aws-kinesis-firehose.proxy-port* | To define a proxy port when instantiating the Kinesis Firehose client |  | Integer
| *camel.component.aws-kinesis-firehose.proxy-protocol* | To define a proxy protocol when instantiating the Kinesis Firehose client |  | Protocol
| *camel.component.aws-kinesis-firehose.region* | The region in which Kinesis client needs to work. When using this parameter, the configuration will expect the capitalized name of the region (for example AP_EAST_1)You'll need to use the name Regions.EU_WEST_1.name() |  | String
| *camel.component.aws-kinesis-firehose.secret-key* | Amazon AWS Secret Key |  | String
| *camel.component.aws-kinesis.access-key* | Amazon AWS Access Key |  | String
| *camel.component.aws-kinesis.amazon-kinesis-client* | Amazon Kinesis client to use for all requests for this endpoint. The option is a com.amazonaws.services.kinesis.AmazonKinesis type. |  | AmazonKinesis
| *camel.component.aws-kinesis.auto-discover-client* | Setting the autoDiscoverClient mechanism, if true, the component will look for a client instance in the registry automatically otherwise it will skip that checking | true | Boolean
| *camel.component.aws-kinesis.autowired-enabled* | Whether autowiring is enabled. This is used for automatic autowiring options (the option must be marked as autowired) by looking up in the registry to find if there is a single instance of matching type, which then gets configured on the component. This can be used for automatic configuring JDBC data sources, JMS connection factories, AWS Clients, etc. | true | Boolean
| *camel.component.aws-kinesis.bridge-error-handler* | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions occurred while the consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. By default the consumer will use the org.apache.camel.spi.ExceptionHandler to deal with exceptions, that will be logged at WARN or ERROR level and ignored. | false | Boolean
| *camel.component.aws-kinesis.configuration* | The component configuration. The option is a org.apache.camel.component.aws.kinesis.KinesisConfiguration type. |  | KinesisConfiguration
| *camel.component.aws-kinesis.enabled* | Whether to enable auto configuration of the aws-kinesis component. This is enabled by default. |  | Boolean
| *camel.component.aws-kinesis.iterator-type* | Defines where in the Kinesis stream to start getting records |  | ShardIteratorType
| *camel.component.aws-kinesis.lazy-start-producer* | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel's routing error handlers. Beware that when the first message is processed then creating and starting the producer may take a little time and prolong the total processing time of the processing. | false | Boolean
| *camel.component.aws-kinesis.max-results-per-request* | Maximum number of records that will be fetched in each poll | 1 | Integer
| *camel.component.aws-kinesis.proxy-host* | To define a proxy host when instantiating the Kinesis client |  | String
| *camel.component.aws-kinesis.proxy-port* | To define a proxy port when instantiating the Kinesis client |  | Integer
| *camel.component.aws-kinesis.proxy-protocol* | To define a proxy protocol when instantiating the Kinesis client |  | Protocol
| *camel.component.aws-kinesis.region* | The region in which Kinesis client needs to work. When using this parameter, the configuration will expect the capitalized name of the region (for example AP_EAST_1)You'll need to use the name Regions.EU_WEST_1.name() |  | String
| *camel.component.aws-kinesis.secret-key* | Amazon AWS Secret Key |  | String
| *camel.component.aws-kinesis.sequence-number* | The sequence number to start polling from. Required if iteratorType is set to AFTER_SEQUENCE_NUMBER or AT_SEQUENCE_NUMBER |  | String
| *camel.component.aws-kinesis.shard-closed* | Define what will be the behavior in case of shard closed. Possible value are ignore, silent and fail. In case of ignore a message will be logged and the consumer will restart from the beginning,in case of silent there will be no logging and the consumer will start from the beginning,in case of fail a ReachedClosedStateException will be raised |  | KinesisShardClosedStrategyEnum
| *camel.component.aws-kinesis.shard-id* | Defines which shardId in the Kinesis stream to get records from |  | String
|===
// spring-boot-auto-configure options: END
