Skip to content

Instantly share code, notes, and snippets.

@tsurdilo
Created May 17, 2011 14:21
Show Gist options
  • Save tsurdilo/976557 to your computer and use it in GitHub Desktop.
Save tsurdilo/976557 to your computer and use it in GitHub Desktop.
package com.sample;
import java.util.concurrent.TimeUnit;
import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseConfiguration;
import org.drools.KnowledgeBaseFactory;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderError;
import org.drools.builder.KnowledgeBuilderErrors;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
import org.drools.common.EventFactHandle;
import org.drools.conf.EventProcessingOption;
import org.drools.definition.type.FactType;
import org.drools.io.ResourceFactory;
import org.drools.logger.KnowledgeRuntimeLogger;
import org.drools.logger.KnowledgeRuntimeLoggerFactory;
import org.drools.runtime.KnowledgeSessionConfiguration;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.conf.ClockTypeOption;
import org.drools.runtime.rule.FactHandle;
import org.drools.runtime.rule.WorkingMemoryEntryPoint;
import org.drools.time.SessionPseudoClock;
/**
* This is a sample class to launch a rule.
*/
public class DroolsTest {
public static final void main(String[] args) {
try {
// load up the knowledge base
KnowledgeBase kbase = readKnowledgeBase();
KnowledgeSessionConfiguration config = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
config.setOption( ClockTypeOption.get("pseudo") );
StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(config, null);
KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
WorkingMemoryEntryPoint eventStream = ksession.getWorkingMemoryEntryPoint( "Event Stream" );
SessionPseudoClock clock = ksession.getSessionClock();
FactType testEventType = kbase.getFactType( "com.sample","TestEvent" );
Object myTestEvent = testEventType.newInstance();
testEventType.set( myTestEvent, "value", "someValue" );
FactHandle eventHandle = eventStream.insert(myTestEvent);
ksession.fireAllRules();
clock.advanceTime( 15, TimeUnit.SECONDS );
//this is the test here!!
System.out.println( "Should be expired! : " + ((EventFactHandle)eventHandle).isExpired());
System.out.println( "Does the entry point still hold the fact handle? : " + eventStream.getFactHandles().contains(eventHandle));
logger.close();
} catch (Throwable t) {
t.printStackTrace();
}
}
private static KnowledgeBase readKnowledgeBase() throws Exception {
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add(ResourceFactory.newClassPathResource("Sample.drl"), ResourceType.DRL);
KnowledgeBuilderErrors errors = kbuilder.getErrors();
if (errors.size() > 0) {
for (KnowledgeBuilderError error: errors) {
System.err.println(error);
}
throw new IllegalArgumentException("Could not parse knowledge.");
}
KnowledgeBaseConfiguration config = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
config.setOption( EventProcessingOption.STREAM );
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(config);
kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
return kbase;
}
}
**********************************************
package com.sample
declare TestEvent
@role( event )
@expires( 10s )
value : String
end
rule "TestEventReceived"
no-loop
when
$event : TestEvent ( value != null ) over window:time( 10s ) from entry-point "Event Stream"
then
System.out.println("****** in consequence *****");
end
**********************************************
****** in consequence *****
Should be expired! : false
Does the entry point still hold the fact handle? : true
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment