## Custom Load Balancer EIP
You can use a custom load balancer (eg your own implementation) also.


// eip options: START
The Custom Load Balancer EIP supports 1 options which are listed below:


[width="100%",cols="3,1m,6",options="header"]
|=======================================================================
| Name | Java Type | Description
| ref | String | *Required* Refers to the custom load balancer to lookup from the registry
|=======================================================================
// eip options: END


An example using Java DSL:
[source,java]
--------------------------------------------------------
from("direct:start")
    // using our custom load balancer
    .loadBalance(new MyLoadBalancer())
    .to("mock:x", "mock:y", "mock:z");
--------------------------------------------------------

And the same example using XML DSL:
[source,xml]
--------------------------------------------------------
<!-- this is the implementation of our custom load balancer -->
<bean id="myBalancer" class="org.apache.camel.processor.CustomLoadBalanceTest$MyLoadBalancer"/>

<camelContext xmlns="http://camel.apache.org/schema/spring">
  <route>
    <from uri="direct:start"/>
    <loadBalance>
      <!-- refer to my custom load balancer -->
      <custom ref="myBalancer"/>
      <!-- these are the endpoints to balancer -->
      <to uri="mock:x"/>
      <to uri="mock:y"/>
      <to uri="mock:z"/>
    </loadBalance>
  </route>
</camelContext>
--------------------------------------------------------

Notice in the XML DSL above we use <custom> which is only available in *Camel 2.8* onwards. In older releases you would have to do as follows instead:
[source,xml]
--------------------------------------------------------
<loadBalance ref="myBalancer">
  <!-- these are the endpoints to balancer -->
  <to uri="mock:x"/>
  <to uri="mock:y"/>
  <to uri="mock:z"/>
</loadBalance>
--------------------------------------------------------

To implement a custom load balancer you can extend some support classes such as `LoadBalancerSupport` and `SimpleLoadBalancerSupport`.
The former supports the asynchronous routing engine, and the latter does not. Here is an example of a custom load balancer implementation:
[source,java]
--------------------------------------------------------
public static class MyLoadBalancer extends LoadBalancerSupport {

    public boolean process(Exchange exchange, AsyncCallback callback) {
        String body = exchange.getIn().getBody(String.class);
        try {
            if ("x".equals(body)) {
                getProcessors().get(0).process(exchange);
            } else if ("y".equals(body)) {
                getProcessors().get(1).process(exchange);
            } else {
                getProcessors().get(2).process(exchange);
            }
        } catch (Throwable e) {
            exchange.setException(e);
        }
        callback.done(true);
        return true;
    }
}
--------------------------------------------------------
