Hi list,

I have a simple program using drools-persistence-jpa library.

StatefulKnowledgeSession session = null;
try {
    ksession = JPAKnowledgeService.newStatefulKnowledgeSession(this.kbase, null, env);
    ksession.execute(myCustomCommand);
} finally {
    if (ksession != null) {
        ksession.dispose();
    }
}

if ksession.execute statement throws an exception, then ksession.dispose statement will throw another fancy exception like this:

java.lang.RuntimeException: Could not find session data for id 473
    at org.drools.persistence.session.SingleSessionCommandService.initKsession(SingleSessionCommandService.java:183)
    at org.drools.persistence.session.SingleSessionCommandService.execute(SingleSessionCommandService.java:272)

My environment is like following:

1. I use JTA to manage tx across several sessions.
2. I set a global EntityManagerFactory, TransactionFactory and a UserTransaction to the env variable when initialize the ksession.

I think this exception occurred because of this:

When I execute my custom command, a user tx is opened, but when exception occurs, this tx is rolled back. But in ksession.dispose statement, it will use the uncommited session id to retrieve the persisted ksession, then exception is thrown.

My questing is that, do I really need to put ksession.dispose in the finally block to force the ksession to dispose even when exception occurred. If not won't that matter? If yes how to deal with the exception, add another try/catch block around the ksession.dispose statement?

Thank you in advance.

--
唐睿