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.igles...@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 > _______________________________________________ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users