[rules-users] Problems with persistence of drools-flow

Michal Bali michalbali at gmail.com
Wed Aug 5 19:20:09 EDT 2009


Hi Martin,

I think that em.persist only updates the entity context (hibernate session).
The DB is updated only after you commit transaction. So it looks like the
transactions are not being committed in your case. That would be my guess.

Best regards
Michal


On Tue, Aug 4, 2009 at 9:14 AM, Ševčík Martin <MaSevcik at cpoj.cz> wrote:

> I have a simple flow with human task and I want to persist it into
> database. I'm using MSSQL DB.
>
> My code is like this:
>
>                KnowledgeBase kbase = readKnowledgeBase();
>                        // create the entity manager factory and register it
> in the environment
>                        EntityManagerFactory emf =
>                            Persistence.createEntityManagerFactory(
> "org.drools.persistence.jpa" );
>                        Environment env =
> KnowledgeBaseFactory.newEnvironment();
>                        env.set( EnvironmentName.ENTITY_MANAGER_FACTORY, emf
> );
>                        BitronixTransactionManager btm =
> TransactionManagerServices.getTransactionManager();
>                        env.set( EnvironmentName.TRANSACTION_MANAGER, btm);
>
>                        StatefulKnowledgeSession ksession =
>                            JPAKnowledgeService.newStatefulKnowledgeSession(
> kbase, null, env );
>
>                        KnowledgeRuntimeLogger logger =
> KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
>
>  ksession.getWorkItemManager().registerWorkItemHandler("Human Task", new
> WSHumanTaskHandler());
>                        // start a new process instance
>                        Map<String,Object> data = new
> HashMap<String,Object>();
>                        data.put("data3", new MyTask(1,"This is taks 1"));
>                        ProcessInstance pi =
> ksession.startProcess("com.sample.ruleflow",data);
>                        logger.close();
>
> But when i run it, it end up with this error and there is nothing in the
> database (the tables were created, but there are all empty):
>
> java.lang.NullPointerException
>        at
> org.drools.persistence.processinstance.ProcessInstanceInfo.getId(ProcessInstanceInfo.java:70)
>        at
> org.drools.persistence.processinstance.JPAProcessInstanceManager.addProcessInstance(JPAProcessInstanceManager.java:34)
>        at
> org.drools.common.AbstractWorkingMemory.startProcess(AbstractWorkingMemory.java:1620)
>        at
> org.drools.process.command.StartProcessCommand.execute(StartProcessCommand.java:46)
>        at
> org.drools.process.command.StartProcessCommand.execute(StartProcessCommand.java:10)
>        at
> org.drools.persistence.session.SingleSessionCommandService.execute(SingleSessionCommandService.java:229)
>        at
> org.drools.process.command.impl.CommandBasedStatefulKnowledgeSession.startProcess(CommandBasedStatefulKnowledgeSession.java:163)
>        at
> com.sample.RuleFlowPersistenceTest.main(RuleFlowPersistenceTest.java:74)
> java.lang.RuntimeException: Could not rollback transaction
>        at
> org.drools.persistence.session.SingleSessionCommandService.execute(SingleSessionCommandService.java:258)
>        at
> org.drools.process.command.impl.CommandBasedStatefulKnowledgeSession.startProcess(CommandBasedStatefulKnowledgeSession.java:163)
>        at
> com.sample.RuleFlowPersistenceTest.main(RuleFlowPersistenceTest.java:74)
> Caused by: java.lang.RuntimeException: Could not execute command
>        at
> org.drools.persistence.session.SingleSessionCommandService.execute(SingleSessionCommandService.java:255)
>        ... 2 more
> Caused by: java.lang.NullPointerException
>        at
> org.drools.persistence.processinstance.ProcessInstanceInfo.getId(ProcessInstanceInfo.java:70)
>        at
> org.drools.persistence.processinstance.JPAProcessInstanceManager.addProcessInstance(JPAProcessInstanceManager.java:34)
>        at
> org.drools.common.AbstractWorkingMemory.startProcess(AbstractWorkingMemory.java:1620)
>        at
> org.drools.process.command.StartProcessCommand.execute(StartProcessCommand.java:46)
>        at
> org.drools.process.command.StartProcessCommand.execute(StartProcessCommand.java:10)
>        at
> org.drools.persistence.session.SingleSessionCommandService.execute(SingleSessionCommandService.java:229)
>        ... 2 more
>
> In JPAProcessInstanceManager.java there this method is called:
>
>    public void addProcessInstance(ProcessInstance processInstance) {
>        ProcessInstanceInfo processInstanceInfo = new ProcessInstanceInfo(
> processInstance );
>        EntityManager em = (EntityManager)
> this.workingMemory.getEnvironment().get( EnvironmentName.ENTITY_MANAGER );
>        em.persist( processInstanceInfo );
>        ((ProcessInstance) processInstance).setId(
> processInstanceInfo.getId() );
>        processInstanceInfo.updateLastReadDate();
>        internalAddProcessInstance(processInstance);
>    }
>
>
> But em.persist does nothing, no connection do DB is called. And then the
>  next line will fail.
>
>
>
>
> Can anybody help me.
>
> Thanks
>
> Martin Sevcik
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20090806/cb6c2dc0/attachment.html 


More information about the rules-users mailing list