[rules-users] KnowledgeAgent and Guvnor restart

Gerret Hansper gerret.public at gmx.de
Tue Jan 26 02:57:52 EST 2010


Hello,

I have got an issue with the KnowledgeAgent that seems not to survive a Guvnor 
restart. The scenario is as follows:

* We use Drools 5.0 
* On our application server we create a KnowledgeAgent 
applying a ChangeSet that points to a package binary on a separate Guvnor server 
like so:

	SystemEventListenerFactory.setSystemEventListener(new 
	SystemEventLogger()); 
	ResourceFactory.getResourceChangeNotifierService().start(); 
	ResourceFactory.getResourceChangeScannerService().start(); 
	KnowledgeAgent agent = 
	KnowledgeAgentFactory.newKnowledgeAgent(workflowName); 
	agent.applyChangeSet(changeSet);

* Creating the kbase, registering globals and running sessions works fine. 
* We shut down Guvnor (or the connection goes down, this was how we spotted the 
problem) and restart it after a minute 
* We then try to run sessions from the 
same agent as above via 
	kagent.getKnowledgeBase().newStatefulKnowledgeSession(); 
which returns a ksession, but then setting a global we get

  java.lang.RuntimeException: Unexpected global [log] 	
  at 
  org.drools.common.AbstractWorkingMemory.setGlobal(AbstractWorkingMemory.java:5
  50) 
  at 
  org.drools.impl.StatefulKnowledgeSessionImpl.setGlobal(StatefulKnowledgeSessio
  nImpl.java:284)

>From the debugger I can see that indeed the ruleBase's globals map is empty. The 
SystemEventLogger indicates that the KnowledgeAgent unsubscribes from its 
resource when Guvnor is down and rebuilds its kbase. Also, it stops scanning the 
resource and does not find it once Guvnor is up again. (See log snippet below).
 
Wouldn't it be better in these cases to keep the resource as is in memory and 
try to rescan? I figure that as long as the resource is specified in the 
changeSet it should be considered part of the kbase and not be removed if it 
cannot be found. 

For the time being, does anyone have a suggestion how to avoid these problems? 
We could catch the RuntimeException and recreate the KnowledgeAgent, but perhaps 
there is a better way?

Thanks, Gerret


-- SystemEventLog -- 
# Guvnor is up here 
07:58:01,881 ResourceChangeScanner attempt to scan 1 resources 
07:58:02,209 ResourceChangeScanner thread is waiting for 60 
07:58:15,067 ResourceChangeScanner attempt to scan 1 resources 
# Guvnor goes down here 
07:58:16,738 ResourceChangeScanner removed resource=[UrlResource 
path='http://localhost:7080/drools-
guvnor/org.drools.guvnor.Guvnor/package/com.foo.bar/LATEST'] 
07:58:16,738 ResourceChangeNotification received ChangeSet notification 
07:58:16,738 ResourceChangeScanner thread is waiting for 60 
07:58:16,738  ResourceChangeNotification processing ChangeSet 
07:58:16,738 ResourceChangeNotification ChangeSet removed resource=[UrlResource 
path='http://localhost:7080/drools-
guvnor/org.drools.guvnor.Guvnor/package/com.foo.bar/LATEST'] for 
listener=org.drools.agent.impl.KnowledgeAgentImpl at 1053d6d 
07:58:16,738 ResourceChangeNotification ChangeSet removed resource=[UrlResource 
path='http://localhost:7080/drools-
guvnor/org.drools.guvnor.Guvnor/package/com.foo.bar/LATEST'] for 
listener=org.drools.agent.impl.KnowledgeAgentImpl at b71c17 
07:58:16,738 KnowledgeAgent received ChangeSet changed notification 
07:58:16,738 KnowledgeAgent received ChangeSet changed notification 
07:58:16,738 KnowledgAgent applying ChangeSet 
07:58:16,738 ResourceChangeNotification thread is waiting for queue update 
07:58:16,738 KnowledgAgent applying ChangeSet 
07:58:16,738 KnowledgeAgent unsubscribing from resource=[UrlResource 
path='http://localhost:7080/drools-
guvnor/org.drools.guvnor.Guvnor/package/com.foo.bar/LATEST'] 
07:58:16,738 ResourceChangeNotification unsubscribing 
listener=org.drools.agent.impl.KnowledgeAgentImpl at 1053d6d to 
resource=[UrlResource path='http://localhost:7080/drools-
guvnor/org.drools.guvnor.Guvnor/package/com.foo.bar/LATEST'] 
07:58:16,738 KnowledgeAgent rebuilding KnowledgeBase using ChangeSet 
07:58:16,738 KnowledgeAgent unsubscribing from resource=[UrlResource 
path='http://localhost:7080/drools-
guvnor/org.drools.guvnor.Guvnor/package/com.foo.bar/LATEST'] 
07:58:16,738 ResourceChangeNotification unsubscribing 
listener=org.drools.agent.impl.KnowledgeAgentImpl at b71c17 to 
resource=[UrlResource path='http://localhost:7080/drools-
guvnor/org.drools.guvnor.Guvnor/package/com.foo.bar/LATEST'] 
07:58:16,738 
KnowledgeAgent rebuilding KnowledgeBase using ChangeSet 
07:58:16,738 KnowledgeAgent new KnowledgeBase now built and in use 
07:58:16,738 KnowledgeAgent new KnowledgeBase now built and in use 
07:59:02,202 ResourceChangeScanner attempt to scan 0 resources 
07:59:02,202 ResourceChangeScanner thread is waiting for 60 
# Guvnor back up here 
07:59:16,731 ResourceChangeScanner attempt to scan 0 resources 
07:59:16,731 ResourceChangeScanner thread is waiting for 60





More information about the rules-users mailing list