Wait state constriant
by retoy
Can anyone tell me what's wrong with this wait state constraint?
System.currentTimeMillis() >= (startWait + 3000)
The exception I'm getting ist:
[5,33]: [ERR 102] Line 5:33 mismatched input '>=' expecting 'then' in rule
"RuleFlow-Milestone-drools.test.timer-6"
but I don't think that is really getting to the heart of the problem...
--
View this message in context: http://drools-java-rules-engine.46999.n3.nabble.com/Wait-state-constriant...
Sent from the Drools - User mailing list archive at Nabble.com.
15 years, 11 months
Drools and mvel
by Paul Edwards
Hi guys,
I have an issue which involves smooks, drools and mvel.
Quick explanation, the unit test is just a smooks run. Nothing complicated. The test passes happily. It contains an expression that involves an MVEL "IF" statement.
Now if I add a drools startup (I'm not using drools in the test, I'm just initialising it), the unit test now fails on the "IF" statement. The exception received is:
org.milyn.cdr.SmooksConfigurationException: Error invoking @Initialize method 'initialize' on class 'org.milyn.javabean.BeanInstancePopulator'.
at org.milyn.cdr.annotation.Configurator.invoke(Configurator.java:457)
at org.milyn.cdr.annotation.Configurator.initialise(Configurator.java:439)
at org.milyn.cdr.annotation.Configurator.configure(Configurator.java:91)
at org.milyn.cdr.annotation.Configurator.configure(Configurator.java:66)
at org.milyn.delivery.JavaContentHandlerFactory.create(JavaContentHandlerFactory.java:63)
at org.milyn.delivery.ContentDeliveryConfigBuilder$ContentHandlerExtractionStrategy.addCDU(ContentDeliveryConfigBuilder.java:623)
at org.milyn.delivery.ContentDeliveryConfigBuilder$ContentHandlerExtractionStrategy.applyCDUStrategy(ContentDeliveryConfigBuilder.java:548)
at org.milyn.delivery.ContentDeliveryConfigBuilder$ContentHandlerExtractionStrategy.applyStrategy(ContentDeliveryConfigBuilder.java:536)
at org.milyn.delivery.ContentDeliveryConfigBuilder$SmooksResourceConfigurationTableIterator.iterate(ContentDeliveryConfigBuilder.java:711)
at org.milyn.delivery.ContentDeliveryConfigBuilder$SmooksResourceConfigurationTableIterator.access$300(ContentDeliveryConfigBuilder.java:690)
at org.milyn.delivery.ContentDeliveryConfigBuilder.extractContentHandlers(ContentDeliveryConfigBuilder.java:484)
at org.milyn.delivery.ContentDeliveryConfigBuilder.load(ContentDeliveryConfigBuilder.java:349)
at org.milyn.delivery.ContentDeliveryConfigBuilder.getConfig(ContentDeliveryConfigBuilder.java:146)
at org.milyn.container.standalone.StandaloneExecutionContext.<init>(StandaloneExecutionContext.java:91)
at org.milyn.container.standalone.StandaloneExecutionContext.<init>(StandaloneExecutionContext.java:65)
at org.milyn.Smooks.createExecutionContext(Smooks.java:383)
at org.milyn.Smooks.createExecutionContext(Smooks.java:346)
at com.hyro.telstrapoc.smooks.SmooksTransformTest.runSmooksTransform(SmooksTransformTest.java:215)
at com.hyro.telstrapoc.smooks.SmooksTransformTest.testSmooks(SmooksTransformTest.java:139)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
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.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:73)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:46)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41)
at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31)
at org.junit.runners.ParentRunner.run(ParentRunner.java:220)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
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)
Caused by: [Error: was expecting type: java.lang.Object; but found type: null]
[Near : {... }
els ....}]
^
[Line: 3, Column: 16]
at org.mvel2.util.CompilerTools.expectType(CompilerTools.java:355)
at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer._getAccessor(ReflectiveAccessorOptimizer.java:1052)
at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.optimizeCollection(ReflectiveAccessorOptimizer.java:1079)
at org.mvel2.ast.InlineCollectionNode.<init>(InlineCollectionNode.java:50)
at org.mvel2.compiler.AbstractParser.nextToken(AbstractParser.java:1173)
at org.mvel2.compiler.ExpressionCompiler._compile(ExpressionCompiler.java:118)
at org.mvel2.compiler.ExpressionCompiler.compile(ExpressionCompiler.java:65)
at org.mvel2.MVEL.compileExpression(MVEL.java:886)
at org.mvel2.MVEL.compileExpression(MVEL.java:891)
at org.mvel2.MVEL.compileExpression(MVEL.java:797)
at org.milyn.expression.MVELExpressionEvaluator.setExpression(MVELExpressionEvaluator.java:55)
at org.milyn.javabean.BeanInstancePopulator.initialize(BeanInstancePopulator.java:235)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.milyn.cdr.annotation.Configurator.invoke(Configurator.java:453)
... 42 more
If I remove the 3 lines initialising drools, it all passes again. I suspect that the MVEL engine is a singleton, and both drools and smooks are using the same instance. I believe drools is setting MVEL to disallow "IF" statements on the RHS of a rule. (see: http://drools-java-rules-engine.46999.n3.nabble.com/Trivial-rule-with-con...) I don't understand why MVEL thinks that my smooks expression is a RHS of a rule....
Heres the unit test:
@Test
public void testSmooks2() throws Exception {
String input =
"<ns5:user partyAdminRoles=\"\" lastName=\"Edwards\" firstName=\"Paul\" primary=\"false\" userID=\"pedwards\" otpTokenRemainingUses=\"0\" registrationCodeRemainingUses=\"0\" enabled=\"true\" customIntAttr1=\"0\" xmlns:ns2=\"urn:oasis:names:tc:SPML:2:0:reference\" xmlns=\"urn:oasis:names:tc:SPML:2:0\" xmlns:ns4=\"urn:oasis:names:tc:SPML:2:0:password\" xmlns:ns3=\"urn:oasis:names:tc:SPML:2:0:search\" xmlns:ns5=\"http://hyro.com/da/objectmodel\" xmlns:ns6=\"http://www.sifinfo.org/au/infrastructure/2.x\" xmlns:ns7=\"urn:oasis:names:tc:SPML:2:0:batch\">\n" +
" <ns5:emailAddresses emailAddress=\"pedwards(a)frazzle.co.nz\" primary=\"true\" type=\"Personal\" modificationMode=\"0\"/>\n" +
" <ns5:emailAddresses emailAddress=\"grumpy(a)frazzle.co.nz\" primary=\"false\" type=\"Personal\" modificationMode=\"0\"/>\n" +
" <ns5:authzRoleSubscriptions status=\"Active\" primary=\"false\" singlePasswordOptOut=\"false\" reprovision=\"false\" customBoolAttr5=\"false\" customBoolAttr4=\"false\" customBoolAttr3=\"false\" customBoolAttr2=\"false\" customBoolAttr1=\"false\" customIntAttr5=\"0\" customIntAttr4=\"0\" customIntAttr3=\"0\" customIntAttr2=\"0\" customIntAttr1=\"0\">\n" +
" <ns5:role roleName=\"Account\">\n" +
" <ns5:entitlement entitlementID=\"Open LDAP Account\" type=\"Account\"/>\n" +
" </ns5:role>\n" +
" </ns5:authzRoleSubscriptions>\n" +
" <ns5:auxEntities/>\n" +
"</ns5:user>\n";
UserType inUser = null;
Unmarshaller unmarshaller = null;
try {
log.debug("Unmarshalling: " + input);
unmarshaller = (Unmarshaller) SpmlConstants.unmarshallerPool.borrowObject();
inUser = ((JAXBElement<UserType>) unmarshaller.unmarshal(new StringReader(input))).getValue();
} catch (JAXBException e) {
log.error("Exception while trying to unmarshall input daSpmlString: " + e.getMessage());
e.printStackTrace();
throw e;
} catch (Exception e) {
log.error("Exception while trying to unmarshall input daSpmlString: " + e.getMessage());
e.printStackTrace();
throw e;
} finally {
SpmlConstants.unmarshallerPool.returnObject(unmarshaller);
}
log.debug("Unmarshalled: " + inUser.getUserID());
Properties parsed = runSmooksTransform(inUser);
assertNotNull(parsed);
for(Iterator<Object> i = parsed.keySet().iterator(); i.hasNext();) {
Object key = i.next();
Object value = parsed.get(key);
System.out.println("Key: " + key + " value: " + value);
}
}
Heres the smooks file:
<?xml version="1.0"?>
<smooks-resource-list xmlns="http://www.milyn.org/xsd/smooks-1.1.xsd"
xmlns:core="http://www.milyn.org/xsd/smooks/smooks-core-1.3.xsd"
xmlns:jb="http://www.milyn.org/xsd/smooks/javabean-1.3.xsd">
<!-- NOTE NOTE NOTE -->
<!-- This is purely to map user or person props to the LDAP name. Anything that is handled -->
<!-- explicitly (like firstname or lastname) does not get mapped -->
<jb:bean beanId="UserOrPerson" class="java.util.Properties" createOnElement="com.hyro.spmlservice.generated.objectmodel.PersonType">
<jb:value property="employeeNumber" decoder="String" data="personID" />
<jb:value property="mobile" decoder="String" data="mobileTel" />
<jb:value property="facsimileTelephoneNumber" decoder="String" data="workFax" />
<jb:value property="telephoneNumber" decoder="String" data="workTel" />
<jb:value property="description" decoder="String" data="title" />
<jb:value property="l" decoder="String" data="customAttr27" />
<jb:value property="physicalDeliveryOfficeName" decoder="String" data="customAttr8" />
<jb:value property="postalCode" decoder="String" data="customAttr7" />
</jb:bean>
<jb:bean beanId="UserOrPerson" class="java.util.Properties" createOnElement="com.hyro.spmlservice.generated.objectmodel.UserType">
<jb:value property="firstName" decoder="String" data="firstName" />
<jb:value property="lastName" decoder="String" data="lastName" />
<jb:value property="user" decoder="String" data="userID" />
<jb:value property="displayName" decoder="String" data="customAttr4" />
<jb:value property="postalCode" decoder="String" data="customAttr2" />
<jb:expression property="mail" execOnElement="emailAddresses">
if(1 == 2) {
return emailAddresses[0].emailAddress;
}
else {
return "NOT FOUND";
}
</jb:expression>
</jb:bean>
<jb:bean beanId="emailAddresses" class="java.util.ArrayList" createOnElement="emailAddresses">
<jb:wiring beanIdRef="emailAddressType" />
</jb:bean>
<jb:bean beanId="emailAddressType" class="com.hyro.spmlservice.generated.objectmodel.EmailAddressType" createOnElement="com.hyro.spmlservice.generated.objectmodel.EmailAddressType">
<jb:value property="modificationMode" decoder="Short" data="modificationMode" />
<jb:value property="emailAddress" decoder="String" data="emailAddress" />
<jb:value property="type" decoder="String" data="type" />
<jb:value property="primary" decoder="Boolean" data="primary" />
</jb:bean>
</smooks-resource-list>
Any Ideas? I've wasted 3 days getting to this point....
--
Paul Edwards
15 years, 11 months
Problem with DRL language/ XLS decision tables.
by tom ska
Hello,
I have a problem with defining rules. I insert many, many objects (facts) to
ksession object (StatefulKnowledgeSession). I want to fire rules for
*all*of them(facts), but I want to fire only one rule from all rules
for each one
fact(not always this same rule is fired, because I use salience).
activation-group is not appropriate, because it works only with one object
(fact) - rest is not processed by engine.
Second question is: how can I stop processing rules, bot only for one fact,
not for all of them.
Thanks,
tom.
P.S. forgive me my English... :)
P.S.2 Firstly I want to do this in DRL, then, I'll try with XLS, and write
post if I would find problems...
15 years, 11 months
Re: [rules-users] Drools Integration
by santosh mukherjee
Hi,
I am trying to integrate Drools with Apama. I have Apama installed and want
to pass the events mathched through Apama into Drools. Need help as to how
to proceed doing this. Basically I want that whenever a certain event
matches and is caught by Apama. I want to send it to the drl files which
will check the criteria and start relevant process.
Thanks
Santosh Mukherjee
15 years, 11 months
Help : Can't see process in gwt-console
by Han Ming Low
Hi,
I'm trying to start a sample process in the gwt-console by following a video
tutorial and list thread
http://blog.athico.com/2009/10/drools-51-m1-release-notes.html
http://markmail.org/message/y4sae37xvv44shhh
What I did was
- start h2
- start human task
- start jboss
It looks to me that all the services are started without error.
However, I'm not seeing the process in the gwt-console -> Processes view.
The process I have loaded in Guvnor is not available in the gwt-console.
I have uploaded 2 processes in Guvnor through Eclispe.
1 of them is a .rf file and the other is a bpmn file.
And, I also notice that the Settings -> System view, the ProcessEnginePlugin
is still a red cross.
And, the log shows
10:38:00,062 INFO [STDOUT] 10:38:00,062 INFO [PluginMgr] Successfully
loaded plugin 'org.jboss.bpm.console.server.plugin.FormDispatcherPlugin':
class org.drools.integration.console.forms.FormDispatcherComposite
10:38:00,062 INFO [STDOUT] 10:38:00,062 INFO [PluginMgr] Successfully
loaded plugin 'org.jboss.bpm.console.server.plugin.GraphViewerPlugin': class
org.drools.integration.console.graph.GraphViewerPluginImpl
10:38:00,078 INFO [STDOUT] 10:38:00,078 WARN [PluginMgr] Unable to load
plugin: 'org.jboss.bpm.console.server.plugin.ProcessEnginePlugin'
I have upload some screenshots of the different pages to here.
http://img826.imageshack.us/g/gwtconsolesystem.jpg/
Thanks for any advice.
Han Ming
15 years, 11 months
Improving Drools Memory Performance
by Jevon Wright
Hi everyone,
I am working on what appears to be a fairly complex rule base based on
EMF. The rules aren't operating over a huge number of facts (less than
10,000 EObjects) and there aren't too many rules (less than 300), but
I am having a problem with running out of Java heap space (set at ~400
MB).
Through investigation, I came to the conclusion that this is due to
the design of the rules, rather than the number of facts. The engine
uses less memory inserting many facts that use simple rules, compared
with inserting few facts that use many rules.
Can anybody suggest some tips for reducing heap memory usage in
Drools? I don't have a time constraint, only a heap/memory constraint.
A sample rule in my project looks like this:
rule "Create QueryParameter for target container of DetailWire"
when
container : Frame( )
schema : DomainSchema ( )
domainSource : DomainSource ( )
instance : DomainIterator( )
selectEdge : SelectEdge ( eval (
functions.connectsSelect(selectEdge, instance, domainSource )) )
schemaEdge : SchemaEdge ( eval (
functions.connectsSchema(schemaEdge, domainSource, schema )) )
source : VisibleThing ( eContainer == container )
target : Frame ( )
instanceSet : SetWire ( eval(functions.connectsSet(instanceSet,
instance, source )) )
detail : DetailWire ( )
eval ( functions.connectsDetail(detail, source, target ))
pk : DomainAttribute ( eContainer == schema, primaryKey == true )
not ( queryPk : QueryParameter ( eContainer == target, name == pk.name ) )
eval ( handler.veto( detail ))
then
QueryParameter qp = handler.generatedQueryParameter(detail, target);
handler.setName(qp, pk.getName());
queue.add(qp, drools); // wraps insert(...)
end
I try to order the select statements in an order that will reduce the
size of the cross-product (in theory), but I also try and keep the
rules fairly human readable. I try to avoid comparison operators like
< and >. Analysing a heap dump shows that most of the memory is being
used in StatefulSession.nodeMemories > PrimitiveLongMap.
I am using a StatefulSession; if I understand correctly, I can't use a
StatelessSession with sequential mode since I am inserting facts as
part of the rules. If I also understand correctly, I'd like the Rete
graph to be tall, rather than wide.
Some ideas I have thought of include the following:
1. Creating a separate intermediary meta-model to split up the sizes
of the rules. e.g. instead of (if A and B and C then insert D), using
(if A and B then insert E; if E and C then insert D).
2. Moving eval() statements directly into the Type(...) selectors.
3. Removing eval() statements. Would this allow for better indexing by
the Rete algorithm?
4. Reducing the height, or the width, of the class hierarchy of the
facts. e.g. Removing interfaces or abstract classes to reduce the
possible matches. Would this make a difference?
5. Conversely, increasing the height, or the width, of the class
hierarchy. e.g. Adding interfaces or abstract classes to reduce field
accessors.
6. Instead of using EObject.eContainer, creating an explicit
containment property in all of my EObjects.
7. Creating a DSL that is human-readable, but allows for the
automation of some of these approaches.
8. Moving all rules into one rule file, or splitting up rules into
smaller files.
Is there kind of profiler for Drools that will let me see the size (or
the memory usage) of particular rules, or of the memory used after
inference? Ideally I'd use this to profile any changes.
Thanks for any thoughts or tips! :-)
Jevon
15 years, 11 months
Working with BRL format
by wilsonywx
I've been trying to make a custom GUI to edit rules and store them in a
format that is easily exchangeable between the GUI and the rule engine. It
seems that the BRL format (which from what I understand is just an xml
representation of the rules that belong in a package) is a good file format
to use (although I am not too clear on how the .package file works with the
.brl files). In the meanwhile I've been looking at the source code of
Guvnor, in hope that I could find some classes that can convert between brl
and drl, as well as between the class model of rules and brl.
I found snippets of code that uses BRXMLPersistence to read from brl (I
think) into a RuleModel object, which is then converted into a DRL string
using BRDRLPersistence, something like:
RuleModel model =
BRXMLPersistence.getInstance().unmarshal(asset.getContent()); // how to get
asset?
model.name = asset.getName();
model.parentName = this.parentNameFromCategory(asset, model.parentName);
String drl = BRDRLPersistence.getInstance().marshal(model); // is this the
entire rule text?
I am not sure how to interface RuleModel with the GUI, though, so I would
like some pointer in that direction. Also, what is the class to read from a
.package file so that I can generate a drl file with the correct package
attribute and imports?
--
View this message in context: http://drools-java-rules-engine.46999.n3.nabble.com/Working-with-BRL-form...
Sent from the Drools - User mailing list archive at Nabble.com.
15 years, 11 months
Rules not firing when expected after retracting object in list
by Justin Beltran
Hi,
I'm coming across some weird behavior in Drools 4.0.7, but maybe it's just
cause I don't understand I how Drools works. Assume, there's a class "A"
that has a property called "property".
As facts, I have the following list of A's:
A1, property = 123
A2, property = 345
A3, property = 123
I have two rules as follows:
rule "Rule 1 - Remove all A's that have property set to 123"
salience 1000
lock-on-active true
when
$listOfAs : ArrayList collect(A( property == "123" ))
then
for (Object a: $listOfAs ) {
retract (a)
}
end
rule "Rule 2 - Do stuff with remaining A's"
salience 900
lock-on-active true
when
$listOfAs : ArrayList collect(A())
then
...
end
My understanding is "Rule 1" will remove the facts of class A that have
property to 123. When it gets to "Rule 2", shouldn't the "listOfAs" only
have that one A that remains (i.e. the one where property is set to "345").
What I'm noticing is that "Rule 2" just doesn't execute at all even though
I'm assuming there is still one "A" object that hasn't been retracted. If I
comment out the "retract" it executes "Rule 2" fine.
Am I missing something about these rules work?
Thanks.
Justin
15 years, 11 months