= Guava EventBus Component
:doctitle: Guava EventBus
:shortname: guava-eventbus
:artifactid: camel-guava-eventbus
:description: Send and receive messages to/from Guava EventBus.
:since: 2.10
:supportlevel: Stable
:component-header: Both producer and consumer are supported
//Manually maintained attributes
:camel-spring-boot-name: guava-eventbus

*Since Camel {since}*

*{component-header}*

The
https://google.github.io/guava/releases/19.0/api/docs/com/google/common/eventbus/EventBus.html[Google
Guava EventBus] allows publish-subscribe-style communication between
components without requiring the components to explicitly register with
one another (and thus be aware of each other). The *guava-eventbus:*
component provides integration bridge between Camel and
https://google.github.io/guava/releases/19.0/api/docs/com/google/common/eventbus/EventBus.html[Google
Guava EventBus] infrastructure. With the latter component, messages
exchanged with the Guava `EventBus` can be transparently forwarded to
the Camel routes. EventBus component allows also to route body of Camel
exchanges to the Guava `EventBus`.

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

== URI format

--------------------------------
guava-eventbus:busName[?options]
--------------------------------

Where *busName* represents the name of the
`com.google.common.eventbus.EventBus` instance located in the Camel
registry.


// component-configure options: START

// component-configure options: END

// component options: START
include::partial$component-configure-options.adoc[]
include::partial$component-endpoint-options.adoc[]
// component options: END

// endpoint options: START

// endpoint options: END


== Usage

Using `guava-eventbus` component on the consumer side of the route will
capture messages sent to the Guava `EventBus` and forward them to the
Camel route. Guava EventBus consumer processes incoming messages
http://camel.apache.org/asynchronous-routing-engine.html[asynchronously].

[source,java]
-------------------------------------------------------
SimpleRegistry registry = new SimpleRegistry();
EventBus eventBus = new EventBus();
registry.put("busName", eventBus);
CamelContext camel = new DefaultCamelContext(registry);

from("guava-eventbus:busName").to("seda:queue");

eventBus.post("Send me to the SEDA queue.");
-------------------------------------------------------

Using `guava-eventbus` component on the producer side of the route will
forward body of the Camel exchanges to the Guava `EventBus` instance.

[source,java]
----------------------------------------------------------------------
SimpleRegistry registry = new SimpleRegistry();
EventBus eventBus = new EventBus();
registry.put("busName", eventBus);
CamelContext camel = new DefaultCamelContext(registry);

from("direct:start").to("guava-eventbus:busName");

ProducerTemplate producerTemplate = camel.createProducerTemplate();
producer.sendBody("direct:start", "Send me to the Guava EventBus.");

eventBus.register(new Object(){
  @Subscribe
  public void messageHander(String message) {
    System.out.println("Message received from the Camel: " + message);
  }
});
----------------------------------------------------------------------

== DeadEvent considerations

Keep in mind that due to the limitations caused by the design of the
Guava EventBus, you cannot specify event class to be received by the
listener without creating class annotated with `@Subscribe` method. This
limitation implies that endpoint with `eventClass` option specified
actually listens to all possible events (`java.lang.Object`) and filter
appropriate messages programmatically at runtime. The snipped below
demonstrates an appropriate excerpt from the Camel code base.

[source,java]
----------------------------------------------------------------------------
@Subscribe
public void eventReceived(Object event) {
  if (eventClass == null || eventClass.isAssignableFrom(event.getClass())) {
    doEventReceived(event);
...
----------------------------------------------------------------------------

This drawback of this approach is that `EventBus` instance used by Camel
will never generate `com.google.common.eventbus.DeadEvent`
notifications. If you want Camel to listen only to the precisely
specified event (and therefore enable `DeadEvent` support), use
`listenerInterface` endpoint option. Camel will create dynamic proxy
over the interface you specify with the latter option and listen only to
messages specified by the interface handler methods. The example of the
listener interface with single method handling only `SpecificEvent`
instances is demonstrated below.

[source,java]
------------------------------------------
package com.example;

public interface CustomListener {

  @Subscribe
  void eventReceived(SpecificEvent event);

}
------------------------------------------

The listener presented above could be used in the endpoint definition as
follows.

[source,java]
---------------------------------------------------------------------------------------------
from("guava-eventbus:busName?listenerInterface=com.example.CustomListener").to("seda:queue");
---------------------------------------------------------------------------------------------

== Consuming multiple type of events

In order to define multiple type of events to be consumed by Guava
EventBus consumer use `listenerInterface` endpoint option, as listener
interface could provide multiple methods marked with the `@Subscribe`
annotation.

[source,java]
------------------------------------------------
package com.example;

public interface MultipleEventsListener {

  @Subscribe
  void someEventReceived(SomeEvent event);

  @Subscribe
  void anotherEventReceived(AnotherEvent event);

}
------------------------------------------------

The listener presented above could be used in the endpoint definition as
follows.

[source,java]
-----------------------------------------------------------------------------------------------------
from("guava-eventbus:busName?listenerInterface=com.example.MultipleEventsListener").to("seda:queue");
-----------------------------------------------------------------------------------------------------


include::spring-boot:partial$starter.adoc[]
