This is code that can be used to manipulate the pseudo-clock which is
just a pretty face without any works:
SessionPseudoClock clock;
private void advance( Date eventDate ){
long currentTime = clock.getCurrentTime();
long eventTime = eventDate.getTime();
clock.advanceTime( eventTime - currentTime, TimeUnit.MILLISECONDS );
}
Of course, you can use other ways to determine a number of
milliseconds for moving the hands of the pseudo-clock. If you use the
number of peas in a pot, it'll work just as well, although the data
might be closer to 1970.
-W
On 31/05/2014, Natalia Iglesias de Amunategui
<natalia.iglesias(a)casadearriba.net> wrote:
Hello,
I am implementing temporal rules using drools fusión 6.0.1 and the new KIE
services api. I insert facts into the kie session that include some DATE
fields which I later use in the rules. I also insert events using the
pseudoclock, so I guess that means that the timestamp is kept in long
format.
The consequence is that my temporal rules do not fire at all! I have no
@timestamp annotation in the declare of the event, so Drools internal clock
should be used as timestamp.
I have displayed the value of the pseudoclock getCurrentTime method, and
the output shows a date of 1970:
I need to understand why the clock.getTime returns dates of 1970, maybe
when
this is solved the rules will fire with the internal event timestamp.
(After that I have tried every possible combination: creating a date or
long
field in the event fact representing the timestamp, converting long to date
and viceversa, but nothing seems to work..).
I enclose here the initialization that I do of the kieContainer and
session:
public static void main(final String[] args) {
try {
// load up the knowledge base
KieServices ks = KieServices.Factory.get();
KieContainer kContainer =
ks.getKieClasspathContainer();
System.out.println(kContainer.verify().getMessages().toString());
// set stream mode as opposite to cloud mode
KieBaseConfiguration kbconf =
KieServices.Factory.get().newKieBaseConfiguration();
kbconf.setOption(EventProcessingOption.STREAM );
// set clock to pseudo clock to be able to advance it
manually
KieSessionConfiguration ksconf =
KieServices.Factory.get().newKieSessionConfiguration();
ksconf.setOption(ClockTypeOption.get("pseudo"));
// returns ksession from kiecontainer as defined in the
kmodule.xml file
KieSession kSession =
kContainer.newKieSession("VAPSession", ksconf);
// Insert test patients and related classes, dates are
in long format to match pseudoclock
final Patient p1 = new Patient( "MrJones", 45, 1,
true,false,false,35.0,
5000,"None","Localized
Infiltrates","Yes","None","S.Aureus",245,false, false,
0,
true,new
SimpleDateFormat("yyyy-MM-dd").parse("2014-05-31").getTime(),"",
new
SimpleDateFormat("yyyy-MM-dd").parse("2014-05-31").getTime(),false,false,fal
se,false);
kSession.insert( p1 );
// Insert test patients and related classes, dates are
long format
final Patient p2 = new Patient( "MissDaisy", 90, 1,
true,false,true,37.0,
5000,"Purulent","Diffuse or Patchy
Infiltrates","None","Heavy","S.Aureus",235,false,
false, 0,
true,new
SimpleDateFormat("yyyy-MM-dd").parse("2014-05-31").getTime(),"",
new
SimpleDateFormat("yyyy-MM-dd").parse("2014-05-31").getTime(),false,false,tru
e,false);
kSession.insert( p2 );
// define and get a reference to the entry point
EntryPoint nursingStream = kSession.getEntryPoint(
"NursingStream" );
// define session clock
SessionPseudoClock clock = kSession.getSessionClock();
// insert events
// then, while inserting events, advance the clock as
necessary:
clock.advanceTime(24, TimeUnit.HOURS);
CPIScore cpiScore1 = new CPIScore(
p1,"diagnosis",7,ToDate(clock.getCurrentTime()) );
nursingStream.insert( cpiScore1 );
System.out.println(cpiScore1.getcpiScoreDate());
// day 2
clock.advanceTime( 24, TimeUnit.HOURS );
cpiScore1 = new CPIScore(
p1,"follow-up",5,ToDate(clock.getCurrentTime()) );
nursingStream.insert( cpiScore1 );
System.out.println(cpiScore1.getcpiScoreDate());
// day 3
clock.advanceTime( 24, TimeUnit.HOURS );
cpiScore1 = new CPIScore(
p1,"follow-up",5,ToDate(clock.getCurrentTime()) );
nursingStream.insert( cpiScore1 );
System.out.println(cpiScore1.getcpiScoreDate());
The fact classes have now long fields to represent Dates (I changed to see
if that made a difference, it didn't). The event class has such a long
field
that can be defined as @timestamp but I rather prefer to use the internal
event timestamp managed by Drools.
So in my .DRL file I'd like to have:
declare CPIScore
@role(event)
end
In my rules I compare the patient hospitalization date (defined as Date and
later as Long in the fact class) with a stream of events , and I expect
drools to extract the correct timestamp from the event. This can't happen
if
1970 is the pseudoclock date.
Please advice as about how to proceed, I'm a bit lost at this point.
Thanks in advance
Natalia
---
Este mensaje no contiene virus ni malware porque la protección de avast!
Antivirus está activa.
http://www.avast.com