[jboss-user] [jBPM] - Problem with persistence, rules & fireUntilHalt

Demian Calcaprina do-not-reply at jboss.com
Thu Jun 23 14:52:52 EDT 2011


Demian Calcaprina [http://community.jboss.org/people/calca] created the discussion

"Problem with persistence, rules & fireUntilHalt"

To view the discussion, visit: http://community.jboss.org/message/611719#611719

--------------------------------------------------------------
Hi All,

I have simple flow like this:
Start->Ruleflow->...
And I am running it with persistence. I am running the process in this way:
ProcessInstance process = session.createProcessInstance(
                                        "pid", parameters);
                    session.insert(process);
                    long processInstanceId = process.getId();
                    new Thread(new Runnable() { 
                              public void run() {
                                        session.fireUntilHalt();
                              }
                    }).start();
                    session.startProcessInstance(processInstanceId);
And it breaks after executing the activation (I can see that the right side of the rule is run, as I put a variable in the process and it is there after the execution):
Exception in thread "Thread-6" org.drools.RuntimeDroolsException: Unexpected exception executing action org.drools.common.RuleFlowGroupImpl$DeactivateCallback at 645ccb
          at org.drools.common.AbstractWorkingMemory.executeQueuedActions(AbstractWorkingMemory.java:996)
          at org.drools.common.DefaultAgenda.fireUntilHalt(DefaultAgenda.java:1036)
          at org.drools.common.AbstractWorkingMemory.fireUntilHalt(AbstractWorkingMemory.java:777)
          at org.drools.common.AbstractWorkingMemory.fireUntilHalt(AbstractWorkingMemory.java:753)
          at org.drools.command.runtime.rule.FireUntilHaltCommand$1.run(FireUntilHaltCommand.java:50)
          at java.lang.Thread.run(Thread.java:662)
Caused by: java.lang.NullPointerException
          at bitronix.tm.resource.jdbc.JdbcConnectionHandle.prepareStatement(JdbcConnectionHandle.java:259)
          at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
          at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
          at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
          at java.lang.reflect.Method.invoke(Method.java:597)
          at bitronix.tm.resource.jdbc.BaseProxyHandlerClass.invoke(BaseProxyHandlerClass.java:63)
          at $Proxy20.prepareStatement(Unknown Source)
          at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:505)
          at org.hibernate.jdbc.AbstractBatcher.getPreparedStatement(AbstractBatcher.java:423)
          at org.hibernate.jdbc.AbstractBatcher.prepareQueryStatement(AbstractBatcher.java:139)
          at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1547)
          at org.hibernate.loader.Loader.doQuery(Loader.java:673)
          at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
          at org.hibernate.loader.Loader.doList(Loader.java:2213)
          at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104)
          at org.hibernate.loader.Loader.list(Loader.java:2099)
          at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378)
          at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338)
          at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172)
          at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121)
          at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
          at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:65)
          at org.jbpm.persistence.JpaProcessPersistenceContext.getProcessInstancesWaitingForEvent(JpaProcessPersistenceContext.java:39)
          at org.jbpm.persistence.processinstance.JPASignalManager.getProcessInstancesForEvent(JPASignalManager.java:40)
          at org.jbpm.persistence.processinstance.JPASignalManager.signalEvent(JPASignalManager.java:23)
          at org.jbpm.process.instance.ProcessRuntimeImpl$3.afterRuleFlowGroupDeactivated(ProcessRuntimeImpl.java:335)
          at org.drools.event.AgendaEventSupport.fireAfterRuleFlowGroupDeactivated(AgendaEventSupport.java:168)
          at org.drools.common.RuleFlowGroupImpl.setActive(RuleFlowGroupImpl.java:148)
          at org.drools.common.RuleFlowGroupImpl$DeactivateCallback.execute(RuleFlowGroupImpl.java:301)
          at org.drools.common.AbstractWorkingMemory.executeQueuedActions(AbstractWorkingMemory.java:994)
          ... 5 more


If I run it with fireAllRules() after starting the process, it works fine, so I think it may be related with the new thead that the reactive mode uses. Do I may have some problems with my session persistence configuration? Here is the code of my test:
public class ProcessExecutionTest {


          static {
                    ProcessBuilderFactory
                                        .setProcessBuilderFactoryService(new ProcessBuilderFactoryServiceImpl());
                    ProcessRuntimeFactory
                                        .setProcessRuntimeFactoryService(new ProcessRuntimeFactoryServiceImpl());
          }
          private PoolingDataSource ds1;
          private EntityManagerFactory emf;


          @Before
          public void setUp() throws Exception {
                    ds1 = new PoolingDataSource();
                    ds1.setUniqueName("jdbc/testDS1");
                    ds1.setClassName("org.h2.jdbcx.JdbcDataSource");
                    ds1.setMaxPoolSize(3);
                    ds1.setAllowLocalTransactions(true);
                    ds1.getDriverProperties().put("user", "sa");
                    ds1.getDriverProperties().put("password", "sasa");
                    ds1.getDriverProperties().put("URL", "jdbc:h2:mem:mydb");
                    ds1.init();
                     ds1.init();
                    emf = Persistence
                                        .createEntityManagerFactory("org.jbpm.persistence.jpa");


          }


          private KnowledgeBase createKnowledgeBase() {
                    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory
                                        .newKnowledgeBuilder();
                    kbuilder.add(
                                        new ClassPathResource("myflow.bpmn"),
                                        ResourceType.BPMN2);
                    kbuilder.add(
                                        new ClassPathResource("myrule.drl"),
                                        ResourceType.DRL);
                    KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
                    kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
                    if (kbuilder.hasErrors()) {
                              StringBuilder errorMessage = new StringBuilder();
                              for (KnowledgeBuilderError error : kbuilder.getErrors()) {
                                        errorMessage.append(error.getMessage());
                                        errorMessage.append(System.getProperty("line.separator"));
                              }
                              Assert.fail(errorMessage.toString());
                    }
                    return kbase;
          }


          @Test
          public void testAccrualProcessExceeded() throws Exception {
                    KnowledgeBase kbase = createKnowledgeBase();
                    EntityManagerFactory emf = Persistence
                                        .createEntityManagerFactory("org.jbpm.persistence.jpa");
                    Environment env = KnowledgeBaseFactory.newEnvironment();
                    env.set(EnvironmentName.ENTITY_MANAGER_FACTORY, emf);
                    env.set(EnvironmentName.TRANSACTION_MANAGER,
                                        TransactionManagerServices.getTransactionManager());
                    final StatefulKnowledgeSession session = JPAKnowledgeService
                                        .newStatefulKnowledgeSession(kbase, null, env);
                    new JPAWorkingMemoryDbLogger(session);
                    KnowledgeRuntimeLoggerFactory.newConsoleLogger(session);
                    JPAProcessInstanceDbLog log = new JPAProcessInstanceDbLog(env);
                    session.getWorkItemManager().registerWorkItemHandler("Human Task",
                                        new WorkItemHandler() {


                                                  public void executeWorkItem(WorkItem workItem,
                                                                      WorkItemManager manager) {
                                                            Map variables = log.findVariableInstances(processInstanceId);
                    for (Iterator iterator = variables.iterator(); iterator.hasNext();) {
                              VariableInstanceLog variableInstanceLog = (VariableInstanceLog) iterator
                                                  .next();
                              System.out.println(variableInstanceLog);
                    }
          }
}
--------------------------------------------------------------

Reply to this message by going to Community
[http://community.jboss.org/message/611719#611719]

Start a new discussion in jBPM at Community
[http://community.jboss.org/choose-container!input.jspa?contentType=1&containerType=14&container=2034]

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/jboss-user/attachments/20110623/6bfd7b44/attachment-0001.html 


More information about the jboss-user mailing list