Pattern of usage question
by Laird Nelson
I have several questions about using Drools in a stateless Java EE
application.
(I've actually used it for years, but have always felt an impedance
mismatch and finally have a moment to ask about it. :-))
Like (I suspect) many people, I have a stateless session bean responsible
for some business logic with Drools in the mix. I'm looking to implement
its—say—doWork() method with a knowledge session under the covers.
What I'm curious about is: in a rules engine, facts are sort of expected to
stick around for a while (that's state; I know there are stateless
sessions, but those are kind of ephemeral). You grab a bunch of facts, and
over time they get inserted into the knowledge session, which sticks around
in some manner. Then, periodically, you fire all rules, and deal with the
consequences. Along comes another processing situation; you fire all
rules, and deal with the consequences again. And so on. The fact
maintenance seems stateful here while the rule processing is stateless.
How do people deploy stateless systems with this stateful concept at their
core? Which of the many possibilities is most commonly used?
Serialize/deserialize the session on each request (yuck)? Singleton beans
(yuck, I think)? Outboard drools server with RPC (also yuck, I think)?
Next, in a dynamic business application, it's often the case that single
rules need to be added to the knowledge base. Someone wants to add in, for
example, a new way of calculating fees. They don't—at a human level—want
to open up the catalog of 47,000 rules, add one, and then
re-install/re-deploy the thus-changed catalog of rules. They just—again,
at a human level—want to add a new rule. Is redeploying the catalog the
only way to go here, or is there a way that I've missed to incrementally
and programmatically add a rule to a KnowledgeBase?
More generally: in a stateless app, where do these concepts live? Where do
they *best* live, I should say?
(For completeness, I'm the author of the
drools-jca<https://code.google.com/p/drools-jca/>project, which
attempts to make Drools 5.x Java EE compatible by offloading
its filesystem and threading operations into a JCA resource adapter. I'm
not convinced that's the best place for it and with Drools 6 doing
different things with threads and with Java EE 7 relaxing its restrictions
on filesystem access I'm looking for better patterns.)
Thanks very much for reading; looking forward to the replies.
Best,
Laird
--
http://about.me/lairdnelson
12 years, 5 months
Are rule templates part of supported API?
by darrell.pittman
I am new to drools. The drools API doesn't include the
ExternalSpreadSheetCompiler. The on-line user guide (section 2.4.7 in the
expert guide) has an incorrect example for how to load a rule template and
data spreadsheet. It just shows loading the spreadsheet. No mention of
loading the rule template.
My question is: Is the ExternalSpreadSheetCompiler the correct way to load
in a rule template that uses a spreadsheet for it's data source? Note:
Eclipse gives a "Discouraged Access" warning when using the
ExternalSpreadSheetCompiler.
--
View this message in context: http://drools.46999.n3.nabble.com/Are-rule-templates-part-of-supported-AP...
Sent from the Drools: User forum mailing list archive at Nabble.com.
12 years, 5 months
Dynamically populate Rule-Flow Group?
by nzhu972
Hi,
I am using BRMS 5.3.1 and I have a scenario where I will have multiple
decision tables and for each decision table, a corresponding workflow
process is associated with it (scenario 1)
Scenario 1.
decision table: X, Y, Z
WorkFlow : A, B, C
Since there are no difference between the workflows except for the decision
table that the flow is referencing, I like to combine the workflows into one
single flow and dynamically populate the rule-flow group (see scenario 2)
Scenario 2.
decision table: X, Y, Z
WorkFlow : A
The rule-flow group will determine which set of decision table is relevant.
I have not seen examples where rule-flow group or any other attribute being
dynamically populated. Typically, they are assigned with a string during
declaration.
My question is :
is it possible to dynamic determine the value for rule-flow group during run
time and then assign it with a value?
Thanks in advance for any advice.
--
View this message in context: http://drools.46999.n3.nabble.com/Dynamically-populate-Rule-Flow-Group-tp...
Sent from the Drools: User forum mailing list archive at Nabble.com.
12 years, 5 months
AfterEvaluatorDefinition NullPointer Exception in deserialized ksession
by Alexander Wolf
[Drools 5.5.0 Final]
I wrote a webserver that keeps StatefulKnowledgeSessions running in Stream mode. When the server is stopped, the sessions are serialized and stored in a database. When the server is restarted, the existing sessions are restored / deserialized.
Some time after recreating the session and inserting some events I get the following exception:
java.lang.NullPointerException: null
at org.drools.base.evaluators.AfterEvaluatorDefinition$AfterEvaluator.evaluateCachedLeft(AfterEvaluatorDefinition.java:351)
...
Apparently the exception seems to be related to a rule that uses temporal reasoning.
After getting it once, the session seems to be corrupt -> from now on every time I call ksession.insert(event) the same exception occurs.
When I serialize the session and attempt to deserialize it, I get a long stack trace --> I can not deserialize it anymore. (as apparently it is corrupted).
When I run the server with the same events/sessions without stopping (serialization/deserialization) the exception does not occur)
Can I do anything to prevent this behaviour? I thought maybe the "after" timer/trigger is somehow still active when I serialize the ksession.
I tried ksession.halt() before serialization, but with no effect.
Any ideas?
12 years, 5 months
Issue in Drools 5.5 concerned with rule and scanning list with from command
by braveheart85
Hello,
I'm having a strange issue. I have a medium size rule file with rules like
these:
when
InvestigationTarget( $code : identifierCode )
$s: SubjectData( identifierCode == $code )
$r: Registry( )
$y: YearData( ) from $r.years
$p: Purchase( customerIdentifierCode == $s.identifierCode ) from
$y.purchases
then
...
My application is actually still a prototype and i work building a session
with facts already inserted and when the system started the user changes DRL
to use with facts.
My issue is when i add resource to knowledge builder. I catch an exception
when exists one fact can activate the above rule:
java.lang.RuntimeException: unable to invoke method:
org.titan.registry.BusinessEntityData.getIdentifierCode: target of method is
null
at
com.liferay.portal.kernel.portlet.LiferayPortlet.callActionMethod(LiferayPortlet.java:171)
at
com.liferay.util.bridges.mvc.MVCPortlet.callActionMethod(MVCPortlet.java:250)
at
com.liferay.portal.kernel.portlet.LiferayPortlet.processAction(LiferayPortlet.java:80)
at
com.liferay.util.bridges.mvc.MVCPortlet.processAction(MVCPortlet.java:220)
at com.liferay.portlet.FilterChainImpl.doFilter(FilterChainImpl.java:70)
at
com.liferay.portal.kernel.portlet.PortletFilterUtil.doFilter(PortletFilterUtil.java:48)
at
com.liferay.portal.kernel.servlet.PortletServlet.service(PortletServlet.java:111)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:72)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilter.doFilter(InvokerFilter.java:73)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at
org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684)
at
org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:593)
at
org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:530)
at
com.liferay.portlet.InvokerPortletImpl.invoke(InvokerPortletImpl.java:534)
at
com.liferay.portlet.InvokerPortletImpl.invokeAction(InvokerPortletImpl.java:579)
at
com.liferay.portlet.InvokerPortletImpl.processAction(InvokerPortletImpl.java:294)
at
com.liferay.portal.action.LayoutAction.processPortletRequest(LayoutAction.java:944)
at
com.liferay.portal.action.LayoutAction.processLayout(LayoutAction.java:688)
at com.liferay.portal.action.LayoutAction.execute(LayoutAction.java:249)
at
org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:431)
at
org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:236)
at
com.liferay.portal.struts.PortalRequestProcessor.process(PortalRequestProcessor.java:176)
at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1196)
at org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at
com.liferay.portal.servlet.MainServlet.callParentService(MainServlet.java:560)
at com.liferay.portal.servlet.MainServlet.service(MainServlet.java:537)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:72)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116)
at
com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:163)
at
com.liferay.portal.servlet.filters.secure.SecureFilter.processFilter(SecureFilter.java:294)
at
com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:57)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:206)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:108)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilter.doFilter(InvokerFilter.java:73)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at
org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:684)
at
org.apache.catalina.core.ApplicationDispatcher.processRequest(ApplicationDispatcher.java:471)
at
org.apache.catalina.core.ApplicationDispatcher.doForward(ApplicationDispatcher.java:402)
at
org.apache.catalina.core.ApplicationDispatcher.forward(ApplicationDispatcher.java:329)
at
com.liferay.portal.servlet.FriendlyURLServlet.service(FriendlyURLServlet.java:138)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:72)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116)
at
com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:163)
at
com.liferay.portal.servlet.filters.strip.StripFilter.processFilter(StripFilter.java:335)
at
com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:57)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:206)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:108)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116)
at
com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:163)
at
com.liferay.portal.servlet.filters.gzip.GZipFilter.processFilter(GZipFilter.java:123)
at
com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:57)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:206)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:108)
at
com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:163)
at
com.liferay.portal.servlet.filters.secure.SecureFilter.processFilter(SecureFilter.java:294)
at
com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:57)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:206)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:108)
at
com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:163)
at
com.liferay.portal.servlet.filters.i18n.I18nFilter.processFilter(I18nFilter.java:241)
at
com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:57)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:206)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:108)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116)
at
com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:163)
at
com.liferay.portal.servlet.filters.autologin.AutoLoginFilter.processFilter(AutoLoginFilter.java:246)
at
com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:57)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:206)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:108)
at
com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:163)
at
com.liferay.portal.servlet.filters.sso.ntlm.NtlmPostFilter.processFilter(NtlmPostFilter.java:83)
at
com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:57)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:206)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:108)
at
com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:163)
at
com.liferay.portal.sharepoint.SharepointFilter.processFilter(SharepointFilter.java:80)
at
com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:57)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:206)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:108)
at
com.liferay.portal.kernel.servlet.BaseFilter.processFilter(BaseFilter.java:163)
at
com.liferay.portal.servlet.filters.virtualhost.VirtualHostFilter.processFilter(VirtualHostFilter.java:216)
at
com.liferay.portal.kernel.servlet.BaseFilter.doFilter(BaseFilter.java:57)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:206)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:108)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:187)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:95)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116)
at
org.tuckey.web.filters.urlrewrite.UrlRewriteFilter.doFilter(UrlRewriteFilter.java:738)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDoFilter(InvokerFilterChain.java:206)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:108)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:167)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:95)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:167)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:95)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:116)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.processDirectCallFilter(InvokerFilterChain.java:187)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilterChain.doFilter(InvokerFilterChain.java:95)
at
com.liferay.portal.kernel.servlet.filters.invoker.InvokerFilter.doFilter(InvokerFilter.java:73)
at
org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at
org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at
org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
at
org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at
org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at
org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at
org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at
org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at
org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at
org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at
org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
at
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
at
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
at
java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.RuntimeException: unable to invoke method:
org.titan.registry.BusinessEntityData.getIdentifierCode: target of method is
null
at
org.mvel2.optimizers.impl.refl.nodes.GetterAccessor.getValue(GetterAccessor.java:66)
at
org.mvel2.optimizers.impl.refl.nodes.VariableAccessor.getValue(VariableAccessor.java:37)
at org.mvel2.ast.ASTNode.getReducedValueAccelerated(ASTNode.java:108)
at
org.mvel2.ast.BinaryOperation.getReducedValueAccelerated(BinaryOperation.java:107)
at org.mvel2.MVELRuntime.execute(MVELRuntime.java:85)
at
org.mvel2.compiler.CompiledExpression.getValue(CompiledExpression.java:123)
at org.mvel2.MVEL.executeExpression(MVEL.java:930)
at
org.drools.rule.constraint.MvelConditionEvaluator.evaluate(MvelConditionEvaluator.java:70)
at
org.drools.rule.constraint.MvelConditionEvaluator.evaluate(MvelConditionEvaluator.java:49)
at
org.drools.rule.constraint.MvelConstraint.evaluate(MvelConstraint.java:167)
at
org.drools.rule.constraint.MvelConstraint.isAllowedCachedLeft(MvelConstraint.java:136)
at
org.drools.common.SingleBetaConstraints.isAllowedCachedLeft(SingleBetaConstraints.java:130)
at org.drools.reteoo.FromNode.updateSink(FromNode.java:473)
at org.drools.reteoo.RuleTerminalNode.attach(RuleTerminalNode.java:344)
at
org.drools.reteoo.builder.ReteooRuleBuilder.addSubRule(ReteooRuleBuilder.java:168)
at
org.drools.reteoo.builder.ReteooRuleBuilder.addRule(ReteooRuleBuilder.java:128)
at org.drools.reteoo.ReteooBuilder.addRule(ReteooBuilder.java:116)
at org.drools.reteoo.ReteooRuleBase.addRule(ReteooRuleBase.java:445)
at org.drools.common.AbstractRuleBase.addRule(AbstractRuleBase.java:956)
at
org.drools.common.AbstractRuleBase.addPackages(AbstractRuleBase.java:627)
at org.drools.reteoo.ReteooRuleBase.addPackages(ReteooRuleBase.java:472)
at
org.drools.impl.KnowledgeBaseImpl.addKnowledgePackages(KnowledgeBaseImpl.java:150)
at
org.myproject.frontend.investigation.drools.DroolsInvestigationEngine.setResources(DroolsInvestigationEngine.java:137)
at
org.myproject.frontend.investigation.drools.filter.InvestigationFilter.setupEnvironment(InvestigationFilter.java:118)
at
org.myproject.frontend.investigation.drools.DroolsFilter.execute(DroolsFilter.java:19)
at
org.myproject.frontend.investigation.drools.DroolsInvestigationSession.executeFilter(DroolsInvestigationSession.java:64)
at org.myproject.portlet.SearchResult.openGraph(SearchResult.java:86)
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
com.liferay.portal.kernel.portlet.LiferayPortlet.callActionMethod(LiferayPortlet.java:153)
... 136 more
Caused by: java.lang.NullPointerException
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.mvel2.optimizers.impl.refl.nodes.GetterAccessor.getValue(GetterAccessor.java:43)
... 167 more
I tried a workaround modifying rule in this way:
$p: Purchase( customerIdentifierCode == $code ) from $y.purchases
thus i don't catch the exception anymore, but simply the rule don't activate
though it should.
If anyone could help me...
Best regards
--
View this message in context: http://drools.46999.n3.nabble.com/Issue-in-Drools-5-5-concerned-with-rule...
Sent from the Drools: User forum mailing list archive at Nabble.com.
12 years, 5 months
KIE API
by thilo
I'm quite new to Drools Expert and so far the framework looks promising. As
we started a new project, I went for Drools Export 6.0.0CR4. Creating a
prototype, I realized that the class KnowledgeBase is deprecated, so I tried
to use the new KIE API. After checking the examples
https://github.com/droolsjbpm/drools/tree/master/drools-examples-api
and this previous discussion here:
http://drools.46999.n3.nabble.com/KIE-api-verbosity-td4023024.html
I'm a bit confused about the new API (also because there is little
information in the official documentation yet).
- Is the KIE API stable (because of the CR) and is it save to use or are we
better off, using 5.5?
- Except for the examples above, is there more documentation available (the
API is really verbose)? Is there any documentation for the CDI part?
- Our requirements are easy: we will have to some simple DRL files and we
want to use them in a stateless session, but it would be nice to allow rule
updates in the running system. Is this possible with KModules or is there
any other proper way using the KIE API?
Thanks in advance for all inputs!
Thilo
--
View this message in context: http://drools.46999.n3.nabble.com/KIE-API-tp4026336.html
Sent from the Drools: User forum mailing list archive at Nabble.com.
12 years, 5 months
BuildError: Unable to Analyse Expression var == "a"
by richie
Why var can not be used in the when clause? I tried to use it in then clause
such as modify ($d) {var = "d"}; it just worked well.
Is var a keyword in drools or mvel? I didn't find it anywhere both in drools
export doc and mvel guide.
Following is the content of my drl file:
package test
declare Dd
@propertyReactive
var : String
age : Integer
end
rule "Rule A"
dialect "mvel"
salience 0
no-loop
when
$d:Dd(var == "a")
then
modify ($d) {age = 3};
end
In the eclipse editor, it just shows an error marker before line $d:Dd(var
== "a"):
BuildError: Unable to Analyse Expression var == "a":
[Error: unexpected end of statement]
[Near : {... var == "a" ....}]
^
[Line: 14, Column: 0]
And when invoke the rule, it just threw following exception:
java.lang.RuntimeException: Error while creating KieBase[Message [id=1,
level=ERROR, path=rules/Sample.drl, line=14, column=0
text=Unable to Analyse Expression var == "a":
[Error: unexpected end of statement]
[Near : {... var == "a" ....}]
^
[Line: 14, Column: 0]]]
at
org.drools.compiler.kie.builder.impl.KieContainerImpl.getKieBase(KieContainerImpl.java:176)
at
org.drools.compiler.kie.builder.impl.KieContainerImpl.newKieSession(KieContainerImpl.java:315)
at
org.drools.compiler.kie.builder.impl.KieContainerImpl.newKieSession(KieContainerImpl.java:290)
at com.sample.DroolsTest.main(DroolsTest.java:18)
I really appreciate any help you can provide.
--
View this message in context: http://drools.46999.n3.nabble.com/BuildError-Unable-to-Analyse-Expression...
Sent from the Drools: User forum mailing list archive at Nabble.com.
12 years, 5 months
Finalizing Drools 5.6
by Mario Fusco
Hi all,
we are about to finalize Drools 5.6 and we would like to complete this
process as soon as possible.
However we would also like to be sure that we are not leaving any important
fix out, so please, if you want to signal any outstanding issue, report it
with a proper reproducer within one week from today.
Moreover, before to file a new jira ticket, try to be reasonably sure that
you are not just duplicating an already existing reported issues: we fixed
lots of bugs in the last months, and I believe (or better I hope) that it
is quite improbable that there could be many problems still waiting to be
discovered and resolved.
Thanks for you help,
Mario
12 years, 5 months