[[jgroups-component]]
= JGroups Component
//THIS FILE IS COPIED: EDIT THE SOURCE FILE:
:page-source: components/camel-jgroups/src/main/docs/jgroups-component.adoc
:docTitle: JGroups
:artifactId: camel-jgroups
:description: Exchange messages with JGroups clusters.
:since: 2.13
:supportLevel: Stable
:component-header: Both producer and consumer are supported

*Since Camel {since}*

*{component-header}*

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 6 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
| *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
| *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 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. The value can be one of: InOnly, InOut, InOptionalOut |  | 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




== 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"); 
-----------------------------------------------------------------------------------------------------------------------------------------------------------------

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