9 Replies Latest reply on Nov 18, 2010 1:52 PM by andrescarlospa

    JBPM4.1, JBoss 4.23 and Seam 2.2.0

    jjp

      === Environment ==============================
      - jBPM Version : 4.1
      - Database : Oracle 10.2
      - JDK : 1.6
      - Container : JBoss 4.2.3
      - Configuration : custom jbpm.cfg.xml only, see below
      - Libraries : the exact versions of the libs from inside the jbpm
      distribution

      === Process ==================================
      Just a Test Jpdl: Start -> Task -> End

      === Stacktrace ==============================
      No stack trace, only a warning:

      15:32:14,624 WARN [AbstractEntityManagerImpl] Cannot join transaction: do not override hibernate.transaction.factory_class

      === Problem description =========================
      I try to integrate JBPM4.1 with my application based on Seam 2.2.0 and Richfaces 3.3.1.
      We are using a persistence.xml instead of jbpm.hibernate.cfg.xml so I modified the persistence.xml:

      <?xml version="1.0" encoding="UTF-8" standalone="no"?>
      <!-- Persistence deployment descriptor for dev profile -->
      <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="1.0" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
      
       <persistence-unit name="pmscada">
       <provider>org.hibernate.ejb.HibernatePersistence</provider>
       <jta-data-source>java:/pmscadaDatasource</jta-data-source>
      
       <!-- JBPM4 mappings -->
       <mapping-file>jbpm.repository.hbm.xml</mapping-file>
       <mapping-file>jbpm.execution.hbm.xml</mapping-file>
       <mapping-file>jbpm.history.hbm.xml</mapping-file>
       <mapping-file>jbpm.task.hbm.xml</mapping-file>
       <mapping-file>jbpm.identity.hbm.xml</mapping-file>
      
       <properties>
       <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect"/>
       <property name="hibernate.default_schema" value="schema"/>
       <property name="hibernate.hbm2ddl.auto" value="create"/>
       <property name="jboss.entity.manager.factory.jndi.name" value="java:/pmscadaEntityManagerFactory"/>
       <property name="hibernate.show_sql" value="false"/>
      
       <property name="hibernate.format_sql" value="true"/>
       <property name="use_sql_comments" value="true"/>
      
       <property name="hibernate.transaction.factory_class" value="org.hibernate.transaction.JTATransactionFactory"/>
       <properties>
       </persistence-unit>
      </persistence>
      


      In the jbpm.cfg.xml I removed <!--hibernate-session-factory /--> and added <pilot-integration/>, the remain is like tho original jbpm.cfg.xml.

      pilot-integration is declared in jbpm.user.wire.bindings.xml:

      <wire-bindings>
      
       <binding class="...PilotBinding" />
      
      </wire-bindings>
      


      This class provides a PilotDescriptor

      ...
      public class PilotBinding extends WireDescriptorBinding
      {
       public PilotBinding()
       {
       super( "pilot-integration" );
       }
      
       /** {@inheritDoc} */
       @Override
       public Object parse( Element element, Parse parse, Parser parser )
       {
       return new PilotDescriptor();
       }
      
      }
      


      And the PilotDescriptor returns the Hibernate SessionFactory:

      ...
      public class PilotDescriptor extends AbstractDescriptor
      {
       private static final long serialVersionUID = 3380911977887594063L;
      
       /** The session factory. */
       private static SessionFactory sessionFactory;
      
       public static void setSessionFactory( SessionFactory sessionFactory )
       {
       PilotDescriptor.sessionFactory = sessionFactory;
       }
      
       /** {@inheritDoc} */
       @Override
       public Object construct( WireContext wireContext )
       {
       return sessionFactory;
       }
      
       /** {@inheritDoc} */
       @Override
       public Class<?> getType( WireDefinition wireDefinition )
       {
       return SessionFactory.class;
       }
      }
      


      The Session factory is set on startup using the static function.
      This configuration is running fine, it is possible to put "our" Hibernate entities as varibles in ProcessInstances.

      My first question is now:
      Is this the right way to integrate JBPM in my application ?

      The second:
      What does the Warning Cannot join transaction: do not override hibernate.transaction.factory_class mean ? The application is running anyway.

      Thanks,
      Joerg


        • 1. Re: JBPM4.1, JBoss 4.23 and Seam 2.2.0
          kukeltje

          1: Depends on what you mean by 'integrate'. What are you trying to achieve.

          2: Sounds like a warning from hibernate/jpa. You might have more luck asking (also) there.

          • 2. Re: JBPM4.1, JBoss 4.23 and Seam 2.2.0
            jjp

            I want to use JBPM in my Application and a I can not change the environment of my application (Seam/Richfaces/persistence.xml), so I try to configure JBPM in that way, that it works together.

            I want to store my entities in JBPM Workflows. The first try was not successful, because the ProcessEngine serialized the entities as a Blob. I expected that the PE will only store the hibernate ID of my entity.

            So I searched in the documentation and forum, and the source code. By the way, a great work !
            I found that JBPM and my application used two different hibernate sessions. And the described way was the solution.
            My hope is now, that this configuration is not a dead end in future versions, and You don't say "For God's sake!" this this a anti-example.

            May this solution is helpful for some people with similar problems.

            Thanks,
            Joerg

            • 3. Re: JBPM4.1, JBoss 4.23 and Seam 2.2.0
              drivexcite

              Hi Joerg,

              Unfortunately I can't replicate what you've done regarding jBPM 4.1 and Seam 2.2 integration.

              This it's what I did:
              * I created a seam-gen project.
              * I replaced jbpm-jpdl.jar (jBPM 3.x) with jbpm.jar (jBPM 4.1).
              * I configured the jbpm.hibernate.cgf.xml to use the same DataSource (I'm ok with different hibernate sessions).
              * I create a jPDL (xmlns="http://jbpm.org/4.0/jpdl") process description.
              * I set up the jbpm.cfg.xml using the recommended setting from Seam docs.
              * I registered my process definition in components.xml.

              The end result is when I try to deploy the project (Web app: war), the deployment failed because a ClassNotFoundException.

              It seems that Seam is not ready to work with jBPM 4.1, but I really hope I'm missing few steps.

              Can you please describe with a little more detail, what you did to make your test work?

              Thank you.

              === Environment ==============================
              - jBPM Version : jBPM 4.1 (jbpm.jar)
              - Database : PostgreSQL 8.4
              - JDK : Java JDK 1.6.0u14
              - Container : JBoss Application Server 5.1.0 GA.
              - Configuration :

              <jbpm-configuration>
               <jbpm-context>
               <service name="persistence">
               <factory>
               <bean class="org.jbpm.persistence.db.DbPersistenceServiceFactory">
               <field name="isTransactionEnabled">
               <false />
               </field>
               </bean>
               </factory>
               </service>
               <service name="tx" factory="org.jbpm.tx.TxServiceFactory" />
               <service name="message" factory="org.jbpm.msg.db.DbMessageServiceFactory" />
               <service name="scheduler" factory="org.jbpm.scheduler.db.DbSchedulerServiceFactory" />
               <service name="logging" factory="org.jbpm.logging.db.DbLoggingServiceFactory" />
               <service name="authentication" factory="org.jbpm.security.authentication.DefaultAuthenticationServiceFactory" />
               </jbpm-context>
              </jbpm-configuration>

              - Libraries : All the Seam 2.2.0 GA libraries, except I replaced jbpm-jpdl.jar with jbpm.jar (from the jBPM 4.1 zip distribution).

              === Process ==================================
              <process name="TestProcess" xmlns="http://jbpm.org/4.0/jpdl">
               <start g="439,102,48,48" name="Start">
               <transition g="-65,-20" name="start" to="Task"/>
               </start>
               <custom g="418,255,92,52" name="Task">
               <transition g="-59,-20" name="error" to="Error"/>
               <transition g="-45,-20" name="end" to="End"/>
               </custom>
               <end g="599,258,48,48" name="End"/>
               <end-cancel g="440,401,48,48" name="Error"/>
              </process>


              === Stacktrace ==============================
              java.lang.RuntimeException: Could not create Component: org.jboss.seam.bpm.businessProcess
               at org.jboss.seam.init.Initialization.addComponent(Initialization.java:1202)
               at org.jboss.seam.init.Initialization.installComponents(Initialization.java:1118)
               at org.jboss.seam.init.Initialization.init(Initialization.java:733)
               at org.jboss.seam.servlet.SeamListener.contextInitialized(SeamListener.java:36)
               at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3910)
               at org.apache.catalina.core.StandardContext.start(StandardContext.java:4393)
               at org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeployInternal(TomcatDeployment.java:310)
               at org.jboss.web.tomcat.service.deployers.TomcatDeployment.performDeploy(TomcatDeployment.java:142)
               at org.jboss.web.deployers.AbstractWarDeployment.start(AbstractWarDeployment.java:461)
               at org.jboss.web.deployers.WebModule.startModule(WebModule.java:118)
               at org.jboss.web.deployers.WebModule.start(WebModule.java:97)
               at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
               at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
               at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
               at java.lang.reflect.Method.invoke(Unknown Source)
               at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:157)
               at org.jboss.mx.server.Invocation.dispatch(Invocation.java:96)
               at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
               at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
               at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:668)
               at org.jboss.system.microcontainer.ServiceProxy.invoke(ServiceProxy.java:206)
               at $Proxy38.start(Unknown Source)
               at org.jboss.system.microcontainer.StartStopLifecycleAction.installAction(StartStopLifecycleAction.java:42)
               at org.jboss.system.microcontainer.StartStopLifecycleAction.installAction(StartStopLifecycleAction.java:37)
               at org.jboss.dependency.plugins.action.SimpleControllerContextAction.simpleInstallAction(SimpleControllerContextAction.java:62)
               at org.jboss.dependency.plugins.action.AccessControllerContextAction.install(AccessControllerContextAction.java:71)
               at org.jboss.dependency.plugins.AbstractControllerContextActions.install(AbstractControllerContextActions.java:51)
               at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
               at org.jboss.system.microcontainer.ServiceControllerContext.install(ServiceControllerContext.java:286)
               at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1631)
               at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
               at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1082)
               at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
               at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
               at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
               at org.jboss.system.ServiceController.doChange(ServiceController.java:688)
               at org.jboss.system.ServiceController.start(ServiceController.java:460)
               at org.jboss.system.deployers.ServiceDeployer.start(ServiceDeployer.java:163)
               at org.jboss.system.deployers.ServiceDeployer.deploy(ServiceDeployer.java:99)
               at org.jboss.system.deployers.ServiceDeployer.deploy(ServiceDeployer.java:46)
               at org.jboss.deployers.spi.deployer.helpers.AbstractSimpleRealDeployer.internalDeploy(AbstractSimpleRealDeployer.java:62)
               at org.jboss.deployers.spi.deployer.helpers.AbstractRealDeployer.deploy(AbstractRealDeployer.java:50)
               at org.jboss.deployers.plugins.deployers.DeployerWrapper.deploy(DeployerWrapper.java:171)
               at org.jboss.deployers.plugins.deployers.DeployersImpl.doDeploy(DeployersImpl.java:1439)
               at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1157)
               at org.jboss.deployers.plugins.deployers.DeployersImpl.doInstallParentFirst(DeployersImpl.java:1178)
               at org.jboss.deployers.plugins.deployers.DeployersImpl.install(DeployersImpl.java:1098)
               at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
               at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1631)
               at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
               at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1082)
               at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
               at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
               at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
               at org.jboss.deployers.plugins.deployers.DeployersImpl.process(DeployersImpl.java:781)
               at org.jboss.deployers.plugins.main.MainDeployerImpl.process(MainDeployerImpl.java:702)
               at org.jboss.system.server.profileservice.repository.MainDeployerAdapter.process(MainDeployerAdapter.java:117)
               at org.jboss.system.server.profileservice.repository.ProfileDeployAction.install(ProfileDeployAction.java:70)
               at org.jboss.system.server.profileservice.repository.AbstractProfileAction.install(AbstractProfileAction.java:53)
               at org.jboss.system.server.profileservice.repository.AbstractProfileService.install(AbstractProfileService.java:361)
               at org.jboss.dependency.plugins.AbstractControllerContext.install(AbstractControllerContext.java:348)
               at org.jboss.dependency.plugins.AbstractController.install(AbstractController.java:1631)
               at org.jboss.dependency.plugins.AbstractController.incrementState(AbstractController.java:934)
               at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:1082)
               at org.jboss.dependency.plugins.AbstractController.resolveContexts(AbstractController.java:984)
               at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:822)
               at org.jboss.dependency.plugins.AbstractController.change(AbstractController.java:553)
               at org.jboss.system.server.profileservice.repository.AbstractProfileService.activateProfile(AbstractProfileService.java:306)
               at org.jboss.system.server.profileservice.ProfileServiceBootstrap.start(ProfileServiceBootstrap.java:271)
               at org.jboss.bootstrap.AbstractServerImpl.start(AbstractServerImpl.java:461)
               at org.jboss.Main.boot(Main.java:221)
               at org.jboss.Main$1.run(Main.java:556)
               at java.lang.Thread.run(Unknown Source)
              Caused by: java.lang.NoClassDefFoundError: org/jbpm/graph/exe/ProcessInstance
               at java.lang.Class.getDeclaredMethods0(Native Method)
               at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
               at java.lang.Class.getDeclaredMethods(Unknown Source)
               at org.jboss.seam.Component.initMembers(Component.java:550)
               at org.jboss.seam.Component.<init>(Component.java:244)
               at org.jboss.seam.Component.<init>(Component.java:205)
               at org.jboss.seam.init.Initialization.addComponent(Initialization.java:1186)
               ... 72 more
              Caused by: java.lang.ClassNotFoundException: org.jbpm.graph.exe.ProcessInstance from BaseClassLoader@1cc042f...
               at org.jboss.classloader.spi.base.BaseClassLoader.loadClass(BaseClassLoader.java:448)
               at java.lang.ClassLoader.loadClass(Unknown Source)
               at java.lang.ClassLoader.loadClassInternal(Unknown Source)
               ... 79 more


              • 4. Re: JBPM4.1, JBoss 4.23 and Seam 2.2.0
                kukeltje

                 

                It seems that Seam is not ready to work with jBPM 4.1, but I really hope I'm missing few steps.


                Correct, see jira...

                • 5. Re: JBPM4.1, JBoss 4.23 and Seam 2.2.0
                  kukeltje

                  correct is not about you missing steps....

                  • 6. Re: JBPM4.1, JBoss 4.23 and Seam 2.2.0
                    jjp

                    Hi drivexcite,

                    Seam 2.2 does not support pageflow with jBPM 4.1, but they are working together.
                    You can use jBPM 3 and 4 in parallel.

                    Your exception is because you replaced the jbpm-jpdl.jar, so Seam can not find jBPM3.
                    So leave this jar file, or disable jBPM for Seam in components.xml by removing

                    <bpm:jbpm />


                    I disabled jBPM3 in my application and the server is starting up,
                    I can use jBPM.

                    My problem is, that jBPM and Seam are using two different Hibernate sessions,
                    so I can not store my entities as jBPM variables (jBPM does not recognize my class as entity, so it serialises it as a blob).

                    I the first post I described my attempt to solve this. It's working,
                    but some transaction does not commit ... I think I have to take
                    the warning "Can not join ..." seriously.

                    In my further investigation I figured out, that jBPM is using
                    JTA Transactions and my Application uses CMT Transactions.
                    My knowledge about this is not that good.
                    I will have to do more analyses.

                    Best regards,
                    Joerg




                    • 7. Re: JBPM4.1, JBoss 4.23 and Seam 2.2.0
                      jjp

                      Hi,

                      I found a workaround for my Problem:

                      I configured JBPM as seen in the examples (having two hibernate session factories). In the jbpm.hibernate.cfg.xml I mapped my Entities as

                      <mapping class="classname" />


                      and in the persistence.xml I mapped the JBPM Entities:

                      <mapping-file>jbpm.repository.hbm.xml</mapping-file>
                       <mapping-file>jbpm.execution.hbm.xml</mapping-file>
                       <mapping-file>jbpm.history.hbm.xml</mapping-file>
                       <mapping-file>jbpm.task.hbm.xml</mapping-file>
                       <mapping-file>jbpm.identity.hbm.xml</mapping-file>
                      


                      Both Session factories know about both entities. I don't know about the side effects but it seems to work.

                      I found this JIRA https://jira.jboss.org/jira/browse/JBPM-2038, maybe my problem is solved in 4.3 ?

                      Best regards,
                      Joerg

                      • 8. Re: JBPM4.1, JBoss 4.23 and Seam 2.2.0
                        ashutoshd

                        did jbpm 4.3 and seam 2.2.0 really worked

                        if yes

                        can you please give me the changes done in setup

                        • 9. Re: JBPM4.1, JBoss 4.23 and Seam 2.2.0
                          andrescarlospa

                          Hi all.

                          I'm trying to configure this environment, I'm using jbpm4.4, seam 2.2, I followed this instructions: http://www.lunatech-research.com/archives/2010/03/09/jbpm4-and-seam-working-together

                           

                          but there is something missed. I'm getting this exception:

                           

                          java.lang.NullPointerException
                          13:18:20,818 ERROR [STDERR]     at org.jbpm.pvm.internal.processengine.ProcessEngineImpl.checkDb(ProcessEngineImpl.java:152)
                          13:18:20,818 ERROR [STDERR]     at org.jbpm.pvm.internal.processengine.ProcessEngineImpl.<init>(ProcessEngineImpl.java:105)
                          13:18:20,818 ERROR [STDERR]     at org.jbpm.pvm.internal.cfg.ConfigurationImpl.instantiateProcessEngine(ConfigurationImpl.java:100)
                          13:18:20,818 ERROR [STDERR]     at org.jbpm.pvm.internal.cfg.ConfigurationImpl.buildProcessEngine(ConfigurationImpl.java:92)

                          13:18:20,818 ERROR [STDERR]     at org.jbpm.api.Configuration.getProcessEngine(Configuration.java:126)
                          13:18:20,818 ERROR [STDERR]     at xx.xx.xx.jbpm.Jbpm.init(Jbpm.java:37)

                           

                          It is related with jbpm.cfg.xml file:

                          <jbpm-configuration>

                           

                            <jbpm-context>
                              <service name="persistence">
                                 <factory>
                                    <bean class="org.jbpm.persistence.db.DbPersistenceServiceFactory">
                                       <field name="isTransactionEnabled"><false/></field>
                                    </bean>
                                 </factory>
                              </service>
                              <service name="tx" factory="org.jbpm.tx.TxServiceFactory" />
                              <service name="message" factory="org.jbpm.msg.db.DbMessageServiceFactory" />
                              <service name="scheduler" factory="org.jbpm.scheduler.db.DbSchedulerServiceFactory" />
                              <service name="logging" factory="org.jbpm.logging.db.DbLoggingServiceFactory" />
                              <service name="authentication" factory="org.jbpm.security.authentication.DefaultAuthenticationServiceFactory" />
                            </jbpm-context>

                           

                          </jbpm-configuration>

                           

                          What is wrong???

                           

                          Thanks in advance!!!