In many cases it is useful (if not necessary) to store information about the execution of process instances, so that this information can be used afterwards, for example, to verify what actions have been executed for a particular process instance, or to monitor and analyze the efficiency of a particular process. Storing history information in the runtime database is usually not a good idea, as this would result in ever-growing runtime data, and monitoring and analysis queries might influence the performance of your runtime engine. That is why history information about the execution of process instances is stored separately.
This history log of execution information is created based on the events generated by the process engine during execution. The Drools runtime engine provides a generic mechanism to listen to different kinds of events. The necessary information can easily be extracted from these events and made persistent, for example in a database. Filters can be used to only store the information you find relevant.
The drools-bam module contains an event listener that stores process-related information in a database using Hibernate. The database contains two tables, one for process instance information and one for node instance information (see the figure below):
![]() |
To log process history information in a database like this, you need to register the logger on your session (or working memory) like this:
StatefulKnowledgeSession ksession = ...; WorkingMemoryDbLogger logger = new WorkingMemoryDbLogger(ksession); // invoke methods one your session here logger.dispose();
Note that this logger is like any other audit logger, which means
that you can add one or more filters by calling the method
addFilter
d to ensure that only relevant information is
stored in the database. Only information accepted by all your filters will
appear in the database. You should dispose the logger when it is no
longer needed.
To specify the database where the information should be stored,
modify the file hibernate.cfg.xml
file. By default,
it uses a memory-resident database (H2). Consult the Hibernate
documentation if you do not know how to do this.
All this information can easily be queried and used in a lot of
different use cases, ranging from creating a history log for one
specific process instance to analyzing the performance of all instances
of a specific process. Class ProcessInstanceDbLog
(in
package org.drools.process.audit
) shows some
examples on how to retrieve all process instances, one specific process
instance (by id), all process instances for one specific process, all
node instances of a specific process instance, etc. You can of course
easily create your own Hibernate queries, or access the information in
the database directly.
By default, the audit logger uses the H2 memory-resident database
that is recreated on startup. You can change this default by including
your own configuration file hibernate.cfg.xml
. This
allows you, for example, to change the underlying database, etc.
Refer to the Hibernate documentation for more information on how to do
this.