ServiceMix Drools
The ServiceMix Drools component provides JBI integration to the Drools Rules Engine.
This Service Engine can be used to deploy a rules set that will implement a router or an actual service.
A router will mostly act as a transparent proxy between the consumer and the target service provider mad will mostly be implemented by the jbi.route(uri) method below. This method creates a new exchange identical to the one received by the component and will send it to the specified destination. You can also send back a Fault if needed. A router can also be implemented by using directly the JBI Apis (available with the jbi helper) by using the provided client.
This component can also be used to implement a real service, as shown in the Fibonnacci example
. The service can act as a consumer and create / send exchanges by using the client provided by the jbi helper.
Note that this component is only available in releases >= 3.1 and deprecate the older lightweight Drools component
JbiHelper
DRL files deployed to the servicemix-drools engine have access to a JbiHelper class in a global variable named jbi which provides the following attributes and methods:
Attribute |
Description |
jbi.getEndpoint() |
The DroolsEndpoint using this DRL |
jbi.getContent() |
A ComponentContext for this endpoint |
jbi.getChannel() |
A DeliveryChannel for this endpoint (no accept allowed) |
jbi.getClient() |
A ServiceMixClient on top of this endpoint |
jbi.getExchange() |
The Exchange received |
jbi.getLogger() |
A org.apache.commons.logging.Log logger |
Methods |
Description |
jbi.route(uri) |
Route the current exchange to the given uri |
jbi.fault(content) |
Returns a fault using the given string as the xml fault |
jbi.answer(content) |
Sends an Out message using the given string as the xml content |
The received exchange is added as a fact to the working memory.
Note that, due to Drools limited support for non simple java beans accessors, the JBI MessageExchange and NormalizedMessage are wrapped with simple beans.
Router
<drools:endpoint service="test:service"
endpoint="endpoint"
ruleBaseResource="classpath:router.drl" />
package org.apache.servicemix.drools
import org.apache.servicemix.drools.model.Exchange;
global org.apache.servicemix.drools.model.JbiHelper jbi;
rule "Unspecified id"
when
me : Exchange( status == Exchange.ACTIVE, in : in != null )
eval( in.xpath("/test/@id <= 0") )
then
jbi.fault( "<fault>Id must be > 0</fault>" );
end
rule "Route to target1"
when
me : Exchange( status == Exchange.ACTIVE, in : in != null )
eval( in.xpath("/test/@id = 1") )
then
jbi.route( "service::target1" );
end
rule "Route to target2"
when
me : Exchange( status == Exchange.ACTIVE, in : in != null )
eval( in.xpath("/test/@id = 2") )
then
jbi.route( "service::target2" );
end
rule "Route to target3"
when
me : Exchange( status == Exchange.ACTIVE, in : in != null )
eval( in.getProperty("prop") != null )
then
jbi.route( "service::target3" );
end