[rules-users] Drools Content Based Routing with Camel (John Ellis)

Mark Proctor mproctor at codehaus.org
Tue Jan 11 04:49:04 EST 2011


      http://blog.athico.com/2011/01/drools-content-based-routing-with-camel.html


      Drools Content Based Routing with Camel (John Ellis)
      <http://blog.athico.com/2011/01/drools-content-based-routing-with-camel.html>


John Ellis has done a nice writeup of his work on improving Drools to 
work with Camel for CBR. You'll need to use the latest version of Drools 
from trunk, which can be found in the maven repository that's 
5.2.0-SNAPSHOT, 
https://repository.jboss.org/nexus/content/groups/public/org/drools/.

For bonus points I'd love to see a further Drools and Camel tutorial 
around OSGi's EventAdmin, http://camel.apache.org/eventadmin.html <http://>.

One of Camel's greatest strengths is the explicit support for Enterprise 
Integration Patterns <http://www.eaipatterns.com/toc.html>. Drools 
itself is particularly well suited to work alongside Camel to implement 
two commonly used integration patterns: the Content Based Router and the 
Dynamic Router. Both patterns leverage the ability of a Drools Endpoint 
to rapidly evaluate properties of a message, while the Dynamic Router 
can also integrate the Drools Policy as a dynamic rule based on feedback 
from a control channel.

The Camel routes required for message routing do not differ much from 
the previous Drools Endpoint example. You may even be able to omit the 
Drools Policy if you wish to inspect only the headers of messages being 
routed instead of interrogating the body of each message. For example, a 
DRL could be defined that takes action on inbound messages such as:

import org.apache.camel.Message;
rule "WriteOperations"
when
     $message : Message(headers["OPERATION"] == "WRITE");
then
     $message.setHeader("routingSlip", "activemq:queue:op.write");
end

rule "ReadOperations"
when
     $message : Message(headers["OPERATION"] == "READ");
then
     $message.setHeader("routingSlip", "activemq:queue:op.read");
end


Example 1: DRL for Routing Based on Message Headers

Here the custom header "OPERATION" is evaluated to see if it is set to 
the value "WRITE" or "READ." Depending on the value of this header, a 
routing slip is defined for the message. The Routing Slip is another 
Enterprise Integration Pattern supported by Camel that may contain one 
or more URIs. The message is then sequentially sent to each URI defined.

The Camel routing itself is simply defined as:

<route>
     <from uri="activemq:queue:router"/>
     <to uri="drools:brokerNode/cbrKSession?action=insertMessage"/>
     <routingSlip uriDelimiter="#">
         <header>routingSlip</header>
     </routingSlip>
</route>


Example 2: Camel Routes for Content Based Routing

Here we explicitly inform Camel that routing slips are defined as values 
within the "routingSlip" header and each URI is delimited by a # 
character. The headers set within the DRL are then interpreted as each 
message exits the Drools endpoint.

Content based routing with a Drools Endpoint offers several advantages 
over Camel's default implementation. The DRL format itself allows 
routing to be specified more succinctly than Sprint DSLs or Camel 
RouteBuilders. Conditional operations are also evaluated more 
efficiently within Drools and are thread-safe, allowing a high volume of 
messages to be routed concurrently.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20110111/9549574a/attachment.html 


More information about the rules-users mailing list