[[BAMExample-BusinessActivityMonitorExample]]
Business Activity Monitor (BAM) Example
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

The link:bam.html[BAM] (Business Activity Monitor) example shows how to
monitor your transaction flows using Camel.

In this example we will use Camel to monitor a business process
consisting of

* purchase orders
* invoices

Then we will check to see that for every purchase order created by
system A, that system B will generate an invoice within the specified
amount of time (2 seconds in this example). If an invoice is not
generated within the allowed amount of time and error is generated and
sent to an link:endpoint.html[Endpoint].

[[BAMExample-Overview]]
Overview
^^^^^^^^

This example lives in the _examples/camel-example-bam_ directory. It
will poll the following directories

* the child _src/data/purchaseOrders_ directory for XML purchase orders
* the child _src/data/invoices_ directory for XML invoices

The
http://svn.apache.org/repos/asf/camel/trunk/examples/camel-example-bam/src/main/java/org/apache/camel/example/bam/MyActivities.java[MyActivities]
class defines the link:bam.html[BAM] activities; that is

* the input sources (the two directories above) which could be any of
the supported camel link:uris.html[URIs]
* how the activities relate to each other - namely the
link:correlation-identifier.html[Correlation Identifier] pattern
* the maixmum amount of time allowed from the time a purchase order is
received when if an invoice is not received an error should be raised.

There is also a spring configuration file in
http://svn.apache.org/repos/asf/camel/trunk/examples/camel-example-bam/src/main/resources/META-INF/spring/camel-context.xml[src/resources/META-INF/services/camel-context.xml]
which defines the JPA `EntityManagerFactory` and tells Camel to look in
the *org.apache.camel.example.bam* package to find its routes.

[[BAMExample-Codewalkthrough]]
Code walkthrough
^^^^^^^^^^^^^^^^

So lets start with the activities definition in
http://svn.apache.org/repos/asf/camel/trunk/examples/camel-example-bam/src/main/java/org/apache/camel/example/bam/MyActivities.java[MyActivities]

[source,java]
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
return new ProcessBuilder(entityManagerFactory, transactionTemplate) {
    public void configure() throws Exception {
 
        // let's define some activities, correlating on an XPath on the message bodies
        ActivityBuilder a = activity("seda:a").name("a")
                .correlate(xpath("/hello/@id"));
 
        ActivityBuilder b = activity("seda:b").name("b")
                .correlate(xpath("/hello/@id"));
 
        // now let's add some rules
        b.starts().after(a.completes())
                .expectWithin(seconds(1))
                .errorIfOver(seconds(errorTimeout)).to("mock:overdue");
    }
};
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------

The first two lines of code sets up the inputs for the
link:bam.html[BAM] activities via the *activity()* method which defines

* the link:uris.html[URIs] of the inputs (which could come from any of
the Camel link:components.html[Components]
* the link:correlation-identifier.html[Correlation Identifier] used to
correlate together the purchase order and invoice messages which can be
any link:expression.html[Expression] via any of the
link:languages-supported.html[Languages Supported]. In this case we are
using link:xpath.html[XPath].

Then the final line of code defines the temporal rules to use; namely
that it is considered to be an error if an invoice is not received
within 2 seconds of a purchase order being received. When a failure
occurs in this example we just send it to the link:log.html[Log]
component to log out an error level message to commons-logging / log4j.
You could change this to use some of the other
link:components.html[Components] such as link:activemq.html[ActiveMQ],
link:jms.html[JMS], link:irc.html[IRC], link:mail.html[Mail],
link:xmpp.html[XMPP] etc.

[[BAMExample-Runningtheexample]]
Running the example
^^^^^^^^^^^^^^^^^^^

To run the example we use the link:camel-maven-plugin.html[Camel Maven
Plugin]. For example from the source or binary distribution the
following should work

[source,bash]
-----------------------------
cd examples/camel-example-bam
mvn camel:run
-----------------------------

If you prefer you can just run the Main directly using

[source,bash]
---------------------
mvn compile exec:java
---------------------

Failing that you can run the Main from inside your IDE if you prefer.
Follow the link:building.html[Building] instructions to create an
Eclipse/IDEA project to import
