Improving performance advices
by Costigliola Joel (EXT)
Hello,
I would like to improve the performance of my Drools process, I have two questions on my current implementation, one regarding updating fact and the other retracting them.
Before asking, I need to explain in few words the problem I want to solve with Drools.
My company is a bank where traders are making deals on markets, these deals must be classified in book, this is what we call "booking process".
Booking is done according to booking criteria : which trader has made the deal ? on which product ? etc ...
A booking rule defines a set of criteria and the target book where the deal will classified.
I'm using Drools to :
1. find all booking rules matching deals made by traders
2. apply the right booking rule on the deal among the ones matching the deal
I have defined a flow composed of 3 steps/rules group, each group has one rule, here's the flow and the rules.
Flow :
------
"Find matching booking rules by deal group" -> "Refresh" -> "Apply booking rule group"
Rules :
------
The job of this rule is to store in DealMatchingBookingRules all the booking rule matching a specific deal (each DealMatchingBookingRules instance has a unique Deal).
rule "Find matching booking rules by deal"
salience 10
no-loop
ruleflow-group "Find matching booking rules by deal group"
when
$dealMatchingBookingRules : DealMatchingBookingRules($dealModel : deal)
$dealProductRelatedIndexes : ProductRelatedIndexes(product.internalCode == $dealModel.product.internalCode)
$bookingRule : BTExecutionBookingRuleModel (
// when a criterion is not set, it is considered as satisfied.
(traderCriterion == null || $dealModel.trader == traderCriterion)
&& (portfolioCriterion == null || $dealModel.portfolio == portfolioCriterion)
// when a product type criterion is set to unknown, it is considered as satisfied whatever deal product type is.
&& (productTypeStringCriterion == null || productTypeCriterion == ProductType.Unknown
|| $dealModel.product.productType == productTypeCriterion)
&& (listedIndexCriterion == null || $dealProductRelatedIndexes.relatedIndexes contains listedIndexCriterion)
)
then
$dealMatchingBookingRules.addMatchingBookingRule($bookingRule);
end
This second step is only here to tell Drools that DealMatchingBookingRules have changed, this is needed for the next step.
I can't call "update($dealMatchingBookingRules)" in the previous rule, because if 2 booking rule matches the same deal, an infinite loop occurs.
My explanation is the following one (as far as I understand how Drools works) :
1 - Drools rule is activated for first booking rule => $dealMatchingBookingRules is updated
2 - Drools rule is activated for second booking rule => $dealMatchingBookingRules is updated
3 - since $dealMatchingBookingRules has been updated for Drools it will execute again the rule for first booking rule
4 - since $dealMatchingBookingRules has been updated for Drools it will execute again the rule for second booking rule
It continues to execute step 3, then step 4, then step 3 ... infinite loop !
Question :
Is there a better way of telling Drools that DealMatchingBookingRules have changed and avoid activating the rule again ?
If none, can I update all DealMatchingBookingRules more efficiently ?
rule "Refresh"
salience 5
no-loop
ruleflow-group "Refresh"
when
$dealMatchingBookingRules : DealMatchingBookingRules()
then
update($dealMatchingBookingRules);
end
Last rule job (and last flow step), is to determine which booking rule to apply among the ones matching a specific deal.
When we find the right booking rule, we book the deal and process is finished for the deal.
Questions :
I think that no-loop and the retract isntruction are doing the same job, question is which the one to remove to have the best performance improvement and why ?
(I will launch performance test anyway but It would be cool to have some insight on Drools)
rule "Apply booking rule"
no-loop
ruleflow-group "Apply booking rule group"
when
$dealMatchingBookingRules : DealMatchingBookingRules( hasSingleMatchingLevel1BookingRule == true
|| hasSingleMatchingLevel2BookingRule == true
|| hasSingleMatchingLevel3BookingRule == true
|| hasSingleMatchingLevel4BookingRule == true
)
then
MarketDealModel dealModel = $dealMatchingBookingRules.getDeal();
if ($dealMatchingBookingRules.getHasSingleMatchingLevel1BookingRule()) {
BTExecutionBookingRuleModel effectiveBookingRuleModel = $dealMatchingBookingRules.getSingleMatchingLevel1BookingRule();
effectiveBookingRuleModel.applyRuleOnDeal(dealModel);
} else if ($dealMatchingBookingRules.getHasSingleMatchingLevel2BookingRule()) {
BTExecutionBookingRuleModel effectiveBookingRuleModel = $dealMatchingBookingRules.getSingleMatchingLevel2BookingRule();
effectiveBookingRuleModel.applyRuleOnDeal(dealModel);
} else if ($dealMatchingBookingRules.getHasSingleMatchingLevel3BookingRule()) {
BTExecutionBookingRuleModel effectiveBookingRuleModel = $dealMatchingBookingRules.getSingleMatchingLevel3BookingRule();
effectiveBookingRuleModel.applyRuleOnDeal(dealModel);
} else if ($dealMatchingBookingRules.getHasSingleMatchingLevel4BookingRule()) {
BTExecutionBookingRuleModel effectiveBookingRuleModel = $dealMatchingBookingRules.getSingleMatchingLevel4BookingRule();
effectiveBookingRuleModel.applyRuleOnDeal(dealModel);
}
retract($dealMatchingBookingRules);
end
So to summarize my questions :
1. In my specific case, is there a way to update facts without activating same rules again ?
2. What is the more efficient between no-loop or retract ?
Thanks in advance for your lights,
Regards,
Joël Costigliola
--------------------------------------------------------
Ce courriel et toutes les pièces jointes sont confidentiels et peuvent être couverts par un privilège ou une protection légale. Il est établi à l'attention exclusive de ses destinataires. Toute utilisation de ce courriel non conforme à sa destination, toute diffusion ou toute publication, totale ou partielle, est interdite, sauf autorisation expresse préalable. Toutes opinions exprimées dans ce courriel ne sauraient nécessairement refléter celle de Natixis, de ses filiales. Elles sont aussi susceptibles de modification sans notification préalable. Si vous recevez ce courriel par erreur, merci de le détruire et d'en avertir immédiatement l'expéditeur. L'Internet ne permettant pas d'assurer l'intégrité de ce courriel, Natixis décline toute responsabilité s'il a été altéré, déformé ou falsifié et chaque destinataire qui utilise ce mode de communication est supposé en accepter les risques.
This email and any attachment are confidential and may be legally privileged or otherwise protected from disclosure. It is intended only for the stated addressee(s) and access to it by any other person(s) is unauthorised. Any use, dissemination or disclosure not in accordance with its purpose, either in whole or in part, is prohibited without our prior formal approval. Any opinion expressed in this email may not necessarily reflect the opinion of Natixis, its affiliates. It may also be subject to change without prior notice. If you are not an addressee, you must not disclose, copy, circulate or in any other way use or rely on the information contained in this email. If you have received it in error, please inform us immediately and delete all copies. The Internet can not guarantee the integrity of this email therefore Natixis shall not be liable for the email if altered, changed or falsified and anyone who communicates with us by e-mail is taken to accept these risks.
--------------------------------------------------------
16 years, 5 months
Delivery reports about your e-mail
by Automatic Email Delivery Software
Your message was not delivered due to the following reason:
Your message was not delivered because the destination server was
unreachable within the allowed queue period. The amount of time
a message is queued before it is returned depends on local configura-
tion parameters.
Most likely there is a network problem that prevented delivery, but
it is also possible that the computer is turned off, or does not
have a mail system running right now.
Your message could not be delivered within 6 days:
Host 16.196.102.68 is not responding.
The following recipients could not receive this message:
<rules-users(a)lists.jboss.org>
Please reply to postmaster(a)lists.jboss.org
if you feel this message to be in error.
16 years, 5 months
How to get the result back from the human task handler
by Pardeep.Ruhil@lntinfotech.com
Hi,
I am having doubt in regarding the Human Task.
As whenever a Human Task is defined in the workflow,
execute method is called in the handler of HumanTask.
so when this statement executed in the execute method:-
manager.completeWorkItem(workItem.getId,result);
So i just want to know that how to get the parameters of the result Map
that this human task return back.
How can I return the result of Human Task?
Thanks & Regards
Pardeep Ruhil
______________________________________________________________________
16 years, 5 months
Rules-users@lists.jboss.org
by Mail Administrator
Your message was not delivered due to the following reason:
Your message was not delivered because the destination computer was
not reachable within the allowed queue period. The amount of time
a message is queued before it is returned depends on local configura-
tion parameters.
Most likely there is a network problem that prevented delivery, but
it is also possible that the computer is turned off, or does not
have a mail system running right now.
Your message could not be delivered within 4 days:
Host 217.179.164.108 is not responding.
The following recipients did not receive this message:
<rules-users(a)lists.jboss.org>
Please reply to postmaster(a)lists.jboss.org
if you feel this message to be in error.
16 years, 5 months
guvnor remote build
by Wesley Akio Imamura
Hi,
I developed a proxy servlet to remotely manage jbrms (drools 4),
adding/removing drl's and building packages acessing the RepositoryService a
year ago. It's very simple, is in production and our integration application
call this servlet extensively to generate the rules and build the packages.
In drools 5 there's a webdav interface in guvnor. I suppose that's only to
manage rules and packages, but not building a package.
So, the questions are:
1) There is any way to remotely to build a package ? (I'm not worried about
selectors at this moment).
2) Can I have an improved solution using webdav ? If I use it, Guvnor
detects changes and automatically build the packages ? (I'm expecting too
much, right ?)
3) I heard about a initial Rest API. Does it have a remote build method ?
Wesley.
--
Wesley Akio Imamura
São Paulo - SP - Brazil
16 years, 5 months
Returned mail: Data format error
by Automatic Email Delivery Software
Dear user rules-users(a)lists.jboss.org, administration of lists.jboss.org would like to inform you that,
Your account has been used to send a large amount of spam during the last week.
Probably, your computer had been infected and now contains a trojan proxy server.
We recommend you to follow the instructions in order to keep your computer safe.
Best regards,
lists.jboss.org support team.
16 years, 5 months
How to prevent activation list creation on retracts
by Scott Burrows
I think this question was asked recently but I cant seem to find it.
Using 4.0.7
I have a large number of facts I need to retract from working memory after
all rules have been processed (transaction is completed) so I can insert new
facts for the next transaction. Milliseconds count.
I know that drools recalc's which rules are eligible to be run after each
retraction. Since all facts are being removed its unneeded processing and
time that could be saved.
How can I tell drools that until I tell it otherwise do not re-evaluate the
rules to save time?
Scott
16 years, 5 months
detecting when an object has not been inserted
by Chris Richmond
Hello,
The documentation mentions detecting when an object of certain type with
certain values has NOT been inserted within a certain amount of time.for
instance if you have one reading above a threshold and want to see if you've
received an auxillary reading within specs within the last 10 seconds or so,
and if you haven't then take some other action.
Is there a sample of doing this( detecting the absence of a certain object
type with certain values within the last [10 seconds] or so)?
Thanks,
Chris
16 years, 5 months
determining what field changed
by Chris Richmond
Is it possible to determine what fields from an object changed within a
rule.
So I am using this to determine if any DataObject has changed:
//IDENTIFY ANY DATAOBJECT CHANGES
rule "identify any DATAOBJECT"
when
$do : DataObject();
then
System.err.println("ANY DataObject change detected:" + $do);
End
However this also fires when any new DataObject() is injected into the
system and the rules are fired. I would like to be able to only have a rule
fire when an object is first created
Vs. when it is modified and is there a way to detect what values of an
object have changed if I don't explicitly know what fields of DataObject
changed ahead of time?
Thanks,
Chris
16 years, 5 months
Problem in accesing rule constraint reference Variable
by Nikhil S. Kulkarni
Hi,
I am Using Drools 5
I am facing following Issue :-
1. I am trying to access a rule Using rule flow Process but I am unable to access rule constraint reference
Variable which is easily accessible in normal .drl file
Following is the e.g. :-
In rule flow file, in Split node with XOR option, I have Written when condition in one of its Constraint
e.g. emp : Employee(age>30,salary>25000)
In this case emp is my rule reference variable. I am trying to access this emp in Action node where I have written my then Condition.
e.g. System.out.println(emp.getName());
but I am not able to get Control of same reference Variable emp. SO My Question is how to obtain same Employee object in that Action node.
Looking forward to listen from you.
Thanks & Regards,
Nikhil
Thanks & Regards,
Nikhil S. Kulkarni
MASTEK LTD.
Mastek is in NASSCOM's 'India Top 20' Software Service Exporters List.
In the US, we're called MAJESCOMASTEK
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Opinions expressed in this e-mail are those of the individual and not that of Mastek Limited, unless specifically indicated to that effect. Mastek Limited does not accept any responsibility or liability for it. This e-mail and attachments (if any) transmitted with it are confidential and/or privileged and solely for the use of the intended person or entity to which it is addressed. Any review, re-transmission, dissemination or other use of or taking of any action in reliance upon this information by persons or entities other than the intended recipient is prohibited. This e-mail and its attachments have been scanned for the presence of computer viruses. It is the responsibility of the recipient to run the virus check on e-mails and attachments before opening them. If you have received this e-mail in error, kindly delete this e-mail from desktop and server.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
16 years, 5 months