OOME on JPA persistence of stateful session
by dan.danciu
Hi,
I'm trying to use JPA persistence for a stateful session (version 5.1.1),
the configuration is made using spring integration support.
During the integration tests almost always I get an OutOfMemoryException. I
chased the problem to the piece of code bellow (from
org.drools.marshalling.impl.OutputMarshaller).
The "for" statement marked "HERE" will cycle for ever (until no more memory
is left).
I also found the
http://www.mail-archive.com/rules-users@lists.jboss.org/msg12427.html
thread, I took out my split, but problem did not go away.
Cheers,
Dan
case NodeTypeEnums.ForallNotNode : {
if ( leftTuple.getBlocker() == null ) {
// is not blocked so has children
stream.writeShort( PersisterEnums.LEFT_TUPLE_NOT_BLOCKED
);
///////////// HERE
for ( LeftTuple childLeftTuple = leftTuple.firstChild;
childLeftTuple != null; childLeftTuple = (LeftTuple)
leftTuple.getLeftParentNext() ) {
stream.writeShort( PersisterEnums.LEFT_TUPLE );
stream.writeInt(
childLeftTuple.getLeftTupleSink().getId() );
writeLeftTuple( childLeftTuple,
context,
recurse );
}
stream.writeShort( PersisterEnums.END );
} else {
stream.writeShort( PersisterEnums.LEFT_TUPLE_BLOCKED );
stream.writeInt(
leftTuple.getBlocker().getFactHandle().getId() );
}
break;
}
--
View this message in context: http://drools-java-rules-engine.46999.n3.nabble.com/OOME-on-JPA-persisten...
Sent from the Drools - User mailing list archive at Nabble.com.
14 years, 2 months
Matching strings in two arrays
by Kumar Pandey
Drools 5.1.0
I have a need to match list of incoming strings to those in the rule. All
the strings in the fact object needs to exists in the rule.
I have a large set of rules around 5000.
In general I have around 4 conditions per rule and its taking in average
around 30- ~40 ms to go through the 5000 rules.
However the following construct that I am using to match the incoming set of
input strings is adding on the average 200ms to rules execution.
Is there a more efficient way to do this?
MyContext is the fact class and classes is array of String.
I need to make sure that the classes array contains all three
strings TestString1, TestString2 and TestString3.
MyContext(DclassesList : classes)
exists( String(this matches "TestString1") || String(this matches
"TestString2") || String(this matches "TestString3") from DclassesList)
Of course each rule in the 5000 can have diff set of strings to match.
Thanks
14 years, 2 months
Connect to Guvnor from other machines.
by Nadav Hashimshony
Hi
i have drools guvnor installed on my machine, i can access it with localhost
or with my ip.
when i want to access the guvnor from other machines i cant.
is there some settings i need to do?
thanks.
Nadav.
14 years, 2 months
Spring , Ruleflow and KnowledgeBuilderConfiguration
by Swindells, Thomas
I'm using drools flow in my spring application and am currently using the following to configure the kbase I use:
<drools:kbase id="ingestKbase">
<drools:resources>
<drools:resource type="DRL"
source="classpath:ingest/drools/ingest.drl" />
<drools:resource type="DRF"
source="classpath:ingest/drools/ingest.rf" />
</drools:resources>
<drools:configuration>
<drools:mbeans enabled="true" />
</drools:configuration>
</drools:kbase>
When I run I'm getting a big error:
Process Compilation error : org.drools.lang.descr.ProcessDescr@7a40fc
vcm/ingest/Process_vcm_ingest_0.java (7:281) : Syntax error on tokens, ( expected instead
vcm/ingest/Process_vcm_ingest_0.java (7:281) : The left-hand side of an assignment must be a variable ...
Firstly it looks like ProcessDescr needs a sensible toString method implemented - preferably actually saying which resource it is attempting to compile.
I'm guessing that I've got some syntax errors in my ruleflow file (even though the eclipse plugin claims it validates fine).
I've seen that the knowledge builder configuration has the option drools.dump.dir, but how can I set this within Spring?
Thanks,
Thomas
________________________________
**************************************************************************************
This message is confidential and intended only for the addressee. If you have received this message in error, please immediately notify the postmaster(a)nds.com and delete it from your system as well as any copies. The content of e-mails as well as traffic data may be monitored by NDS for employment and security purposes. To protect the environment please do not print this e-mail unless necessary.
NDS Limited. Registered Office: One London Road, Staines, Middlesex, TW18 4EX, United Kingdom. A company registered in England and Wales. Registered no. 3080780. VAT no. GB 603 8808 40-00
**************************************************************************************
14 years, 2 months
Re: [rules-users] fireUntilHalt and timing of rule activations
by Greg Barton
If you don't have some way of associating the data with a particular Latch it's easy to get overlap when processing datasets. In general you need some way to group the data together. You can avoid a back reference to the Latch by having a Set of some sort in the Latch to which you add all data in the batch. If you use a Set backed by an IdentityHashMap the overhead is pretty small, and rules look like this:
rule "CountAs"
dialect "java"
salience -1
when
l : Latch()
a : A( this memberOf l.dataSet )
then
retract(a);
l.incACount();
System.out.println("Found an A in " + l);
end
See attached project.
THough I like the cleverness of using the "data in matched objects alters rule properties" trick, you could have just as easily had a "Latch(value == true)" conditional, and that would be more clear, IMO. I'm curious to see of the enabled trick would perform better, though.
GreG
--- On Sun, 10/3/10, Wolfgang Laun <wolfgang.laun(a)gmail.com> wrote:
From: Wolfgang Laun <wolfgang.laun(a)gmail.com>
Subject: Re: [rules-users] fireUntilHalt and timing of rule activations
To: "Rules Users List" <rules-users(a)lists.jboss.org>
Date: Sunday, October 3, 2010, 4:23 AM
There is another way of associating a Latch object with rules, without having to store a reference to a Latch in objects:
rule "CountAs"
enabled ( $v )
when
Latch( $v : value )
X( ... )
then ... end
At the beginning, insert Latch( false ), which blocks all rules with this construction, or modify the Latch object to false before inserting more facts. Then, insert the facts, and, at the end, modify Latch to true.
Latch latch = new Latch( true );
FactHandle fh = kSession.insert( latch );
kSession.fireAllRules();
latch.setValue( false );
kSession.update( fh, latch );
Of course, you can use multiple Latch objects, adding a name field with a specific value, so that a latch applies to a subset of rules only:
rule "CountAs"
enabled ( $v )
when
Latch( name == "CountAs", $v : value )
...
But be aware that changes to Latch objects will retrigger rules that have fired previously; so with this approach you'll have to make sure to retract facts when they have been processed.
-W
2010/10/3 Greg Barton <greg_barton(a)yahoo.com>
Nope, you're not missing anything. What you need is a control object of some sort thst's inserted after all of the "real" data is inserted. (See attached project for an example.) Rules will look like this, if the control object is called BatchLatch and data objects A:
rule "CountAs"
dialect "java"
salience -1
when
l : Latch()
a : A( latch == l )
then
retract(a);
l.incACount();
System.out.println("Found an A in " + bl);
end
Note that the A object being processed is tied back to the latch. This is so multiple latches can be processed simultaneously and their processing won't be intermingled. This is necessary because there's no guarantee that two Latch objects aren't in working memory at once. (Though you could create a rule that enforces this.)
GreG
--- On Sat, 10/2/10, Norman C <rent_my_time(a)yahoo.com> wrote:
> From: Norman C <rent_my_time(a)yahoo.com>
> Subject: [rules-users] fireUntilHalt and timing of rule activations
> To: rules-users(a)lists.jboss.org
> Date: Saturday, October 2, 2010, 10:22 AM
> Hi All,
>
> In my app, I have a separate thread calling fireUntilHalt()
> continuously. I
> have quite a few rules, and I am using salience extensively
> to control the order
>
> in which rules are executed. What I have seen (by adding
> an event listener) is
> that as a new fact is inserted, various rules are
> activated. Often, the
> fireUntilHalt will start executing fireNextItem in
> DefaultAgenda before all of
> the activations are complete. So if the rule with the
> highest salience
> value hasn't been activated at this point, then the first
> rule to be fired isn't
>
> the correct one.
>
> This can be worked around by waiting for insert to return
> and then calling
> fireAllRules(). But it seems like the session should
> block fireUntilHalt from
> trying to execute activated rules until all activations are
> complete. Or am I
> missing something here?
>
> thanks,
> Norman
>
>
>
>
>
> _______________________________________________
> rules-users mailing list
> rules-users(a)lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users
-----Inline Attachment Follows-----
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users
14 years, 2 months
nested condition in from collect
by lnguyen
I'm trying to determine if a user has a certain immunization on record or a
group of immunizations but when I attempt to put additional the rule will
not compile.
rule "Immunizations_Determine if a user has a valid tetanus immunization"
dialect 'mvel'
no-loop true
salience 100
when
$user : User($profile : profile)
$got : List() from collect ( UserImmunization( immunization != null,
eval( immunization.immunizationName == "Td or Tet/Dip (Tetanus/Diphtheria)"
|| immunization.immunizationName == "Tdap (Tetanus/Diphtheria & Pertussis)"
|| immunization.immunizationName == "DT (Diphtheria/Tetanus)" ||
immunization.immunizationName == "TT or Tet Tox (Tetanus Toxoid)" ||
immunization.immunizationName == "Tetanus")) from $profile.userImmunizations
)
then
System.out.println("The user has has a valid tetanus immunization ");
end
The profile contains a list of UserImmunizations.
UserImmunizations:
private Long id;
private Immunization immunization;
private Date dateReceived;
Immunizations:
private Long id;
private String immunizationName;
I'm not sure if this is a good place to use 'from accumulate'.
Is it possible to do the condition for the Immunization object within the
'from collect' or should it be evaluated separately?
--
View this message in context: http://drools-java-rules-engine.46999.n3.nabble.com/nested-condition-in-f...
Sent from the Drools - User mailing list archive at Nabble.com.
14 years, 2 months
How to import standard java classe(eg: wrapper classes) inside a drools guvnor.
by sumatheja
Hi
I am new to drools. Forgive me if the question iam asking is too dumb :P.
I want to write java code inside the rules in the drools-guvnor using the
standard classes, like parsing a string using wrapper classes. How can i
import these java classes?
--
Thanks and Regards,
Sumatheja Dasararaju
Human Being :P
14 years, 2 months
[drools-planner] eval check doesn't provide the expected output
by Joshua Daniel
Hi,
I have the following rule and roomCurriculumCode and currCode are of type
String. If the check is equals "insertLogical" never happens, but if the the
codes are not equal as expressed below the "insertLogical" is performed even
if the strings are equal. What am I missing here
rule "RoomAndCurriculum"
when
$room : Room($roomCode : code, $roomCapacity : capacity,
$roomCurriculumCode : curriculumCode);
$curriculum : Curriculum($currCode : code);
eval($roomCurriculumCode != $currCode)
then
insertLogical(new IntConstraintOccurrence("RoomAndCurriculum",
ConstraintType.NEGATIVE_HARD, 1, $roomCapacity, $room, $currCode,
$roomCurriculumCode));
end
-jd
14 years, 2 months
Re: [rules-users] fireUntilHalt and timing of rule activations
by Greg Barton
The entire purpose of fireUntilHalt is to do exactly the opposite of what you describe. :) Is there any compelling reason you're using it as opposed to just calling fireAllRules?
GreG
On Oct 5, 2010, at 16:34, Norman C <rent_my_time(a)yahoo.com> wrote:
Thanks for the suggestions. They all look like good ways to handle the situation I described. However, they require modifying all of the rules to check for the latch object and its state, which I would prefer not to do and doesn't seem like would be necessary.
It seems to me that this is something that Drools can handle internally without the rules having to be written this way. Since the rules engine processes rules in a single thread, it's a concurrency issue. fireUntilHalt should be blocked when a fact is inserted/updated/retracted, until all activations as a result of that change in working memory are completed.
Thoughts?
Norman
From: Wolfgang Laun <wolfgang.laun(a)gmail.com>
To: Rules Users List <rules-users(a)lists.jboss.org>
Sent: Sun, October 3, 2010 10:51:08 PM
Subject: Re: [rules-users] fireUntilHalt and timing of rule activations
2010/10/4 Greg Barton <greg_barton(a)yahoo.com>
If you don't have some way of associating the data with a particular Latch it's easy to get overlap when processing datasets. In general you need some way to group the data together. You can avoid a back reference to the Latch by having a Set of some sort in the Latch to which you add all data in the batch.
Which burdens all inserts and retracts to be accompanied by correpsonding updates of the Set/Map.
If you use a Set backed by an IdentityHashMap the overhead is pretty small, and rules look like this:
rule "CountAs"
dialect "java"
salience -1
when
l : Latch()
a : A( this memberOf l.dataSet )
then
retract(a);
l.incACount();
System.out.println("Found an A in " + l);
end
See attached project.
THough I like the cleverness of using the "data in matched objects alters rule properties" trick, you could have just as easily had a "Latch(value == true)" conditional, and that would be more clear,
It was meant to emphasize the role of Latch.value as an enabler for the rule in contrast to a regular constraint being part of the application logic. YMMV ;-)
IMO. I'm curious to see of the enabled trick would perform better, though.
Whichever way, there is a considerable burden associated with writing the rules and, possibly, inserts and retracts. I wonder what the benefits of having the session run all the time are as opposed to simply let it fire until it stops; then do the inserts and then fireUntilHalt again? If there is, I'd opt for the addition of an atomic insertAll(Object... objects) and then none of this hocus-pocus would be necessary.
-W
GreG
--- On Sun, 10/3/10, Wolfgang Laun <wolfgang.laun(a)gmail.com> wrote:
From: Wolfgang Laun <wolfgang.laun(a)gmail.com>
Subject: Re: [rules-users] fireUntilHalt and timing of rule activations
To: "Rules Users List" <rules-users(a)lists.jboss.org>
Date: Sunday, October 3, 2010, 4:23 AM
There is another way of associating a Latch object with rules, without having to store a reference to a Latch in objects:
rule "CountAs"
enabled ( $v )
when
Latch( $v : value )
X( ... )
then ... end
At the beginning, insert Latch( false ), which blocks all rules with this construction, or modify the Latch object to false before inserting more facts. Then, insert the facts, and, at the end, modify Latch to true.
Latch latch = new Latch( true );
FactHandle fh = kSession.insert( latch );
kSession.fireAllRules();
latch.setValue( false );
kSession.update( fh, latch );
Of course, you can use multiple Latch objects, adding a name field with a specific value, so that a latch applies to a subset of rules only:
rule "CountAs"
enabled ( $v )
when
Latch( name == "CountAs", $v : value )
...
But be aware that changes to Latch objects will retrigger rules that have fired previously; so with this approach you'll have to make sure to retract facts when they have been processed.
-W
2010/10/3 Greg Barton <greg_barton(a)yahoo.com>
Nope, you're not missing anything. What you need is a control object of some sort thst's inserted after all of the "real" data is inserted. (See attached project for an example.) Rules will look like this, if the control object is called BatchLatch and data objects A:
rule "CountAs"
dialect "java"
salience -1
when
l : Latch()
a : A( latch == l )
then
retract(a);
l.incACount();
System.out.println("Found an A in " + bl);
end
Note that the A object being processed is tied back to the latch. This is so multiple latches can be processed simultaneously and their processing won't be intermingled. This is necessary because there's no guarantee that two Latch objects aren't in working memory at once. (Though you could create a rule that enforces this.)
GreG
--- On Sat, 10/2/10, Norman C <rent_my_time(a)yahoo.com> wrote:
> From: Norman C <rent_my_time(a)yahoo.com>
> Subject: [rules-users] fireUntilHalt and timing of rule activations
> To: rules-users(a)lists.jboss.org
> Date: Saturday, October 2, 2010, 10:22 AM
> Hi All,
>
> In my app, I have a separate thread calling fireUntilHalt()
> continuously. I
> have quite a few rules, and I am using salience extensively
> to control the order
>
> in which rules are executed. What I have seen (by adding
> an event listener) is
> that as a new fact is inserted, various rules are
> activated. Often, the
> fireUntilHalt will start executing fireNextItem in
> DefaultAgenda before all of
> the activations are complete. So if the rule with the
> highest salience
> value hasn't been activated at this point, then the first
> rule to be fired isn't
>
> the correct one.
>
> This can be worked around by waiting for insert to return
> and then calling
> fireAllRules(). But it seems like the session should
> block fireUntilHalt from
> trying to execute activated rules until all activations are
> complete. Or am I
> missing something here?
>
> thanks,
> Norman
>
>
>
>
>
> _______________________________________________
> rules-users mailing list
> rules-users(a)lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users
-----Inline Attachment Follows-----
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users
14 years, 2 months