[[zookeeper-master-component]]
= ZooKeeper Master Component
//THIS FILE IS COPIED: EDIT THE SOURCE FILE:
:page-source: components/camel-zookeeper-master/src/main/docs/zookeeper-master-component.adoc
:docTitle: ZooKeeper Master
:artifactId: camel-zookeeper-master
:description: Have only a single consumer in a cluster consuming from a given endpoint; with automatic failover if the JVM dies.
:since: 2.19
:supportLevel: Stable
:component-header: Only consumer is supported

*Since Camel {since}*

*{component-header}*

The **zookeeper-master:** endpoint provides a way to ensure only a single consumer in a cluster consumes from a given endpoint;
with automatic failover if that JVM dies.

This can be very useful if you need to consume from some legacy back end which either doesn't support concurrent
consumption or due to commercial or stability reasons you can only have a single connection at any point in time.

== Using the master endpoint

Just prefix any camel endpoint with **zookeeper-master:someName:** where _someName_ is a logical name and is
used to acquire the master lock. e.g.

```
from("zookeeper-master:cheese:jms:foo").to("activemq:wine");
```
The above simulates the [Exclusive Consumers](http://activemq.apache.org/exclusive-consumer.html) type feature in
ActiveMQ; but on any third party JMS provider which maybe doesn't support exclusive consumers.


== URI format

[source]
----
zookeeper-master:name:endpoint[?options]
----

Where endpoint is any Camel endpoint you want to run in master/slave mode.


== Options

// component options: START
The ZooKeeper Master component supports 8 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *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
| *maximumConnectionTimeout* (consumer) | Timeout in millis to use when connecting to the zookeeper ensemble | 10000 | int
| *zkRoot* (consumer) | The root path to use in zookeeper where information is stored which nodes are master/slave etc. Will by default use: /camel/zookeepermaster/clusters/master | /camel/zookeepermaster/clusters/master | String
| *zooKeeperUrl* (consumer) | The url for the zookeeper ensemble | localhost:2181 | String
| *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
| *containerIdFactory* (advanced) | To use a custom ContainerIdFactory for creating container ids. |  | ContainerIdFactory
| *curator* (advanced) | To use a custom configured CuratorFramework as connection to zookeeper ensemble. |  | CuratorFramework
| *zooKeeperPassword* (security) | The password to use when connecting to the zookeeper ensemble |  | String
|===
// component options: END

// endpoint options: START
The ZooKeeper Master endpoint is configured using URI syntax:

----
zookeeper-master:groupName:consumerEndpointUri
----

with the following path and query parameters:

=== Path Parameters (2 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *groupName* | *Required* The name of the cluster group to use |  | String
| *consumerEndpointUri* | *Required* The consumer endpoint to use in master/slave mode |  | String
|===


=== Query Parameters (5 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *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
| *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. The value can be one of: InOnly, InOut, InOptionalOut |  | ExchangePattern
| *basicPropertyBinding* (advanced) | Whether the endpoint should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
| *synchronous* (advanced) | Sets whether synchronous processing should be strictly used, or Camel is allowed to use asynchronous processing (if supported). | false | boolean
|===
// endpoint options: END


== Example

You can protect a clustered Camel application to only consume files from one active node.


[source,java]
----
    // the file endpoint we want to consume from
    String url = "file:target/inbox?delete=true";

    // use the zookeeper master component in the clustered group named myGroup
    // to run a master/slave mode in the following Camel url
    from("zookeeper-master:myGroup:" + url)
        .log(name + " - Received file: ${file:name}")
        .delay(delay)
        .log(name + " - Done file:     ${file:name}")
        .to("file:target/outbox");
----

ZooKeeper will by default connect to `localhost:2181`, but you can configure this on the component level.

[source,java]
----
    MasterComponent master = new MasterComponent();
    master.setZooKeeperUrl("myzookeeper:2181");
----

However you can also configure the url of the ZooKeeper ensemble using environment variables.

    export ZOOKEEPER_URL = "myzookeeper:2181"

== Master RoutePolicy

You can also use a `RoutePolicy` to control routes in master/slave mode.

When doing so you must configure the route policy with

- url to zookeeper ensemble
- name of cluster group
- *important* and set the route to not auto startup

A little example

[source,java]
----
    MasterRoutePolicy master = new MasterRoutePolicy();
    master.setZooKeeperUrl("localhost:2181");
    master.setGroupName("myGroup");

    // its import to set the route to not auto startup
    // as we let the route policy start/stop the routes when it becomes a master/slave etc
    from("file:target/inbox?delete=true").noAutoStartup()
        // use the zookeeper master route policy in the clustered group
        // to run this route in master/slave mode
        .routePolicy(master)
        .log(name + " - Received file: ${file:name}")
        .delay(delay)
        .log(name + " - Done file:     ${file:name}")
        .to("file:target/outbox");
----


include::camel-spring-boot::page$zookeeper-master-starter.adoc[]
