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

== Spring Boot Auto-Configuration

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


The component supports 16 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *camel.component.yammer.access-token* | The access token |  | String
| *camel.component.yammer.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.yammer.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.yammer.configuration* | Component configuration. The option is a org.apache.camel.component.yammer.YammerConfiguration type. |  | YammerConfiguration
| *camel.component.yammer.consumer-key* | The consumer key |  | String
| *camel.component.yammer.consumer-secret* | The consumer secret |  | String
| *camel.component.yammer.delay* | Delay between polling in millis. The option is a long type. | 5000 | Long
| *camel.component.yammer.enabled* | Whether to enable auto configuration of the yammer component. This is enabled by default. |  | Boolean
| *camel.component.yammer.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.yammer.limit* | Return only the specified number of messages. Works for threaded set to true and threaded set to extended. | -1 | Integer
| *camel.component.yammer.newer-than* | Returns messages newer than the message ID specified as a numeric string. This should be used when polling for new messages. If you're looking at messages, and the most recent message returned is 3516, you can make a request with the parameter newerThan equals to 3516 to ensure that you do not get duplicate copies of messages already on your page. | -1 | Long
| *camel.component.yammer.older-than* | Returns messages older than the message ID specified as a numeric string. This is useful for paginating messages. For example, if you're currently viewing 20 messages and the oldest is number 2912, you could append olderThan equals to 2912 to your request to get the 20 messages prior to those you're seeing. | -1 | Long
| *camel.component.yammer.requestor* | To use a specific requester to communicate with Yammer. The option is a org.apache.camel.component.yammer.ApiRequestor type. |  | ApiRequestor
| *camel.component.yammer.threaded* | threaded equals to true will only return the first message in each thread. This parameter is intended for apps which display message threads collapsed. threaded equals to extended will return the thread starter messages in order of most recently active as well as the two most recent messages, as they are viewed in the default view on the Yammer web interface. |  | String
| *camel.component.yammer.use-json* | Set to true if you want to use raw JSON rather than converting to POJOs. | false | Boolean
| *camel.component.yammer.user-id* | The user id |  | String
|===
// spring-boot-auto-configure options: END
