1 2 Previous Next 17 Replies Latest reply: Apr 20, 2012 5:35 AM by gigazhang Go to original post RSS
  • 15. Re: Drools, Spring integration and JTA in container
    rodri tes23 Newbie

    Hi Alex Manly:

     

    Could you please share any sample working example with the final configuration files?

    Also when you say 'overriding the SingleSessionCommandService', is it better to modify 'org.drools.persistence.session.SingleSessionCommandService' class and repackage the drools-persistence-jpa.jar file instead.

  • 16. Re: Drools, Spring integration and JTA in container
    Alex Manly Newbie

    Hi Rodri,

     

    Here is my drools spring configuration file:

     

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
        xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
        xmlns:aop="http://www.springframework.org/schema/aop" xmlns:jee="http://www.springframework.org/schema/jee"
        xmlns:util="http://www.springframework.org/schema/util" xmlns:drools="http://drools.org/schema/drools-spring" 
        xmlns:camel="http://camel.apache.org/schema/spring"
        xsi:schemaLocation="
           http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/tx
           http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
           http://www.springframework.org/schema/aop
           http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.0.xsd
           http://www.springframework.org/schema/jee 
           http://www.springframework.org/schema/jee/spring-jee-3.0.xsd
           http://www.springframework.org/schema/util
           http://www.springframework.org/schema/util/spring-util-3.0.xsd
           http://drools.org/schema/drools-spring 
           http://anonsvn.jboss.org/repos/labs/labs/jbossrules/trunk/drools-container/drools-spring/src/main/resources/org/drools/container/spring/drools-spring.xsd
           http://camel.apache.org/schema/spring
           http://camel.apache.org/schema/spring/camel-spring.xsd">
    
        <context:annotation-config />
        <context:property-placeholder location="classpath:/app_default.properties"/>
    
        <jee:jndi-lookup id="dataSource" jndi-name="jdbc/appDS_V1" />
        <jee:jndi-lookup id="entityManagerFactory" jndi-name="persistence/app-domain-pu" />
        <tx:jta-transaction-manager />
        <tx:annotation-driven transaction-manager="transactionManager"/>
    
        <context:component-scan base-package="com.company.app" />
    
        <drools:kbase id="kbase1">
            <drools:resources>
                <drools:resource id="cloneFlow" type="DRF" source="classpath:Clone.rf"/>
                <drools:resource id="approvalFlow" type="DRF" source="classpath:Approval.rf"/>
              </drools:resources>
    
            <drools:configuration>
                <drools:mbeans enabled="true" />
                <drools:event-processing-mode mode="STREAM" />
            </drools:configuration>
        </drools:kbase>
    
        <drools:ksession id="jpaSingleSessionCommandService" type="stateful" kbase="kbase1" name="stateful-session">
            <drools:configuration>            
                <drools:jpa-persistence>
                    <drools:transaction-manager ref="transactionManager" />
                    <drools:entity-manager-factory ref="entityManagerFactory" />
                    <drools:variable-persisters>
                        <drools:persister for-class="javax.persistence.Entity" implementation="org.drools.persistence.processinstance.persisters.JPAVariablePersister"/>
                        <drools:persister for-class="java.io.Serializable" implementation="org.drools.persistence.processinstance.persisters.SerializableVariablePersister"/>
                    </drools:variable-persisters>
                </drools:jpa-persistence>
                <drools:work-item-handlers>
                    <drools:work-item-handler name="Human Task" ref="humanTaskHandler"/>
                </drools:work-item-handlers>
                <drools:keep-reference enabled="true" />
                <drools:clock-type type="REALTIME" />
            </drools:configuration>
            <drools:script>
                <drools:fire-all-rules/>
            </drools:script>
        </drools:ksession>
    
    </beans>
    

     

     

    I am using drools version 5.1.1, here is my maven config:

     

     <dependency>
                <groupId>org.drools</groupId>
                <artifactId>drools-core</artifactId>
                <version>5.1.1</version>
                <scope>compile</scope>
            </dependency>
            <dependency>
                <groupId>org.drools</groupId>
                <artifactId>drools-api</artifactId>
                <version>5.1.1</version>
                <scope>compile</scope>
            </dependency>
            <dependency>
                <groupId>org.drools</groupId>
                <artifactId>drools-compiler</artifactId>
                <version>5.1.1</version>
                <scope>compile</scope>
            </dependency>
            <dependency>
                <groupId>org.drools</groupId>
                <artifactId>drools-persistence-jpa</artifactId>
                <version>5.1.1</version>
                <scope>compile</scope>
             </dependency>
            <dependency>
                <groupId>org.drools</groupId>
                <artifactId>drools-spring</artifactId>
                <version>5.1.1</version>
                <scope>compile</scope>
            </dependency>
            <dependency>
                <groupId>com.thoughtworks.xstream</groupId>
                <artifactId>xstream</artifactId>
                <version>1.3.1</version>
                <scope>compile</scope>
            </dependency>
    

     

     

    In my web application I copied the java file: org.drools.persistence.session.SingleSessionCommandService from the drools SVN site and then overriden and modified the method initTransactionManager (as long as this is higher up in the classpath the it will execute):

     

    public void initTransactionManager(Environment env) {
            Object tm = env.get( EnvironmentName.TRANSACTION_MANAGER );
            //    START CODE OVERRIDE - so drools works with org.springframework.transaction.jta.JtaTransactionManager
            if ( tm != null &amp;&amp; tm.getClass().getName().equals( "org.springframework.transaction.jta.JtaTransactionManager" ) ) {
                logger.debug( "Instantiating Spring JtaTransactionManager" );
                this.txm = new JtaTransactionManager(((org.springframework.transaction.jta.JtaTransactionManager)tm).getUserTransaction(),
                                                      env.get( EnvironmentName.TRANSACTION_SYNCHRONIZATION_REGISTRY ),
                                                      ((org.springframework.transaction.jta.JtaTransactionManager)tm).getTransactionManager() ); 
                this.jpm = new DefaultJpaManager(this.env);
            } else {
            //    END CODE OVERRIDE - so drools works with org.springframework.transaction.jta.JtaTransactionManager
                if ( tm != null &amp;&amp; tm.getClass().getName().startsWith( "org.springframework" ) ) {
                    try {
                        Class<?> cls = Class.forName( "org.drools.container.spring.beans.persistence.DroolsSpringTransactionManager" );
                        Constructor<?> con = cls.getConstructors()[0];
                        this.txm = (TransactionManager) con.newInstance( tm );
                        logger.debug( "Instantiating  DroolsSpringTransactionManager" );
    
                        if ( tm.getClass().getName().toLowerCase().contains( "jpa" ) ) {
                            // configure spring for JPA and local transactions
                            cls = Class.forName( "org.drools.container.spring.beans.persistence.DroolsSpringJpaManager" );
                            con = cls.getConstructors()[0];
                            this.jpm =  ( JpaManager) con.newInstance( new Object[] { this.env } );
                        } else {
                            // configure spring for JPA and distributed transactions 
                        }
                    } catch ( Exception e ) {
                        logger.warn( "Could not instatiate DroolsSpringTransactionManager" );
                        throw new RuntimeException( "Could not instatiate org.drools.container.spring.beans.persistence.DroolsSpringTransactionManager", e );
                    }
                } else {
                    logger.debug( "Instantiating  JtaTransactionManager" );
                    this.txm = new JtaTransactionManager( env.get( EnvironmentName.TRANSACTION ),
                                                          env.get( EnvironmentName.TRANSACTION_SYNCHRONIZATION_REGISTRY ),
                                                          tm ); 
                    this.jpm = new DefaultJpaManager(this.env);
                }
            //    START CODE OVERRIDE
            }
            //    END CODE OVERRIDE
    

     

     

    Hope this helps

  • 17. Re: Drools, Spring integration and JTA in container
    gigazhang Newbie

    well ,3ks this topic

1 2 Previous Next