I see you are using a pseudo-clock. Do you advance the clock using the
appropriate API call?
Updating and retracting a fact inserted through an entry point should
be done with methods called on this object.
-W
On 29 November 2011 13:56, prashant.badhe <prashant.badhe(a)gmail.com> wrote:
Hi,
Tried your rule with the code below, but no luck.
I am using only one rule, so the fact remains in drools session for
sufficient time (> 5 s). Even if I uncomment the /thread.sleep(60000)/ line
below, the rule does not trigger.
~~~~~~~~~~~~~~~~~~
public class DroolsTest {
static StatefulKnowledgeSession ksession = null;
static KnowledgeRuntimeLogger logger = null;
public static final void main(String[] args) {
try {
initSession();
testTimerAttribute();
} catch (Throwable t) {
t.printStackTrace();
}
}
private static void testTimerAttribute() {
Alert alert = new Alert();
alert.setId(12345L);
alert.setType("TYPE");
alert.setComponentId("XXX");
WorkingMemoryEntryPoint entryPoint =
ksession.getWorkingMemoryEntryPoint("EventStream");
entryPoint.insert(alert);
System.out.println("inserted...Count: " +
entryPoint.getFactCount());
//Count returned = 1
try {
//Thread.sleep(60000);
} catch (Exception ex) {
System.out.println("Exception...");
}
Alert alert1 = new Alert();
alert1.setId(99991L);
alert1.setType("LINK_UP");
alert1.setComponentId("ZZZ");
entry.insert(alert1);
System.out.println("inserted again...Count: " +
entry.getFactCount());
//Count returned = 2
logger.close();
}
private static void initSession() {
new Thread(new Runnable() {
public void run() {
try {
System.out.println("Inside
initSession()...");
KnowledgeBase kbase = readKnowledgeBase();
KnowledgeSessionConfiguration conf =
KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
conf.setOption( ClockTypeOption.get(
"pseudo" ) );
ksession = kbase.newStatefulKnowledgeSession(conf,
null);
logger =
KnowledgeRuntimeLoggerFactory.newFileLogger(ksession,
"test");
ksession.fireUntilHalt();
} catch (Exception t) {
System.out.println("Inside thread init()
error..." +
t.getMessage() + "#########" + t.getStackTrace());
}
}
}).start();
}
}
And the rule is:
rule "check timer attribute"
agenda-group "enrichment"
auto-focus true
no-loop
salience 140
//timer (int: 5s 1s)
when
$alertObj : Object( eval($alertObj instanceof Alert)) from entry-point
"EventStream"
$alert : Alert( componentId == "XXX" ) from entry-point
"EventStream"
then
try {
System.out.println("[enrichment] nullify empty component id
[alert=" +
((Alert)$alertObj).getId() + "] [Time: " +
(Calendar.getInstance().getTimeInMillis()));
//$alert.setType("test type");
//$alert.setComponentId("YYY");
//update($alert);
} catch (Throwable e) {
System.out.println("[enrichment] ############## ERROR:
nullify empty
component id [alertId="); // + $alert.getId() + "][error=" +
e.toString() +
"]");
}
end
~~~~~~~~~~~~~~~~~~
Please suggest us some solution on timer() issue .
One more thing I observed today is (without timer() off course), when I put
following 3 lines in RHS of rule:
/$alert.setType("test type");
$alert.setComponentId("YYY");
update($alert);/
then sometimes I get following exception at /update($alert)/:
*java.lang.ClassCastException: org.drools.common.DefaultFactHandle cannot be
cast to org.drools.common.EventFactHandle*
org.drools.reteoo.ObjectTypeNode.assertObject(ObjectTypeNode.java:201)
org.drools.reteoo.EntryPointNode.assertObject(EntryPointNode.java:145)
org.drools.common.NamedEntryPoint.update(NamedEntryPoint.java:251)
org.drools.base.DefaultKnowledgeHelper.update(DefaultKnowledgeHelper.java:183)
org.drools.base.DefaultKnowledgeHelper.update(DefaultKnowledgeHelper.java:196)
abc.xyz.alertProcessor.Rule_check_timer_attribute_0.defaultConsequence(Rule_check_timer_attribute_0.java:27)
abc.xyz.alertProcessor.Rule_check_timer_attribute_0DefaultConsequenceInvoker.evaluate(Rule_check_timer_attribute_0DefaultConsequenceInvoker.java:35)
org.drools.common.DefaultAgenda.fireActivation(DefaultAgenda.java:917)
org.drools.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:856)
org.drools.common.DefaultAgenda.fireUntilHalt(DefaultAgenda.java:1049)
org.drools.common.AbstractWorkingMemory.fireUntilHalt(AbstractWorkingMemory.java:829)
org.drools.common.AbstractWorkingMemory.fireUntilHalt(AbstractWorkingMemory.java:805)
org.drools.impl.StatefulKnowledgeSessionImpl.fireUntilHalt(StatefulKnowledgeSessionImpl.java:230)
Does this mean, modifying value of fact members in RHS is not expected? , &
if modified then drools may not find that object in its pool for update() &
retract() (based on the EventFactHandle)?
- Prashant
--
View this message in context:
http://drools.46999.n3.nabble.com/rules-users-duration-attribute-other-ru...
Sent from the Drools: User forum mailing list archive at
Nabble.com.
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users