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

*Available as of Camel version 2.13*

http://www.jgroups.org[JGroups] is a toolkit for reliable multicast
communication. The *jgroups:* component provides exchange of messages
between Camel infrastructure and http://jgroups.org[JGroups] clusters.

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-jgroups</artifactId>
    <!-- use the same version as your Camel core version -->
    <version>x.y.z</version>
</dependency>
------------------------------------------------------------

== URI format

[source,java]
-----------------------------
jgroups:clusterName[?options]
-----------------------------

Where *clusterName* represents the name of the JGroups cluster the
component should connect to.

== Options




// component options: START
The JGroups component supports 4 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *channel* (common) | Channel to use |  | JChannel
| *channelProperties* (common) | Specifies configuration properties of the JChannel used by the endpoint. |  | String
| *enableViewMessages* (consumer) | If set to true, the consumer endpoint will receive org.jgroups.View messages as well (not only org.jgroups.Message instances). By default only regular messages are consumed by the endpoint. | 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
|===
// component options: END






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

----
jgroups:clusterName
----

with the following path and query parameters:

=== Path Parameters (1 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *clusterName* | *Required* The name of the JGroups cluster the component should connect to. |  | String
|===


=== Query Parameters (8 parameters):


[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *channelProperties* (common) | Specifies configuration properties of the JChannel used by the endpoint. |  | String
| *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
| *enableViewMessages* (consumer) | If set to true, the consumer endpoint will receive org.jgroups.View messages as well (not only org.jgroups.Message instances). By default only regular messages are consumed by the endpoint. | 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
| *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
| *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
// 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-jgroups-starter</artifactId>
  <version>x.x.x</version>
  <!-- use the same version as your Camel core version -->
</dependency>
----


The component supports 9 options, which are listed below.



[width="100%",cols="2,5,^1,2",options="header"]
|===
| Name | Description | Default | Type
| *camel.component.jgroups.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.jgroups.channel* | Channel to use. The option is a org.jgroups.JChannel type. |  | String
| *camel.component.jgroups.channel-properties* | Specifies configuration properties of the JChannel used by the endpoint. |  | String
| *camel.component.jgroups.enable-view-messages* | If set to true, the consumer endpoint will receive org.jgroups.View messages as well (not only org.jgroups.Message instances). By default only regular messages are consumed by the endpoint. | false | Boolean
| *camel.component.jgroups.enabled* | Enable jgroups component | true | Boolean
| *camel.component.jgroups.lock.cluster.service.enabled* | Sets if the jgroups lock cluster service should be enabled or not, default is false. | false | Boolean
| *camel.component.jgroups.lock.cluster.service.id* | Cluster Service ID |  | String
| *camel.component.jgroups.lock.cluster.service.jgroups-cluster-name* | JGroups Cluster name |  | String
| *camel.component.jgroups.lock.cluster.service.jgroups-config* | JGrups configuration File name |  | String
|===
// spring-boot-auto-configure options: END




== Headers

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

|`JGROUPS_ORIGINAL_MESSAGE` |`JGroupsEndpoint.HEADER_JGROUPS_ORIGINAL_MESSAGE` |The original `org.jgroups.Message` instance from which the body of the
consumed message has been extracted.

|`JGROUPS_SRC` |`JGroupsEndpoint.`HEADER_JGROUPS_SRC |*Consumer* : The `org.jgroups.Address` instance extracted by
`org.jgroups.Message`.getSrc() method of the consumed message. 
*Producer*: The custom source `org.jgroups.Address` of the message to be sent.

|`JGROUPS_DEST` |`JGroupsEndpoint.`HEADER_JGROUPS_DEST |*Consumer*: The `org.jgroups.Address` instance extracted by
`org.jgroups.Message`.getDest() method of the consumed message.
*Producer*: The custom destination `org.jgroups.Address` of the message to be sent.

|`JGROUPS_CHANNEL_ADDRESS` |`JGroupsEndpoint.`HEADER_JGROUPS_CHANNEL_ADDRESS |Address (`org.jgroups.Address`) of the channel associated with the
endpoint.
|=======================================================================
 
== Usage

Using `jgroups` component on the consumer side of the route will capture
messages received by the `JChannel` associated with the endpoint and
forward them to the Camel route. JGroups consumer processes incoming
messages
http://camel.apache.org/asynchronous-routing-engine.html[asynchronously].

[source,java]
----------------------------------------------
// Capture messages from cluster named
// 'clusterName' and send them to Camel route.
from("jgroups:clusterName").to("seda:queue");
----------------------------------------------

Using `jgroups` component on the producer side of the route will forward
body of the Camel exchanges to the `JChannel` instance managed by the
endpoint.

[source,java]
--------------------------------------------------
// Send message to the cluster named 'clusterName'
from("direct:start").to("jgroups:clusterName");
--------------------------------------------------

== Predefined filters

JGroups component comes with predefined filters factory class named `JGroupsFilters.`

If you would like to consume only view changes notifications sent to
coordinator of the cluster (and ignore these sent to the "slave" nodes),
use the `JGroupsFilters.dropNonCoordinatorViews()` filter. This filter
is particularly useful when you want a single Camel node to become the
master in the cluster, because messages passing this filter notifies you
when given node has become a coordinator of the cluster. The snippet
below demonstrates how to collect only messages received by the master
node.

[source,java]
----------------------------------------------------------------------------------------
import static org.apache.camel.component.jgroups.JGroupsFilters.dropNonCoordinatorViews;
...
from("jgroups:clusterName?enableViewMessages=true").
  filter(dropNonCoordinatorViews()).
  to("seda:masterNodeEventsQueue");
----------------------------------------------------------------------------------------

== Predefined expressions

JGroups component comes with predefined expressions factory class named `JGroupsExpressions.`

If you would like to create delayer that would affect
the route only if the Camel context has not been started yet, use the
`JGroupsExpressions.delayIfContextNotStarted(long delay)` factory
method. The expression created by this factory method will return given
delay value only if the Camel context is in the state different than
`started`. This expression is particularly useful if you would like to
use JGroups component for keeping singleton (master) route within the
cluster. xref:controlbus-component.adoc[Control Bus] `start` command
won't initialize the singleton route if the Camel Context hasn't been
yet started. So you need to delay a startup of the master route, to be
sure that it has been initialized after the Camel Context startup.
Because such scenario can happen only during the initialization of the
cluster, we don't want to delay startup of the slave node becoming the
new master - that's why we need a conditional delay expression.

The snippet below demonstrates how to use conditional delaying with the
JGroups component to delay the initial startup of master node in the
cluster.

[source,java]
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
import static java.util.concurrent.TimeUnit.SECONDS;
import static org.apache.camel.component.jgroups.JGroupsExpressions.delayIfContextNotStarted;
import static org.apache.camel.component.jgroups.JGroupsFilters.dropNonCoordinatorViews;
...
from("jgroups:clusterName?enableViewMessages=true").
  filter(dropNonCoordinatorViews()).
  threads().delay(delayIfContextNotStarted(SECONDS.toMillis(5))). // run in separated and delayed thread. Delay only if the context hasn't been started already. 
  to("controlbus:route?routeId=masterRoute&action=start&async=true");

from("timer://master?repeatCount=1").routeId("masterRoute").autoStartup(false).to(masterMockUri); 
-----------------------------------------------------------------------------------------------------------------------------------------------------------------

== Examples

=== Sending (receiving) messages to (from) the JGroups cluster

In order to send message to the JGroups cluster use producer endpoint,
just as demonstrated on the snippet below.

[source,java]
------------------------------------------------
from("direct:start").to("jgroups:myCluster");
...
producerTemplate.sendBody("direct:start", "msg")
------------------------------------------------

To receive the message from the snippet above (on the same or the other
physical machine) listen on the messages coming from the given cluster,
just as demonstrated on the code fragment below.

[source,java]
------------------------------------------------------------
mockEndpoint.setExpectedMessageCount(1);
mockEndpoint.message(0).body().isEqualTo("msg");
...
from("jgroups:myCluster").to("mock:messagesFromTheCluster");
...
mockEndpoint.assertIsSatisfied();
------------------------------------------------------------

=== Receive cluster view change notifications

The snippet below demonstrates how to create the consumer endpoint
listening to the notifications regarding cluster membership changes. By
default only regular messages are consumed by the endpoint.

[source,java]
---------------------------------------------------------------------
mockEndpoint.setExpectedMessageCount(1);
mockEndpoint.message(0).body().isInstanceOf(org.jgroups.View.class);
...
from("jgroups:clusterName?enableViewMessages=true").to(mockEndpoint);
...
mockEndpoint.assertIsSatisfied();
---------------------------------------------------------------------

=== Keeping singleton route within the cluster

The snippet below demonstrates how to keep the singleton consumer route
in the cluster of Camel Contexts. As soon as the master node dies, one
of the slaves will be elected as a new master and started. In this
particular example we want to keep singleton xref:jetty-component.adoc[jetty]
instance listening for the requests on
address` http://localhost:8080/orders`.

[source,java]
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
JGroupsLockClusterService service = new JGroupsLockClusterService();
service.setId("uniqueNodeId");
...
context.addService(service);

from("master:mycluster:jetty:http://localhost:8080/orders").to("jms:orders"); 
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
