1 2 Previous Next 18 Replies Latest reply on Apr 11, 2007 3:03 PM by asavitsky Go to original post
      • 15. Re: Tomcat deployment with external datasource - is it possi

        Umm... I'd rather post it here, you can copy it later to Wiki if you know how to do it ... as I don't :(

        Note: each of the JTA implementations used has its own problems: JOTM doesn't automatically shutdown with Tomcat; Atomikos has its own log framework that is a pain to configure (they promised to migrate to log4j/CL though); and JBoss Tx doesn't seem to have a way to configure XA-aware datasources (I've asked for help on their forum, waiting for answers). Nevertheless, all of them allow to start up Seam without the Microcontainer (that's 3.5Mb of JARs and a bunch of nasty restrictions, mind you...). All that is needed is the Tomcat's standard META-INF/context.xml file (or use server.xml if you prefer), some declarations in META-INF/persistence.xml file, plus some glue code and some property files.

        JOTM setup (http://jotm.objectweb.org/):

        context.xml:

        <?xml version="1.0" encoding="UTF-8"?>
        <Context>
         <Resource name="DataSource" auth="Container" type="javax.sql.DataSource"
         maxActive="100" maxIdle="30" maxWait="10000" username="user"
         password="password" driverClassName="oracle.jdbc.driver.OracleDriver"
         url="url"
         factory="org.objectweb.jndi.DataSourceFactory" />
         <Transaction name="UserTransaction" auth="Container"
         type="javax.transaction.UserTransaction"
         factory="org.objectweb.jotm.UserTransactionFactory" jotm.timeout="60000" />
        </Context>


        persistence.xml:
        <?xml version="1.0" encoding="UTF-8"?>
        <persistence xmlns="http://java.sun.com/xml/ns/persistence"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
         version="1.0">
         <persistence-unit name="unitName" transaction-type="JTA">
         <jta-data-source>java:comp/env/DataSource</jta-data-source>
         <properties>
         <property name="hibernate.transaction.manager_lookup_class"
         value="org.hibernate.transaction.JOTMTransactionManagerLookup" />
         </properties>
         </persistence-unit>
        </persistence>


        jndi.properties (place in classpath):
        java.naming.factory.initial=com.sun.jndi.rmi.registry.RegistryContextFactory
        java.naming.provider.url=rmi://localhost:1099


        carol.properties (place in classpath):
        carol.protocols=jrmp
        carol.start.jndi=false
        carol.start.ns=false
        carol.start.rmi=false
        carol.jndi.java.naming.factory.url.pkgs=org.apache.naming


        JOTM is the only one that doesn't need any glue code, as all the necessary factories (Hibernate TM lookup, UT factory, and XA DataSource factory) are already in place.

        Atomikos setup (http://www.atomikos.com/):

        context.xml:
        <?xml version="1.0" encoding="UTF-8"?>
        <Context>
         <Resource auth="Container" name="DataSource"
         type="com.atomikos.jdbc.nonxa.NonXADataSourceBean" connectionTimeout="20"
         factory="org.apache.naming.factory.BeanFactory" poolSize="1"
         user="user" password="password"
         driverClassName="oracle.jdbc.driver.OracleDriver"
         url="url" />
         <Transaction name="UserTransaction" auth="Container"
         type="javax.transaction.UserTransaction" factory="test.util.AtomikosUTLookup" />
        </Context>


        persistence.xml:
        <?xml version="1.0" encoding="UTF-8"?>
        <persistence xmlns="http://java.sun.com/xml/ns/persistence"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
         version="1.0">
         <persistence-unit name="unitName" transaction-type="JTA">
         <jta-data-source>java:comp/env/DataSource</jta-data-source>
         <properties>
         <property name="hibernate.transaction.manager_lookup_class"
         value="com.atomikos.icatch.jta.hibernate3.TransactionManagerLookup" />
         </properties>
         </persistence-unit>
        </persistence>


        jta.properties (place in classpath):
        com.atomikos.icatch.service=com.atomikos.icatch.standalone.UserTransactionServiceFactory


        Atomikos needs one piece of "glue" code, and that is to look up the UserTransaction properly. The developers promised to create the lookup class in later versions, but for now, use this:

        public class AtomikosUTLookup implements ObjectFactory {
         public AtomikosUTLookup() {
         }
         public Object getObjectInstance(Object obj, Name name, Context nameCtx,
         Hashtable environment) throws Exception {
         return new UserTransactionImp();
         }
        }


        JBoss Transactions (formerly Arjuna JTA) setup (http://labs.jboss.com/portal/jbosstm/):

        context.xml:
        <?xml version="1.0" encoding="UTF-8"?>
        <Context>
         <Resource name="DataSource" auth="Container" type="javax.sql.DataSource"
         maxActive="100" maxIdle="30" maxWait="10000" username="user"
         password="password" driverClassName="oracle.jdbc.driver.OracleDriver"
         url="url" />
         <Transaction name="UserTransaction" auth="Container"
         type="javax.transaction.UserTransaction" factory="test.util.JBossJTAUTLookup" />
        </Context>


        persistence.xml:
        <?xml version="1.0" encoding="UTF-8"?>
        <persistence xmlns="http://java.sun.com/xml/ns/persistence"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
         version="1.0">
         <persistence-unit name="unitName" transaction-type="JTA">
         <jta-data-source>java:comp/env/DataSource</jta-data-source>
         <properties>
         <property name="hibernate.transaction.manager_lookup_class"
         value="test.util.JBossJTATMLookup" />
         </properties>
         </persistence-unit>
        </persistence>


        JBoss Tx requires both TM lookup code and UT lookup, and here they are:

        JBossJTATMLookup.java:
        public class JBossJTATMLookup implements TransactionManagerLookup {
         public TransactionManager getTransactionManager(Properties props)
         throws HibernateException {
         return com.arjuna.ats.jta.TransactionManager.transactionManager();
         }
         public String getUserTransactionName() {
         return "java:comp/UserTransaction";
         }
        }


        JBossJTAUTLookup.java:
        public class JBossJTAUTLookup implements ObjectFactory {
         public Object getObjectInstance(Object obj, Name name, Context nameCtx,
         Hashtable<?, ?> environment) throws Exception {
         return UserTransaction.userTransaction();
         }
        }


        I still haven't figured it out with the DataSource configuration for JBoss Tx - for now, I use the regular declaration without a factory (and it works) but maybe I simply haven't run into any problems yet...

        Oh yes, and the components.xml for all three looks like:

        <core:init debug="true" />
         <core:manager conversation-timeout="120000" concurrent-request-timeout="500"
         conversation-id-parameter="cid" conversation-is-long-running-parameter="clr" />
         <core:entity-manager-factory name="unitName" />
         <core:managed-persistence-context name="entityManager" auto-create="true"
         entity-manager-factory="#{unitName}" />


        Note the lack of core:microcontainer declaration. jboss-beans.xml and jndi.properties from the usual Seam-MC deploayment are not needed, either.

        • 16. Re: Tomcat deployment with external datasource - is it possi
          youngm

          Thanks. I don't know how to put it in the WIKI either but if 1144 get's rejected then I'll figure out how.

          Mike

          • 17. Re: Tomcat deployment with external datasource - is it possi
            youngm

            Quick question. What are you doing for transactions in integration tests in Seam without the microcontainer? If you're doing integration tests.

            Mike

            • 18. Re: Tomcat deployment with external datasource - is it possi

              I haven't got that far yet :( I guess the JTA will need to be hooked-up manually...

              Alex

              1 2 Previous Next