I am using drools 6.0.1 and I have the following test.
public class DroolsTest {
public DroolsTest() {
}
@Test
public void work() throws InterruptedException, IOException,
ClassNotFoundException {
StringBuilder sb = new StringBuilder();
sb.append("package drools\n");
sb.append("import drools.MyObject;\n\n");
sb.append("declare MyObject\n"
+ " @role ( event )\n"
+ "end\n\n");
sb.append("rule \"Template2\"\n"
+ "\n"
+ "salience 0\n"
+ "dialect \"mvel\"\n"
+ "when\n"
+ " $s : MyObject(val==0)\n"
+ " not( MyObject(val==1, this after [0s,5s] $s ) )\n"
+ "\n"
+ "then\n"
+ " System.out.println(\"Template 2 fired\")\n"
+ " $s.name=\"2\";\n"
+ "\n"
+ "end\n");
KieServices kieServices = KieServices.Factory.get();
KieFileSystem kfs = kieServices.newKieFileSystem();
kfs.write("src/main/resources/rules.drl", sb.toString());
KieBuilder kieBuilder = kieServices.newKieBuilder(kfs);
kieBuilder.buildAll();
Results results = kieBuilder.getResults();
assertFalse(results.hasMessages(Message.Level.ERROR));
if (results.hasMessages(Message.Level.WARNING)) {
System.out.println("Warnings logged");
}
KieContainer kieContainer =
kieServices.newKieContainer(kieBuilder.getKieModule().getReleaseId());
KieBaseConfiguration kieBaseConfiguration =
kieServices.newKieBaseConfiguration();
kieBaseConfiguration.setOption(EventProcessingOption.STREAM);
KieBase kieBase = kieContainer.newKieBase(kieBaseConfiguration);
KieSession ksession = kieBase.newKieSession();
MyObject one = new MyObject();
one.val = 0;
FactHandle fh1 = ksession.insert(one);
System.out.println("Insert one");
ksession.fireAllRules();
for (int i = 0; i < 13; i++) {
System.out.println("Sleep:" + i);
Thread.sleep(1000);
//After 5 seconds, rule should fire
}
assertEquals("2", one.name);
System.out.println("End");
ksession.halt();
ksession.dispose();
}
public class MyObject implements Serializable {
String name;
int val;
boolean fired;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getVal() {
return val;
}
public void setVal(int val) {
this.val = val;
}
public boolean isFired() {
return fired;
}
public void setFired(boolean fired) {
this.fired = fired;
}
}
}
The rule is using
+ " $s : MyObject(val==0)\n"
+ " not( MyObject(val==1, this after [0s,5s] $s ) )\n"
So, if a MyObject with val==0 is inserted, then after 5 seconds no MyObject
with val==1 is found the rule will fire.
This works in Drools 5.5.0
In 6.0.1 the rule doesn't fire.
Please help. I want to use drools 6 but cannot with this problem.
Thanks
--
View this message in context:
http://drools.46999.n3.nabble.com/Drools-6-0-1-Negative-Patterns-in-Strea...
Sent from the Drools: User forum mailing list archive at
Nabble.com.