[[hazelcast-instance-component]]
= Hazelcast Instance Component
//THIS FILE IS COPIED: EDIT THE SOURCE FILE:
:page-source: components/camel-hazelcast/src/main/docs/hazelcast-instance-component.adoc
:docTitle: Hazelcast Instance
:artifactId: camel-hazelcast
:description: Consume join/leave events of a cache instance in a Hazelcast cluster.
:since: 2.7
:supportLevel: Stable
:component-header: Only consumer is supported
//Manually maintained attributes
:group: Hazelcast

*Since Camel {since}*

*{component-header}*

The http://www.hazelcast.com/[Hazelcast] instance component is one of Camel Hazelcast Components which allows you to consume join/leave events of the cache instance in the cluster.
Hazelcast makes sense in one single "server node", but it's extremly powerful in a clustered environment.

*This endpoint provides no producer!*


== Options

// component options: START
The Hazelcast Instance component supports 4 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
| *basicPropertyBinding* (advanced) | Whether the component should use basic property binding (Camel 2.x) or the newer property binding with additional capabilities | false | boolean
| *hazelcastInstance* (advanced) | The hazelcast instance reference which can be used for hazelcast endpoint. If you don't specify the instance reference, camel use the default hazelcast instance from the camel-hazelcast instance. |  | HazelcastInstance
| *hazelcastMode* (advanced) | The hazelcast mode reference which kind of instance should be used. If you don't specify the mode, then the node mode will be the default. | node | String
|===
// component options: END
// endpoint options: START
The Hazelcast Instance endpoint is configured using URI syntax:

----
hazelcast-instance:cacheName
----

with the following path and query parameters:

=== Path Parameters (1 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *cacheName* | *Required* The name of the cache |  | String
|===


=== Query Parameters (8 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
| *defaultOperation* (consumer) | To specify a default operation to use, if no operation header has been provided. The value can be one of: put, delete, get, update, query, getAll, clear, putIfAbsent, allAll, removeAll, retainAll, evict, evictAll, valueCount, containsKey, containsValue, keySet, removevalue, increment, decrement, setvalue, destroy, compareAndSet, getAndAdd, add, offer, peek, poll, remainingCapacity, drainTo, removeIf, take, publish, readOnceHeal, readOnceTail, capacity |  | HazelcastOperation
| *hazelcastInstance* (consumer) | The hazelcast instance reference which can be used for hazelcast endpoint. |  | HazelcastInstance
| *hazelcastInstanceName* (consumer) | The hazelcast instance reference name which can be used for hazelcast endpoint. If you don't specify the instance reference, camel use the default hazelcast instance from the camel-hazelcast instance. |  | String
| *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




== instance consumer - from("hazelcast-instance:foo")

 The instance consumer fires if a new cache instance will join or leave the cluster.
 
Here's a sample:

[source,java]
-----------------------------------------------------------------------------------------
fromF("hazelcast-%sfoo", HazelcastConstants.INSTANCE_PREFIX)
.log("instance...")
.choice()
    .when(header(HazelcastConstants.LISTENER_ACTION).isEqualTo(HazelcastConstants.ADDED))
        .log("...added")
        .to("mock:added")
    .otherwise()
        .log("...removed")
        .to("mock:removed");
-----------------------------------------------------------------------------------------

Each event provides the following information inside the message header:

Header Variables inside the response message:


[width="100%",cols="10%,10%,80%",options="header",]
|=======================================================================
|Name |Type |Description

|`CamelHazelcastListenerTime` |`Long` |time of the event in millis

|`CamelHazelcastListenerType` |`String` |the map consumer sets here "instancelistener"

|`CamelHazelcastListenerAction` |`String` |type of event - here *added* or *removed*.

|`CamelHazelcastInstanceHost` |`String` | host name of the instance

|`CamelHazelcastInstancePort` |`Integer` |port number of the instance
|=======================================================================

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