Since we're on a major migration process of this website, some component documents here are out of sync right now. In the meantime you may want to look at the asciidoc in the repository:

Business Activity Monitor (BAM) Example

The 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 Endpoint.


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 MyActivities class defines the BAM activities; that is

  • the input sources (the two directories above) which could be any of the supported camel URIs
  • how the activities relate to each other - namely the 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 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.

Code walkthrough

So lets start with the activities definition in MyActivities

Error rendering macro 'code': Invalid value specified for parameter 'java.lang.NullPointerException'
public class MyActivities extends ProcessBuilder {

    public MyActivities() {

    public MyActivities(EntityManagerFactory entityManagerFactory, TransactionTemplate transactionTemplate) {
        super(entityManagerFactory, transactionTemplate);

    public void configure() throws Exception {

        // let's define some activities, correlating on an XPath on the message bodies
        ActivityBuilder purchaseOrder = activity("file:src/data/purchaseOrders?noop=true")

        ActivityBuilder invoice = activity("file:src/data/invoices?noop=true&consumer.initialDelay=5000")

        // now let's add some BAM rules

The first two lines of code sets up the inputs for the BAM activities via the activity() method which defines

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 Log component to log out an error level message to commons-logging / log4j. You could change this to use some of the other Components such as ActiveMQ, JMS, IRC, Mail, XMPP etc.

Running the example

To run the example we use the Camel Maven Plugin. For example from the source or binary distribution the following should work

cd examples/camel-example-bam
mvn camel:run

If you prefer you can just run the Main directly using

mvn compile exec:java

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

© 2004-2015 The Apache Software Foundation.
Apache Camel, Camel, Apache, the Apache feather logo, and the Apache Camel project logo are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.
Graphic Design By Hiram