All,
This applies to the core engine itself and anyone touching its code.
As we move to a time-controlled engine in Drools 5, we need to be aware of a few things when developing our code:
1. We need to have a synchronization clock, and we do: in the InternalWorkingMemory interface:
public TimerService getTimerService();
TimerService has a method to get the current time:
public long getCurrentTime();
This means you should NEVER EVER EVER NEVER EVER use System.currentTimeMillis() again... if you see it in the code, please either fix it or add a FIXME tag and let me know so that I can fix it. I am cleaning up things right now.
The reason is obvious: controlling the synchronization clock means we control time as the engine sees it, so that we can use real time clocks, pseudo clocks controlled by the application, heart beat clocks, etc. This is also a requirement for us to implement clusters and distributed agents.
We still have a lot to fix on the serialization side of things for serializing scheduled executions, but lets see how this goes.
2. We need to have a synchronization clock, meaning if you use anything else as a clock, we need to remove it and make sure it is using the TimerService. I know Guvnor uses a TimerMachine class... I didn't had the time to look into this yet, but we will need to make sure it either starts using the TimerService or is synchronized with it.
3. Thread creation: make sure you don't execute anything assynchronously with your own created threads. We need to implement a factory based thread creation for the cases where we have to spawn threads.
Thanks,
Edson
--
Edson Tirelli
JBoss Drools Core Development
JBoss, a division of Red Hat @ www.jboss.com