// kafka-connector options: START
[[camel-weather-kafka-connector-sink]]
= camel-weather-kafka-connector sink configuration

When using camel-weather-kafka-connector as sink make sure to use the following Maven dependency to have support for the connector:

[source,xml]
----
<dependency>
  <groupId>org.apache.camel.kafkaconnector</groupId>
  <artifactId>camel-weather-kafka-connector</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel Kafka connector version -->
</dependency>
----


The camel-weather sink connector supports 34 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Priority
| *camel.sink.path.name* | The name value is not used. | null | ConfigDef.Importance.HIGH
| *camel.sink.endpoint.appid* | APPID ID used to authenticate the user connected to the API Server | null | ConfigDef.Importance.HIGH
| *camel.sink.endpoint.headerName* | To store the weather result in this header instead of the message body. This is useable if you want to keep current message body as-is. | null | ConfigDef.Importance.MEDIUM
| *camel.sink.endpoint.language* | Language of the response. One of: [en] [ru] [it] [es] [sp] [uk] [ua] [de] [pt] [ro] [pl] [fi] [nl] [fr] [bg] [sv] [se] [zh_tw] [zh] [zh_cn] [tr] [hr] [ca] | "en" | ConfigDef.Importance.MEDIUM
| *camel.sink.endpoint.mode* | The output format of the weather data. One of: [HTML] [JSON] [XML] | "JSON" | ConfigDef.Importance.MEDIUM
| *camel.sink.endpoint.period* | If null, the current weather will be returned, else use values of 5, 7, 14 days. Only the numeric value for the forecast period is actually parsed, so spelling, capitalisation of the time period is up to you (its ignored) | null | ConfigDef.Importance.MEDIUM
| *camel.sink.endpoint.units* | The units for temperature measurement. One of: [IMPERIAL] [METRIC] | null | ConfigDef.Importance.MEDIUM
| *camel.sink.endpoint.weatherApi* | The API to be use (current, forecast/3 hour, forecast daily, station) One of: [Current] [Station] [Hourly] [Daily] | null | ConfigDef.Importance.MEDIUM
| *camel.sink.endpoint.lazyStart 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 | ConfigDef.Importance.MEDIUM
| *camel.sink.endpoint.basic PropertyBinding* | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | ConfigDef.Importance.MEDIUM
| *camel.sink.endpoint.http ConnectionManager* | To use a custom HttpConnectionManager to manage connections | null | ConfigDef.Importance.MEDIUM
| * camel.sink.endpoint.synchronous* | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | ConfigDef.Importance.MEDIUM
| *camel.sink.endpoint.cnt* | Number of results to be found | null | ConfigDef.Importance.MEDIUM
| *camel.sink.endpoint.ids* | List of id's of city/stations. You can separate multiple ids by comma. | null | ConfigDef.Importance.MEDIUM
| *camel.sink.endpoint.lat* | Latitude of location. You can use lat and lon options instead of location. For boxed queries this is the bottom latitude. | null | ConfigDef.Importance.MEDIUM
| *camel.sink.endpoint.location* | If null Camel will try and determine your current location using the geolocation of your ip address, else specify the city,country. For well known city names, Open Weather Map will determine the best fit, but multiple results may be returned. Hence specifying and country as well will return more accurate data. If you specify current as the location then the component will try to get the current latitude and longitude and use that to get the weather details. You can use lat and lon options instead of location. | null | ConfigDef.Importance.MEDIUM
| *camel.sink.endpoint.lon* | Longitude of location. You can use lat and lon options instead of location. For boxed queries this is the left longtitude. | null | ConfigDef.Importance.MEDIUM
| *camel.sink.endpoint.rightLon* | For boxed queries this is the right longtitude. Needs to be used in combination with topLat and zoom. | null | ConfigDef.Importance.MEDIUM
| *camel.sink.endpoint.topLat* | For boxed queries this is the top latitude. Needs to be used in combination with rightLon and zoom. | null | ConfigDef.Importance.MEDIUM
| *camel.sink.endpoint.zip* | Zip-code, e.g. 94040,us | null | ConfigDef.Importance.MEDIUM
| *camel.sink.endpoint.zoom* | For boxed queries this is the zoom. Needs to be used in combination with rightLon and topLat. | null | ConfigDef.Importance.MEDIUM
| *camel.sink.endpoint.proxyAuth Domain* | Domain for proxy NTLM authentication | null | ConfigDef.Importance.MEDIUM
| *camel.sink.endpoint.proxyAuth Host* | Optional host for proxy NTLM authentication | null | ConfigDef.Importance.MEDIUM
| *camel.sink.endpoint.proxyAuth Method* | Authentication method for proxy, either as Basic, Digest or NTLM. | null | ConfigDef.Importance.MEDIUM
| *camel.sink.endpoint.proxyAuth Password* | Password for proxy authentication | null | ConfigDef.Importance.MEDIUM
| *camel.sink.endpoint.proxyAuth Username* | Username for proxy authentication | null | ConfigDef.Importance.MEDIUM
| *camel.sink.endpoint.proxyHost* | The proxy host name | null | ConfigDef.Importance.MEDIUM
| *camel.sink.endpoint.proxyPort* | The proxy port number | null | ConfigDef.Importance.MEDIUM
| * camel.sink.endpoint.geolocation AccessKey* | The geolocation service now needs an accessKey to be used | null | ConfigDef.Importance.HIGH
| * camel.sink.endpoint.geolocation RequestHostIP* | The geolocation service now needs to specify the IP associated to the accessKey you're using | null | ConfigDef.Importance.HIGH
| * camel.component.weather.geolocation AccessKey* | The geolocation service now needs an accessKey to be used | null | ConfigDef.Importance.MEDIUM
| * camel.component.weather.geolocation RequestHostIP* | The geolocation service now needs to specify the IP associated to the accessKey you're using | null | ConfigDef.Importance.MEDIUM
| *camel.component.weather.lazy StartProducer* | 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 | ConfigDef.Importance.MEDIUM
| *camel.component.weather.basic PropertyBinding* | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | ConfigDef.Importance.MEDIUM
|===
// kafka-connector options: END
