[jboss-user] [jBPM] - Work Item not persisted

Swaminathan Bhaskar do-not-reply at jboss.com
Thu Sep 20 13:39:48 EDT 2012


Swaminathan Bhaskar [https://community.jboss.org/people/swaminathan.bhaskar] created the discussion

"Work Item not persisted"

To view the discussion, visit: https://community.jboss.org/message/760675#760675

--------------------------------------------------------------
Hello all;

I am using JPA persistence with jBPM 5.3 with MySQL database. I created a new domain specific task and a corresponding work item handler and expect the work item to be persisted along with the session info as well as process instance info when I kill the process at the point shown in red below ... but do not see that happening. Any ideas or thoughts

Here is the code for the work item handler

public class CustomWorkItemHandler implements WorkItemHandler {
    @Override
    public void executeWorkItem(WorkItem item, WorkItemManager manager) {
        System.out.printf("\n-----> Waiting in custom work item %s <ID:%d> for 60 secs\n", item.getName(), item.getId());

        // Expect an entry in the DB for this work item when I kill the process


        // Artificial wait
        try {
            Thread.sleep(60000);
        }
        catch (Exception ex) {
        }

        System.out.printf("\n-----> Completing custom work item %s <ID:%d>\n", item.getName(), item.getId());

        manager.completeWorkItem(item.getId(), null);
    }

    @Override
    public void abortWorkItem(WorkItem item, WorkItemManager manager) {
    }
}

Here is the main process code:

public class sample07 {
    public static final String BPMN_RESOURCE  = "sample07.bpmn";
    public static final String BPM_PROCESS    = "sample07";
    public static final String WORK_ITEM_NAME = "custom_work_item";

    public static final void main(String[] args) {
        if (args.length != 2) {
            System.out.printf("Usage: java %s <session-id> <process-id>\n", sample07.class.getName());
            System.exit(1);
        }

        try {
            int sessionId = Integer.parseInt(args[0]);
            long processId = Long.parseLong(args[1]);

            // Setup Datasource
            PoolingDataSource mysqlDS = new PoolingDataSource();
            mysqlDS.setUniqueName("jdbc/MySQL-DS");
            mysqlDS.setClassName("com.mysql.jdbc.jdbc2.optional.MysqlXADataSource");
            mysqlDS.setMaxPoolSize(3);
            mysqlDS.setAllowLocalTransactions(true);
            mysqlDS.getDriverProperties().put("user", "mydbuser");
            mysqlDS.getDriverProperties().put("password", "mydbpass");
            mysqlDS.getDriverProperties().put("url", "jdbc:mysql://localhost:3306/mytestdb");
            mysqlDS.init();

            // Setup JPA persistence
            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());

            // Load and setup the BPM process
            KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
            kbuilder.add(ResourceFactory.newClassPathResource(BPMN_RESOURCE), ResourceType.BPMN2);

            // Do we have any errors ?
            if (kbuilder.hasErrors()) {
                if (kbuilder.getErrors().size() > 0) {
                    for (KnowledgeBuilderError error : kbuilder.getErrors()) {
                        System.out.printf("Error building KnowledgeBase: %s\n", error.getMessage());
                    }
                }
                throw new RuntimeException("Error building KnowledgeBase");
            }

            KnowledgeBase kbase = kbuilder.newKnowledgeBase();

            StatefulKnowledgeSession ksession = null;
            if (sessionId > 0) {
                ksession = JPAKnowledgeService.loadStatefulKnowledgeSession(sessionId, kbase, null, env);

                JPAWorkingMemoryDbLogger logger = new JPAWorkingMemoryDbLogger(ksession);

                // Register the custom work item handler
                ksession.getWorkItemManager().registerWorkItemHandler(WORK_ITEM_NAME, new CustomWorkItemHandler());

                ProcessInstance processInstance = ksession.getProcessInstance(processId);

                // Did the process instance complete successfully ?
                if (processInstance.getState() == ProcessInstance.STATE_COMPLETED) {
                    System.out.printf("\n-----> Restarted business process [%s] successfully completed\n", processInstance.getProcessId());
                }

                logger.dispose();
            }
            else {
                ksession = JPAKnowledgeService.newStatefulKnowledgeSession(kbase, null, env);

                JPAWorkingMemoryDbLogger logger = new JPAWorkingMemoryDbLogger(ksession);

                // Register the custom work item handler
                ksession.getWorkItemManager().registerWorkItemHandler(WORK_ITEM_NAME, new CustomWorkItemHandler());

                System.out.printf("\n-----> Session ID: %d\n", ksession.getId());

                // Create the process instance
                ProcessInstance processInstance = ksession.createProcessInstance(BPM_PROCESS, null);

                System.out.printf("\n-----> Starting new Business process %s <ID:%d>\n", processInstance.getProcessId(), processInstance.getId());

                // Start the BPM process
                ksession.startProcessInstance(processInstance.getId());

                // Did the process instance complete successfully ?
                if (processInstance.getState() == ProcessInstance.STATE_COMPLETED) {
                    System.out.printf("\n-----> Business process %s <ID:%d> successfully completed\n", processInstance.getProcessId(), processInstance.getId());
                }

                logger.dispose();
            }
        }
        catch (Exception ex) {
            ex.printStackTrace(System.err);
            System.exit(1);
        }

        System.exit(0);
    }
}

And here is the persistence.xml:

<persistence version="1.0"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
                                 http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd
                                 http://java.sun.com/xml/ns/persistence/orm 
                                 http://java.sun.com/xml/ns/persistence/orm_1_0.xsd"
             xmlns:orm="http://java.sun.com/xml/ns/persistence/orm"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns="http://java.sun.com/xml/ns/persistence">

    <persistence-unit name="org.jbpm.persistence.jpa" transaction-type="JTA">
        <provider>org.hibernate.ejb.HibernatePersistence</provider>

        <jta-data-source>jdbc/MySQL-DS</jta-data-source>

        <mapping-file>META-INF/JBPMorm.xml</mapping-file>
        <mapping-file>META-INF/ProcessInstanceInfo.hbm.xml</mapping-file>

        <!-- Process Related -->

        <class>org.drools.persistence.info.SessionInfo</class>
        <class>org.drools.persistence.info.WorkItemInfo</class>

        <class>org.jbpm.persistence.processinstance.ProcessInstanceInfo</class>

        <class>org.jbpm.process.audit.ProcessInstanceLog</class>
        <class>org.jbpm.process.audit.NodeInstanceLog</class>
        <class>org.jbpm.process.audit.VariableInstanceLog</class>

        <properties>
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" />
            <property name="hibernate.connection.autocommit" value="false" />
            <property name="hibernate.max_fetch_depth" value="3"/>
            <property name="hibernate.hbm2ddl.auto" value="update" />
            <property name="hibernate.show_sql" value="true" />    
            <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.BTMTransactionManagerLookup" />
        </properties>        
      </persistence-unit>

</persistence>

Any help appreciated.
--------------------------------------------------------------

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

Start a new discussion in jBPM at Community
[https://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/20120920/0f89a6e6/attachment-0001.html 


More information about the jboss-user mailing list