Why no auto-retraction after adding this temporal rule?
by Ladd
I'm attaching a small standalone java program to demonstrate this. The code
should be self explanatory. But in a nutshell, I'm feeding events into this
rule:
rule averageOverTime
when
$avg: Number() from accumulate (
MyEvent( key == 'someKey', $val : value ) over window:time( 200ms
),
average( $val ) )
then
System.out.println( "--- $avg in then clause is " + $avg );
end
I set up a loop to feed events in and I do see the rule fire and my averages
print out as I'd expect. I also set up a session listener to see if events
are automatically expired/retracted. And they are.
The trouble begins when I add this rule:
rule RetractionBreaker
when
$a : MyEvent( key == 'A' )
MyEvent( key == 'B', this after $a )
then
System.out.println( "--- just saw A followed by B" );
end
Whether or not I inject events with key 'A' or 'B', no events of any kind
are ever automatically retracted.
Why is that?
Thanks for helping me understand this!!
- Ladd
NoRetractionTest.java
<http://drools.46999.n3.nabble.com/file/n4022716/NoRetractionTest.java>
--
View this message in context: http://drools.46999.n3.nabble.com/Why-no-auto-retraction-after-adding-thi...
Sent from the Drools: User forum mailing list archive at Nabble.com.
11 years, 9 months
drools linkage errors
by mani koduri
Hi,
Initially I am using jboss-drool 5.0.1 version in our project and I updated
to jboss-drools 5.4.0 version in our project but I am getting linkage
errors as mentioned below.
*java.lang.LinkageError: loader (instance of
org/drools/rule/JavaDialectRuntimeData$PackageClassLoader): attempted*
*duplicate class definition for name:
"com/ds/rule/vm/fvm/ruleengine/Rule_Product_has_minimum_number_of_valid_quotes_5263d589f8864649bbb734bada7a54ed"
*
* at java.lang.ClassLoader.defineClass1(Native Method)
[rt.jar:1.6.0_30]*
* at java.lang.ClassLoader.defineClassCond(ClassLoader.java:631)
[rt.jar:1.6.0_30]*
* at java.lang.ClassLoader.defineClass(ClassLoader.java:615)
[rt.jar:1.6.0_30]*
* at
org.drools.rule.JavaDialectRuntimeData$PackageClassLoader.fastFindClass(JavaDialectRuntimeData.java:615)
[drools-core-5.4.0.Final.jar:5.4.0.Final]*
* at
org.drools.util.CompositeClassLoader$CachingLoader.load(CompositeClassLoader.java:254)
[knowledge-api-5.4.0.Final.jar:5.4.0.Final]*
* at
org.drools.util.CompositeClassLoader$CachingLoader.load(CompositeClassLoader.java:237)
[knowledge-api-5.4.0.Final.jar:5.4.0.Final]*
* at
org.drools.util.CompositeClassLoader.loadClass(CompositeClassLoader.java:88)
[knowledge-api-5.4.0.Final.jar:5.4.0.Final]*
* at java.lang.ClassLoader.loadClass(ClassLoader.java:295)
[rt.jar:1.6.0_30]*
* at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
[rt.jar:1.6.0_30]*
* at
a.b.c.Rule_person___unique___name_656ee3db19d34e689d95e2d6b2be67b6Eval0InvokerGenerated.evaluate(Unknown
Source)*
* at
a.b.c.Rule_person___unique___name_656ee3db19d34e689d95e2d6b2be67b6Eval0Invoker.evaluate(Unknown
Source)*
* at org.drools.rule.EvalCondition.isAllowed(EvalCondition.java:114)
[drools-core-5.4.0.Final.jar:5.4.0.Final]*
And each time I ran the project I am getting same error but on different
rules.
Could you please help me out how to solve this issue?
with regards,
k.chaitanya.
11 years, 9 months
Question about drools-spring in a multi-treaded container (like tomcat).
by Gurvinder Narula1
Hello all,
I've been reading up about drool-spring integration and have put together a simple project that wires together a KnowledgeBase and KnowledgeSession as follows :
<drools:resource id="GroupUnit" type="DRL"
source="file:/Users/drools/drools-spring-test/src/Rules/drls/GroupUnit.drl" />
<drools:resource id="GradeUnit" type="DRL"
source="file:/Users/drools/drools-spring-test/src/Rules/drls/GradeUnit.drl"" />
<drools:resource id="EvaluateUnit" type="DRL"
source="file:/Users/drools/drools-spring-test/src/Rules/drls/EvaluateUnit.drl"" />
<drools:grid-node id="node1" />
<drools:kbase id="kbase1" node="node1">
<drools:resources>
<drools:resource ref="GroupUnit" />
<drools:resource ref="GradeUnit" />
<drools:resource ref="EvaluateUnit" />
</drools:resources>
</drools:kbase>
<drools:ksession id="ksession" type="stateful" kbase="kbase1"
node="node1" />
Then in my Controller call, I 'AutoWire' in the StatefulKnowledgeSession as follows :
@Controller
@RequestMapping( value = "foo" )
final class FooController{
@Autowired
StatefulKnowledgeSession ksession;
@RequestMapping( method = RequestMethod.GET )
@ResponseBody
public String evaluateUnit() {
Unit unit = new Unit("030", "502", "C", "9484", "45", new String[] {},
null);
if (ksession != null) {
ksession.fireAllRules();
ksession.insert(unit);
ksession.fireAllRules();
return "<UnitCategory>" + unit.getUnitCategory() + "</UnitCategory>";
}
else
return "<message> stateful session is null</message>";
}
The main question that I have is that – is this solution thread-safe ? From what I understand of spring is that beans configured without any additional qualifiers are inherently singletons. And when deployed in a multi-theaded container like tomcat, Spring assumes that the beans being severed up a thread-safe. So from I have read is that KnowledeSessions are inherently not thread safe. So putting the 2 together, I leaning towards the assessment that this above solution is NOT thread safe and that if I do want it to be thread safe I should set the StatefulKnowledgeSession to 'prototype' and not leave it as a singleton.
Please let me know if I'm missing anything in my assessment here !
Thanks in advance,
Gurvinder
This message is intended only for the individual or entity to which it is addressed. It may contain privileged, confidential information which is exempt from disclosure under applicable laws. If you are not the intended recipient, please note that you are strictly prohibited from disseminating or distributing this information (other than to the intended recipient) or copying this information. If you have received this communication in error, please notify us immediately by e-mail or by telephone at the above number. Thank you.
11 years, 9 months
Concurrent stateful knowledge session
by ismaximum
Hi
I have one question and one problem.
The question is, is multiple instances of stateful session, thread safe?
The problem is, we have a bunch of test cases. Each test class extends from
an abstract class in which drools session will be created. Previously we had
stateless session so therefore for each test method we had to create a new
session and call execute() method.
Now because of the huge number of test methods this runs for about 20
minutes. So we decided to change the the session to stateful to make it
faster.
After this change, many of test cases have ended with assertion failure
which doesn't make sense. I don't know what's wrong here, before each test
method, we retract any previous fact and we insert new objects.
Since jnuit runs tests in multiple threads I thought maybe there is an issue
with concurrency.
Can anyone please help me on this.
Thanks
--
View this message in context: http://drools.46999.n3.nabble.com/Concurrent-stateful-knowledge-session-t...
Sent from the Drools: User forum mailing list archive at Nabble.com.
11 years, 9 months
constraints lacking and in excess
by Michiel Vermandel
Hi,
I have written a custom move implementation.
At first I got the exception:
java.lang.IllegalStateException: The moveClass (class my.planner.solver.MoveGroupToPeriod)'s move (PROJECT Period GroupChange:{T= Inspect 55871.I#0 [4->4] Bart DE BIE IV XI} => (P5) [i1]) probably has a corrupted undoMove (my.planner.solver.util.TaskChangeListMove@35e8df37). Or maybe there are corrupted score rules.
...
I found out that I did not undo all changes that I made in the move.
After fixing this, I now often get Score corruption as below.
I checked and all changes are preceded with director.beforeVariableChanged(...) and followed by director.afterVariableChanged(...);
What could cause this corruption?
java.lang.IllegalStateException: Score corruption: the workingScore (-286hard/-30601soft) is not the uncorruptedScore (-286hard/-30401soft):
The workingMemory has 3 ConstraintOccurrence(s) in excess:
preferedRegion/NEGATIVE_SOFT:[{T= Inspect 115519.I#0 [8->8] Dirk JANSSENS IV V}, Johan LAMOTE, 99, V]=99
taskSpreading/NEGATIVE_HARD:[(P7) , 77]=100
preferedRegion/NEGATIVE_SOFT:[{T= Inspect 115519.I#1 [8->8] Erik VERHOEVEN TL V}, Dirk JANSSENS, 99, V]=99
The workingMemory has 6 ConstraintOccurrence(s) lacking:
preferedRegion/NEGATIVE_SOFT:[{T= Inspect 115519.I#0 [8->8] Dirk JANSSENS IV V}, Dirk JANSSENS, 99, V]=99
taskSpreading/NEGATIVE_HARD:[(P7) , 75]=36
preferedRegion/NEGATIVE_SOFT:[{T= Inspect 115519.I#1 [8->8] Erik VERHOEVEN TL V}, Erik VERHOEVEN, 99, V]=99
preferedRegion/NEGATIVE_SOFT:[{T= Inspect 4747.I#0 [10->10] Johan LAMOTE IV V}, Johan LAMOTE, 99, V]=99
taskSpreading/NEGATIVE_HARD:[(P8) , 74]=16
preferedRegion/NEGATIVE_SOFT:[{T= Inspect 4747.I#1 [10->10] Dirk JANSSENS TL V}, Dirk JANSSENS, 99, V]=99
Check the score rules who created those ConstraintOccurrences. Verify that each ConstraintOccurrence's causes and weight is correct.
at org.drools.planner.core.score.director.AbstractScoreDirector.assertWorkingScore(AbstractScoreDirector.java:249)
at org.drools.planner.core.solver.scope.DefaultSolverScope.assertWorkingScore(DefaultSolverScope.java:96)
at org.drools.planner.core.phase.AbstractSolverPhaseScope.assertWorkingScore(AbstractSolverPhaseScope.java:124)
at org.drools.planner.core.localsearch.DefaultLocalSearchSolverPhase.solve(DefaultLocalSearchSolverPhase.java:86)
at org.drools.planner.core.solver.DefaultSolver.runSolverPhases(DefaultSolver.java:190)
at org.drools.planner.core.solver.DefaultSolver.solve(DefaultSolver.java:155)
at my.planner.app.InspectionSchedule.solve(InspectionSchedule.java:275)
at my.planner.testcore.AbstractPlanningTestClass.solve(AbstractPlanningTestClass.java:444)
at my.planner.testcore.AbstractPlanningTestClass.solve(AbstractPlanningTestClass.java:469)
at my.planner.RealBaoTest.datasetBAO20122013(RealBaoTest.java:226)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnit4ClassRunner.java:79)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:71)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:49)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Thanks,
Michiel
-----------------
http://www.codessentials.com - Your essential software, for free!
Follow us at http://twitter.com/#!/Codessentials
11 years, 9 months
Change in eval mvel syntax from 5.1 to 5.3
by Chris Selwyn
I have been using 5.1 for some time and am looking to upgrade.
I have found that, where in 5.1, I used to be able to write
$jd: JobDetails(
eval ( $t = ["MTSURVEY", "MTINSTALL", "MTEXCHANGE", "MTMAINT"];
!($t contains getJobType(businessArea, templateJobId) )) )
However, in 5.3.1 this now produces a syntax error as follows:-
[CheckJobType] [ERR 101] Line 9:9 no viable alternative at input '$t' in rule "CheckJobType"
[CheckJobType] Parser returned a null Package
I have found that I have to now code the condition as follows:-
$jd: JobDetails(
eval (!(["MTSURVEY", "MTINSTALL", "MTEXCHANGE", "MTMAINT"] contains getJobType(businessArea, templateJobId) )) )
It is a relatively minor thing but I am curious as to why I should have to recode this.
What has changed to cause me to do this? What other incompatibilities exist?
Chris
11 years, 9 months