[[weather-component]]
= Weather Component
:page-source: components/camel-weather/src/main/docs/weather-component.adoc

*Available as of Camel version 2.12*

The Weather component is used for polling weather information from
http://openweathermap.org[Open Weather Map] - a site that provides free
global weather and forecast information. The information is returned as
a json String object.

Camel will poll for updates to the current weather and forecasts once
per hour by default. It can also be used to query the weather api based
on the parameters defined on the endpoint which is used as producer.

Maven users will need to add the following dependency to their `pom.xml`
for this component:

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

== URI format

[source,java]
---------------------------------
weather://<unused name>[?options]
---------------------------------

== REMARK

Since the 9th of October, an Api Key is required to access the
openweather service. This key is passed as parameter to the URI
definition of the weather endpoint using the appid param !

== Geolocation provider

Since July 2018 FreegeoIP is no longer available. The camel-weather component was using this API.
We switch to https://github.com/apilayer/freegeoip#readme[IPstack] so you'll need to specify and Access Key and the IP 
from where you're using the API now on.

== Options


// component options: START
The Weather component supports 3 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *geolocationAccessKey* (common) | The geolocation service now needs an accessKey to be used |  | String
| *geolocationRequestHost IP* (common) | The geolocation service now needs to specify the IP associated to the accessKey you're using |  | String
| *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
|===
// component options: END



// endpoint options: START
The Weather endpoint is configured using URI syntax:

----
weather:name
----

with the following path and query parameters:

=== Path Parameters (1 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *name* | *Required* The name value is not used. |  | String
|===


=== Query Parameters (48 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *appid* (common) | *Required* APPID ID used to authenticate the user connected to the API Server |  | String
| *headerName* (common) | 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. |  | String
| *language* (common) | Language of the response. | en | WeatherLanguage
| *mode* (common) | The output format of the weather data. | JSON | WeatherMode
| *period* (common) | 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) |  | String
| *units* (common) | The units for temperature measurement. |  | WeatherUnits
| *weatherApi* (common) | The API to be use (current, forecast/3 hour, forecast daily, station) |  | WeatherApi
| *bridgeErrorHandler* (consumer) | 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
| *sendEmptyMessageWhenIdle* (consumer) | If the polling consumer did not poll any files, you can enable this option to send an empty message (no body) instead. | false | boolean
| *exceptionHandler* (consumer) | To let the consumer use a custom ExceptionHandler. Notice if the option bridgeErrorHandler is enabled then this option is not in use. By default the consumer will deal with exceptions, that will be logged at WARN or ERROR level and ignored. |  | ExceptionHandler
| *exchangePattern* (consumer) | Sets the exchange pattern when the consumer creates an exchange. |  | ExchangePattern
| *pollStrategy* (consumer) | A pluggable org.apache.camel.PollingConsumerPollingStrategy allowing you to provide your custom implementation to control error handling usually occurred during the poll operation before an Exchange have been created and being routed in Camel. |  | PollingConsumerPollStrategy
| *lazyStartProducer* (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
| *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
| *httpConnectionManager* (advanced) | To use a custom HttpConnectionManager to manage connections |  | HttpConnectionManager
| *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
| *backoffErrorThreshold* (scheduler) | The number of subsequent error polls (failed due some error) that should happen before the backoffMultipler should kick-in. |  | int
| *backoffIdleThreshold* (scheduler) | The number of subsequent idle polls that should happen before the backoffMultipler should kick-in. |  | int
| *backoffMultiplier* (scheduler) | To let the scheduled polling consumer backoff if there has been a number of subsequent idles/errors in a row. The multiplier is then the number of polls that will be skipped before the next actual attempt is happening again. When this option is in use then backoffIdleThreshold and/or backoffErrorThreshold must also be configured. |  | int
| *delay* (scheduler) | Milliseconds before the next poll. You can also specify time values using units, such as 60s (60 seconds), 5m30s (5 minutes and 30 seconds), and 1h (1 hour). | 500 | long
| *greedy* (scheduler) | If greedy is enabled, then the ScheduledPollConsumer will run immediately again, if the previous run polled 1 or more messages. | false | boolean
| *initialDelay* (scheduler) | Milliseconds before the first poll starts. You can also specify time values using units, such as 60s (60 seconds), 5m30s (5 minutes and 30 seconds), and 1h (1 hour). | 1000 | long
| *repeatCount* (scheduler) | Specifies a maximum limit of number of fires. So if you set it to 1, the scheduler will only fire once. If you set it to 5, it will only fire five times. A value of zero or negative means fire forever. | 0 | long
| *runLoggingLevel* (scheduler) | The consumer logs a start/complete log line when it polls. This option allows you to configure the logging level for that. | TRACE | LoggingLevel
| *scheduledExecutorService* (scheduler) | Allows for configuring a custom/shared thread pool to use for the consumer. By default each consumer has its own single threaded thread pool. |  | ScheduledExecutorService
| *scheduler* (scheduler) | To use a cron scheduler from either camel-spring or camel-quartz component | none | String
| *schedulerProperties* (scheduler) | To configure additional properties when using a custom scheduler or any of the Quartz, Spring based scheduler. |  | Map
| *startScheduler* (scheduler) | Whether the scheduler should be auto started. | true | boolean
| *timeUnit* (scheduler) | Time unit for initialDelay and delay options. | MILLISECONDS | TimeUnit
| *useFixedDelay* (scheduler) | Controls if fixed delay or fixed rate is used. See ScheduledExecutorService in JDK for details. | true | boolean
| *cnt* (filter) | Number of results to be found |  | Integer
| *ids* (filter) | List of id's of city/stations. You can separate multiple ids by comma. |  | String
| *lat* (filter) | Latitude of location. You can use lat and lon options instead of location. For boxed queries this is the bottom latitude. |  | String
| *location* (filter) | 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. |  | String
| *lon* (filter) | Longitude of location. You can use lat and lon options instead of location. For boxed queries this is the left longtitude. |  | String
| *rightLon* (filter) | For boxed queries this is the right longtitude. Needs to be used in combination with topLat and zoom. |  | String
| *topLat* (filter) | For boxed queries this is the top latitude. Needs to be used in combination with rightLon and zoom. |  | String
| *zip* (filter) | Zip-code, e.g. 94040,us |  | String
| *zoom* (filter) | For boxed queries this is the zoom. Needs to be used in combination with rightLon and topLat. |  | Integer
| *proxyAuthDomain* (proxy) | Domain for proxy NTLM authentication |  | String
| *proxyAuthHost* (proxy) | Optional host for proxy NTLM authentication |  | String
| *proxyAuthMethod* (proxy) | Authentication method for proxy, either as Basic, Digest or NTLM. |  | String
| *proxyAuthPassword* (proxy) | Password for proxy authentication |  | String
| *proxyAuthUsername* (proxy) | Username for proxy authentication |  | String
| *proxyHost* (proxy) | The proxy host name |  | String
| *proxyPort* (proxy) | The proxy port number |  | Integer
| *geolocationAccessKey* (security) | *Required* The geolocation service now needs an accessKey to be used |  | String
| *geolocationRequestHostIP* (security) | *Required* The geolocation service now needs to specify the IP associated to the accessKey you're using |  | String
|===
// endpoint options: END
// spring-boot-auto-configure options: START
== Spring Boot Auto-Configuration

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

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


The component supports 4 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *camel.component.weather.basic-property-binding* | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | Boolean
| *camel.component.weather.enabled* | Enable weather component | true | Boolean
| *camel.component.weather.geolocation-access-key* | The geolocation service now needs an accessKey to be used |  | String
| *camel.component.weather.geolocation-request-host-i-p* | The geolocation service now needs to specify the IP associated to the accessKey you're using |  | String
|===
// spring-boot-auto-configure options: END



You can append query options to the URI in the following format,
`?option=value&option=value&...`

== Exchange data format

Camel will deliver the body as a json formatted java.lang.String (see
the `mode` option above).

== Message Headers

[width="100%",cols="10%,90%",options="header",]
|=======================================================================
|Header |Description

|`CamelWeatherQuery` |The original query URL sent to the Open Weather Map site

|`CamelWeatherLocation` |Used by the producer to override the endpoint location and use the
location from this header instead.
|=======================================================================

== Samples

In this sample we find the 7 day weather forecast for Madrid, Spain:

[source,java]
---------------------------------------------------------------------------------------------
from("weather:foo?location=Madrid,Spain&period=7 days&appid=APIKEY&geolocationAccessKey=IPSTACK_ACCESS_KEY&geolocationRequestHostIP=LOCAL_IP").to("jms:queue:weather");
---------------------------------------------------------------------------------------------

To just find the current weather for your current location you can use
this:

[source,java]
---------------------------------------------------------
from("weather:foo?appid=APIKEY&geolocationAccessKey=IPSTACK_ACCESS_KEY&geolocationRequestHostIP=LOCAL_IP").to("jms:queue:weather");
---------------------------------------------------------

And to find the weather using the producer we do:

[source,java]
--------------------------------------------------------
from("direct:start")
  .to("weather:foo?location=Madrid,Spain&appid=APIKEY&geolocationAccessKey=IPSTACK_ACCESS_KEY&geolocationRequestHostIP=LOCAL_IP");
--------------------------------------------------------

And we can send in a message with a header to get the weather for any
location as shown:

[source,java]
-------------------------------------------------------------------------------------------------------------------------------------
  String json = template.requestBodyAndHeader("direct:start", "", "CamelWeatherLocation", "Paris,France&appid=APIKEY", String.class);
-------------------------------------------------------------------------------------------------------------------------------------

And to get the weather at the current location, then:

[source,java]
--------------------------------------------------------------------------------------------------------------------------------
  String json = template.requestBodyAndHeader("direct:start", "", "CamelWeatherLocation", "current&appid=APIKEY", String.class);
--------------------------------------------------------------------------------------------------------------------------------
