I have solved the problem. The problem arises because of drool-core.jar
files duplication – I’ve got one in jboss lib and another one in webapp
lib.
I’m trying to create StatefulKnowledgeSession:
StatefulKnowledgeSession ksession =
JPAKnowledgeService.newStatefulKnowledgeSession(
kbase, null, env);
Here is the problem as it seen in the log:
15:39:05,884 ERROR [STDERR] Caused by: java.lang.IllegalArgumentException:
Unable to instantiate process instance manager factory
'org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory'
15:39:05,884 ERROR [STDERR] at
org.drools.SessionConfiguration.initProcessInstanceManagerFactory(SessionConfiguration.java:317)
15:39:05,884 ERROR [STDERR] at
org.drools.SessionConfiguration.getProcessInstanceManagerFactory(SessionConfiguration.java:291)
15:39:05,884 ERROR [STDERR] at
org.drools.common.AbstractWorkingMemory.<init>(AbstractWorkingMemory.java:367)
15:39:05,884 ERROR [STDERR] at
org.drools.common.AbstractWorkingMemory.<init>(AbstractWorkingMemory.java:295)
15:39:05,884 ERROR [STDERR] at
org.drools.common.AbstractWorkingMemory.<init>(AbstractWorkingMemory.java:259)
15:39:05,884 ERROR [STDERR] at
org.drools.reteoo.ReteooWorkingMemory.<init>(ReteooWorkingMemory.java:96)
15:39:05,885 ERROR [STDERR] at
org.drools.reteoo.ReteooStatefulSession.<init>(ReteooStatefulSession.java:80)
15:39:05,885 ERROR [STDERR] at
org.drools.reteoo.ReteooRuleBase.newStatefulSession(ReteooRuleBase.java:386)
15:39:05,885 ERROR [STDERR] at
org.drools.reteoo.ReteooRuleBase.newStatefulSession(ReteooRuleBase.java:371)
15:39:05,885 ERROR [STDERR] at
org.drools.persistence.session.SingleSessionCommandService.<init>(SingleSessionCommandService.java:97)
Exception is thrown from here:
private void initProcessInstanceManagerFactory() {
...
if ( clazz != null ) {
try {
this.processInstanceManagerFactory = clazz.newInstance();
} catch ( Exception e ) {
throw new IllegalArgumentException( "Unable to instantiate
process instance manager factory '" + className + "'" );
}
...
}
And the actual Exception type is ClassCastException
java.lang.ClassCastException:
org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory
cannot be cast to org.drools.process.instance.ProcessInstanceManagerFactory
I’ve created the following snippet to illustrate the problem:
…running inside JTA transaction
Class<ProcessInstanceManagerFactory> cls =
(Class<ProcessInstanceManagerFactory>)
Class.forName("org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory");
// this one is OK
ProcessInstanceManagerFactory pimf =
(ProcessInstanceManagerFactory)cls.newInstance();
System.out.println(pimf.getClass().getCanonicalName());
cls =
(Class<ProcessInstanceManagerFactory>)Thread.currentThread().getContextClassLoader().loadClass("org.drools.persistence.processinstance.JPAProcessInstanceManagerFactory"
);
// here will be ClassCastException
pimf = (ProcessInstanceManagerFactory)cls.newInstance();
System.out.println(pimf.getClass().getCanonicalName());
It seems that ProcessInstanceManagerFactory interface and
JPAProcessInstanceManagerFactory are loaded by different class loaders.
How can I avoid that problem?
I'm using Drool Flow 5.1.1, JBoss 6.0, Hibernate 3.6.0.