私は drools fusion 6.2 final に取り組んでおり、ストリーム モードで新しいイベントが発生した場合にルールを起動したいと考えています。しかし、ルールはそれ自体で解雇されるわけではありません。
私のルールファイルの内容は次のとおりです。
//created on: May 8, 2015
package com.test
import com.test.Applicant
declare Applicant
@role(event)
end
rule "Your First Rule"
when
accumulate( $st : Applicant(age: age) over window:time(10ms) from entry-point X , $c: average ( age ) )
then
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~avg~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
System.out.println($c);
System.out.println("~~~~~~~~~~~~~~~~~~~~~~~~~~~avg~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
end
コードは次のとおりです。
package com.test;
import org.kie.api.KieBaseConfiguration;
import org.kie.api.conf.EventProcessingOption;
import org.kie.api.io.ResourceType;
import org.kie.api.runtime.KieSessionConfiguration;
import org.kie.api.runtime.conf.ClockTypeOption;
import org.kie.api.runtime.rule.EntryPoint;
import org.kie.internal.KnowledgeBase;
import org.kie.internal.KnowledgeBaseFactory;
import org.kie.internal.builder.KnowledgeBuilder;
import org.kie.internal.builder.KnowledgeBuilderFactory;
import org.kie.internal.io.ResourceFactory;
import org.kie.internal.runtime.StatefulKnowledgeSession;
@SuppressWarnings("deprecation")
public class DroolsTest {
public DroolsTest() {
KieBaseConfiguration config_time = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
config_time.setOption(EventProcessingOption.STREAM);
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource("test.drl", getClass()), ResourceType.DRL);
if (kbuilder.hasErrors()) {
System.out.println("EERRRRRRRROOOOOORRRR");
System.out.println(kbuilder.getErrors().toString());
System.out.println("EERRRRRRRROOOOOORRRR");
}
KieBaseConfiguration kBaseConfig = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(kBaseConfig);
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
KieSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
conf.setOption(ClockTypeOption.get("REALTIME"));
final StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(conf, null);
final EntryPoint atmStream = ksession.getEntryPoint("X");
for (int i = 0; i < 100; i++) {
System.out.println("LOOOOOOOOOOOOOOOOOOOOP " + i);
Applicant applicant = new Applicant("Mr John Smith " + i, i);
atmStream.insert(applicant);
// ksession.fireAllRules();
}
ksession.dispose();
}
public static void main(String[] args) {
new DroolsTest();
}
}
意図的に呼び出された場合はルールが起動されますが、ストリームで新しいイベントが発生した場合は起動できませんでした。