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

Ševčík Martin MaSevcik at cpoj.cz
Thu Jul 16 05:33:07 EDT 2009


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




More information about the rules-users mailing list