Here is the code I am using to manage the running session(switched to fireUntilHalt()). This seems to lockup after sometime. Any thoughts why?
import org.apache.log4j.Logger; import org.drools.audit.WorkingMemoryFileLogger; import org.drools.runtime.ObjectFilter; import org.drools.runtime.StatefulKnowledgeSession; import org.drools.runtime.rule.FactHandle; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; /** * *Description:* RuleRunner is responsible for managing a drools session * running on another thread. The thread will allow insertion of facts and * global during it's execution. * * @author Michael Weiss * */ public class RuleRunner implements Runnable { private static final Logger logger = Logger.getLogger(RuleRunner.class); private StatefulKnowledgeSession session; private WorkingMemoryFileLogger sessionLogger; private boolean running; private ImmutableList<ObjectFilter> filters; private String runningThreadName; /** * *Description: * Construct a RuleRunner object with the given drools * stateful session * * @param session * - The {@link org.drools.runtime.StatefulKnowledgeSession * StatefulKnowledgeSession} to be managed by the RuleRunner. All * facts will be passed into this session for drools evaluation */ public RuleRunner(StatefulKnowledgeSession session) { this.session = session; this.running = false; } /** * *Description: * Construct a RuleRunner object with the given drools * stateful session * * @param session * - The {@link org.drools.runtime.StatefulKnowledgeSession * StatefulKnowledgeSession} to be managed by the RuleRunner. All * facts will be passed into this session for drools evaluation * * @param filters * - An immutable list of {@link org.drools.runtime.ObjectFilter * object filters} which will be used to determine if the session * is still processing. * */ public RuleRunner(StatefulKnowledgeSession session, ImmutableList<ObjectFilter> filters) { this.session = session; this.filters = filters; this.running = false; } /* * (non-Javadoc) * * @see java.lang.Runnable#run() */ @Override public void run() { this.runningThreadName = Thread.currentThread().getName(); if (logger.isDebugEnabled()) { logger.debug("Rule Runner has been kicked off on " + this.runningThreadName); } running = true; while (running) { session.fireUntilHalt(); } logger.info("Disposing session...."); session.halt(); if (sessionLogger != null) { sessionLogger.writeToDisk(); sessionLogger = null; } this.session.dispose(); } /** * *Description: * Insert's or update's the object based on weather the * object already exists in the currently active drools session. * * @param fact * - The object to be inserted or updated. */ public synchronized void insertOrUpdate(Object fact) { insert(fact); } private synchronized void insert(Object fact) { if (!running) { logger.warn("Inserting objects into non-running rules session"); } Preconditions.checkNotNull(fact); FactHandle factHandle = this.session.getFactHandle(fact); if (factHandle == null) { this.session.insert(fact); } else { this.session.update(factHandle, fact); } } /** * *Description: * Add a global object with the given id to the drools * session. It is important to note that globals should not be used for an * object which needs to be evaluation by the drools session each time it is * modified. A global placed in the drools session will not cause the rule * session to reevaluate. However globals are a great way to keep track of * information that may be needed to be retrieved from the running session. * * @param identifier * - The identifier of the global as defined in the rules * @param value * - The global object */ public synchronized void addGlobal(String identifier, Object value) { if (!running) { logger.warn("Inserting objects into non-running rules session"); } this.session.setGlobal(identifier, value); } /** * *Description: * Shutdown the thread the currently running drools * session. If set to shutdown in safe mode, object filters will be used to * determine if any of the filtered objects exists in the session. If any do * that the session will stay active until all are removed. * * @param safeMode * - Weather the session should wait until all facts are removed * from the running session(Determined by provided object * filters) */ public synchronized boolean shutDown(boolean safeMode) { if (logger.isDebugEnabled()) { logger.debug("Ending session..."); } if (!safeMode) { running = false; } else { while (!safeToShutDown()) { } running = false; } return true; } /** * *Description: * Log all activity of the running drools session. This * information is written to an XML formated file in the given file location * and by the file name.***WARNING** Session logging will slow performance * of the rule session.* * * @param fileLocation * - The location to output the file to. The location must exists * on disk. * @param fileName * - The name of the file to write to. If the file does not * exists the file will be created. */ public synchronized void turnSessionAuditLogOn(String fileLocation, String fileName) { sessionLogger = new WorkingMemoryFileLogger(this.session); if (fileLocation == null || fileLocation.isEmpty()) { sessionLogger.setFileName(fileName + this.runningThreadName); } else { sessionLogger.setFileName(fileLocation + "/" + fileName + this.runningThreadName); } } /** * *Description: * Using the given object filters determine if there * are still objects in the session that we care about before shutting down; * * @return boolean - is the session safe to shut down */ private synchronized boolean safeToShutDown() { boolean safeToShutDown = true; if (this.filters != null) { for (ObjectFilter of : this.filters) { if (this.session.getFactHandles(of).size() > 0) { safeToShutDown = false; break; } } } return safeToShutDown; } } laune wrote > > Periodically calling fireAllRules() in a thread running parallel to the > one(s) > doing insertions doesn't make sense to me. > > -W > > On 08/05/2012, gboro54 <gboro54@> wrote: >> I am not currently using agenda-groups. I believe my issue right now is >> one >> of thread safety. A little background: I currently have a thread pulling >> messages from a database running on the main thread. In several other >> threads, I have drools session being fired every so often. It appears >> that >> there may be a some type of deadlock caused by invoking fireAllRules on >> one >> thread, while another is trying to insert. I am working through right now >> to >> debug the issue. Has anyone else experienced this issue? >> >> >> Vincent Legendre wrote >>> >>>> I am having an issue where I have a catch all >>>> retraction rule setup as the lowest salience. >>> >>> Not sure to understand that (note that I am not english native ...) >>> >>>> I see activations created for the facts but they are never fired. Any >>>> thoughts on why this may happen? >>> >>> Send some rules. Activations never fired is just too vague to have a >>> single answer. >>> If you use agenda groups, may be that the group is simply not on focus >>> ... >>> >>> Add a first rule that set the focus, or set auto-focus for all your "low >>> salience" rules, or don't set agenda group for them (their group will be >>> the MAIN group). >>> >>>> The session is run on a separate thread with fireAllRules called every >>>> 1/2 >>>> second. I have tried syncronizing inserts on the session so that thread >>>> would not be in the middle of firing when new facts come in but that >>>> does >>>> not seem to do anything.... >>> >>> Why not using fireUntilHalt instead ? >>> Run your session.fireUntilHalt in a separate thread, and insert things >>> in >>> that session. >>> insert (or update or retract) will wake up the session. >>> >>> Of course, one day, you have to call halt() on your session to get out. >>> _______________________________________________ >>> rules-users mailing list >>> rules-users@.jboss >>> https://lists.jboss.org/mailman/listinfo/rules-users >>> >> >> >> -- >> View this message in context: >> http://drools.46999.n3.nabble.com/agenda-groups-tp3968541p3971147.html >> Sent from the Drools: User forum mailing list archive at Nabble.com. >> _______________________________________________ >> rules-users mailing list >> rules-users@.jboss >> https://lists.jboss.org/mailman/listinfo/rules-users >> > _______________________________________________ > rules-users mailing list > rules-users@.jboss > https://lists.jboss.org/mailman/listinfo/rules-users > -- View this message in context: http://drools.46999.n3.nabble.com/agenda-groups-tp3968541p3971267.html Sent from the Drools: User forum mailing list archive at Nabble.com. _______________________________________________ rules-users mailing list rules-users@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users