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

== Spring Boot Auto-Configuration

When using infinispan 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-infinispan-starter</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>
----


The component supports 34 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *camel.component.infinispan.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.infinispan.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.infinispan.cache-container* | Specifies the cache Container to connect. The option is a org.infinispan.commons.api.BasicCacheContainer type. |  | BasicCacheContainer
| *camel.component.infinispan.cache-container-configuration* | The CacheContainer configuration. Uses if the cacheContainer is not defined. Must be the following types: org.infinispan.client.hotrod.configuration.Configuration - for remote cache interaction configuration; org.infinispan.configuration.cache.Configuration - for embedded cache interaction configuration;. The option is a java.lang.Object type. |  | Object
| *camel.component.infinispan.clustered-listener* | If true, the listener will be installed for the entire cluster | false | Boolean
| *camel.component.infinispan.configuration* | Component configuration. The option is a org.apache.camel.component.infinispan.InfinispanConfiguration type. |  | InfinispanConfiguration
| *camel.component.infinispan.configuration-properties* | Implementation specific properties for the CacheManager |  | Map
| *camel.component.infinispan.configuration-uri* | An implementation specific URI for the CacheManager |  | String
| *camel.component.infinispan.custom-listener* | Returns the custom listener in use, if provided. The option is a org.apache.camel.component.infinispan.InfinispanCustomListener type. |  | InfinispanCustomListener
| *camel.component.infinispan.customizer.embedded-cache-manager.enabled* | Enable or disable the cache-manager customizer. | true | Boolean
| *camel.component.infinispan.customizer.embedded-cache-manager.override* | Configure if the cache manager eventually set on the component should be overridden by the customizer. | false | Boolean
| *camel.component.infinispan.customizer.remote-cache-manager.enabled* | Enable or disable the cache-manager customizer. | true | Boolean
| *camel.component.infinispan.customizer.remote-cache-manager.override* | Configure if the cache manager eventually set on the component should be overridden by the customizer. | false | Boolean
| *camel.component.infinispan.default-value* | Set a specific default value for some producer operations. The option is a java.lang.Object type. |  | Object
| *camel.component.infinispan.enabled* | Whether to enable auto configuration of the infinispan component. This is enabled by default. |  | Boolean
| *camel.component.infinispan.event-types* | Specifies the set of event types to register by the consumer. Multiple event can be separated by comma. The possible event types are: CACHE_ENTRY_ACTIVATED, CACHE_ENTRY_PASSIVATED, CACHE_ENTRY_VISITED, CACHE_ENTRY_LOADED, CACHE_ENTRY_EVICTED, CACHE_ENTRY_CREATED, CACHE_ENTRY_REMOVED, CACHE_ENTRY_MODIFIED, TRANSACTION_COMPLETED, TRANSACTION_REGISTERED, CACHE_ENTRY_INVALIDATED, DATA_REHASHED, TOPOLOGY_CHANGED, PARTITION_STATUS_CHANGED |  | String
| *camel.component.infinispan.flags* | A comma separated list of Flag to be applied by default on each cache invocation, not applicable to remote caches. |  | String
| *camel.component.infinispan.hosts* | Specifies the host of the cache on Infinispan instance |  | String
| *camel.component.infinispan.key* | Set a specific key for producer operations. The option is a java.lang.Object type. |  | Object
| *camel.component.infinispan.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.infinispan.old-value* | Set a specific old value for some producer operations. The option is a java.lang.Object type. |  | Object
| *camel.component.infinispan.operation* | The operation to perform. |  | InfinispanOperation
| *camel.component.infinispan.password* | Define the password to access the infinispan instance |  | String
| *camel.component.infinispan.query-builder* | Specifies the query builder. The option is a org.apache.camel.component.infinispan.InfinispanQueryBuilder type. |  | InfinispanQueryBuilder
| *camel.component.infinispan.remapping-function* | Set a specific remappingFunction to use in a compute operation. The option is a java.util.function.BiFunction type. |  | BiFunction
| *camel.component.infinispan.result-header* | Store the operation result in a header instead of the message body. By default, resultHeader == null and the query result is stored in the message body, any existing content in the message body is discarded. If resultHeader is set, the value is used as the name of the header to store the query result and the original message body is preserved. This value can be overridden by an in message header named: CamelInfinispanOperationResultHeader. The option is a java.lang.Object type. |  | Object
| *camel.component.infinispan.sasl-mechanism* | Define the SASL Mechanism to access the infinispan instance |  | String
| *camel.component.infinispan.secure* | Define if we are connecting to a secured Infinispan instance | false | Boolean
| *camel.component.infinispan.security-realm* | Define the security realm to access the infinispan instance |  | String
| *camel.component.infinispan.security-server-name* | Define the security server name to access the infinispan instance |  | String
| *camel.component.infinispan.sync* | If true, the consumer will receive notifications synchronously | true | Boolean
| *camel.component.infinispan.username* | Define the username to access the infinispan instance |  | String
| *camel.component.infinispan.value* | Set a specific value for producer operations. The option is a java.lang.Object type. |  | Object
| *camel.component.infinispan.command* | *Deprecated* The operation to perform. | PUT | String
|===
// spring-boot-auto-configure options: END
