Hello all,

I'm having trouble configuring external transaction manager and externally
managed data source;
looking in sources and tests, including Axis and ServiceMix integration API
implementations
I could not find the answer.

Thanks in advance


Scenario:

Trying to configure ODE to work with external transaction manager and
externally managed DataSource.

As transaction manager I am using Bitronix, and as XA capable database
MySql.

It should not be issue with Bitronix since XA tests with 2 MySql instances
and ActiveMq broker are working as expected (These tests didnt include ODE).

Implementation of Integration API is based on those found in bpel-test
module
of source ODE distribution:

org.apache.ode.test.MessageExchangeContextImpl
org.apache.ode.test.BindingContextImpl
org.apache.ode.test.PartnerRoleChannelImpl

Source code of above classes has not been modified, and "bpel/2.0/TestIf" is
the
bpel/wsdl definition used for testing.


The configuration of BPEL server at startup time is as follows:

Note: dataSource variable is instance of javax.sql.DataSource, and txManager
is instance
      of javax.transaction.TransactionManager.

------------------------------------------------------------------------------------------------
        MessageExchangeContextImpl ctx = new MessageExchangeContextImpl();
        this.server = new BpelServerImpl();
        this.scheduler = new MockScheduler(this.txManager);

        Properties jpaProps = new Properties();
        jpaProps.put("openjpa.jdbc.DBDictionary", "
org.apache.openjpa.jdbc.sql.MySQLDictionary");
        jpaProps.put("openjpa.Log", "DefaultLevel=TRACE");
        BPELDAOConnectionFactoryImpl factory = new
BPELDAOConnectionFactoryImpl();
        factory.setTransactionManager(this.txManager);
        factory.setDataSource(this.dataSource);
        factory.init(jpaProps);

        this.server.setDaoConnectionFactory(factory);

        this.server.setScheduler(scheduler);
        this.server.setBindingContext(new BindingContextImpl());
        this.server.setMessageExchangeContext(ctx);
        scheduler.setJobProcessor(this.server);


        // this line prints true
        System.out.println(this.dataSource instanceof DataSource);

        this.processStore = new ProcessStoreImpl(this.dataSource, "jpa",
true);
        this.processStore.registerListener(new ProcessStoreListener() {
            public void onProcessStoreEvent(ProcessStoreEvent event) {
                BpelManager.this.server.unregister(event.pid);
                if (event.type != ProcessStoreEvent.Type.UNDEPLOYED) {
                    ProcessConfImpl conf = (ProcessConfImpl)
BpelManager.this.processStore
                            .getProcessConfiguration(event.pid);
                    conf.setTransient(true);
                    BpelManager.this.server.register(conf);
                }
            }
        });
        Properties props = new Properties();
        props.setProperty("debugeventlistener.dumpToStdOut", "no");
        this.server.setConfigProperties(props);
        this.server.registerBpelEventListener(new DebugBpelEventListener());
        this.server.init();
        this.server.start();

        Collection<QName> deployed = this.processStore.deploy(new
File("data/bpel/2.0/TestIf"));
        for (QName name : deployed) {
            ProcessConfImpl conf = (ProcessConfImpl) this.processStore
                    .getProcessConfiguration(name);
            conf.setTransient(true);
            this.server.register(conf);
        }
-------------------------------------------------------------------------------------------------



In main method following is performed:

-------------------------------------------------------------------------------------------------
        transactionManager.begin();

        Statement stmt = dataSource.getConnection().createStatement();
        stmt.executeUpdate("insert into mytable values('somevalue" +
System.currentTimeMillis() + "')");

        MyRoleMessageExchange exchange =
manager.getServer().getEngine().createMessageExchange(""

            + System.currentTimeMillis(), new QName("
http://ode/bpel/unit-test.wsdl";, "HelloService"), "hello");

        Message message = exchange.createMessage(new QName("
http://ode/bpel/unit-test.wsdl";, "HelloMessage"));
        message.setMessage(DOMUtils.stringToDOM("<message><TestPart>2.0
</TestPart></message>"));
        Future<MessageExchange.Status> running = exchange.invoke(message);

        transactionManager.commit();
-------------------------------------------------------------------------------------------------


Obviously one needs to have reference to ProcessStore in order to deploy
processes, and above way is only one
I have managed to figure out.

When I run this example I get following stack trace:


-------------------------------------------------------------------------------------------------
Bitronix has been initialized...
2008-02-05 12:01:50,953 INFO [org.hibernate.cfg.annotations.Version] -
Hibernate Annotations 3.3.0.GA
2008-02-05 12:01:51,000 INFO [org.hibernate.cfg.Environment] - Hibernate
3.2.5
2008-02-05 12:01:51,000 INFO [org.hibernate.cfg.Environment] -
hibernate.properties not found
2008-02-05 12:01:51,000 INFO [org.hibernate.cfg.Environment] - Bytecode
provider name : cglib
2008-02-05 12:01:51,015 INFO [org.hibernate.cfg.Environment] - using JDK 1.4
java.sql.Timestamp handling
2008-02-05 12:01:51,078 INFO [org.hibernate.ejb.Version] - Hibernate
EntityManager 3.3.1.GA
2008-02-05 12:01:51,093 DEBUG [org.hibernate.ejb.Ejb3Configuration] - Look
up for persistence unit: ode-dao
0  ode-dao  TRACE  [main] openjpa.Runtime - Setting the following properties
from "jar:file:/C:/DEVELOPMENT/workspaces/ODE/bpel-xa/lib/ode-
dao-jpa-1.1.1.jar!/META-INF/persistence.xml" into configuration: {
openjpa.FlushBeforeQueries=false,
openjpa.jdbc.DBDictionary=org.apache.openjpa.jdbc.sql.MySQLDictionary,
openjpa.BrokerFactory=jdbc, openjpa.ConnectionFactory=a PoolingDataSource
containing an XAPool of resource mysql-1 with 1 connection(s) (1 still
available), openjpa.Log=DefaultLevel=TRACE, openjpa.MetaDataFactory=jpa
(Types=org.apache.ode.dao.jpa.ActivityRecoveryDAOImpl;org.apache.ode.dao.jpa.CorrelationSetDAOImpl;org.apache.ode.dao.jpa.CorrelatorDAOImpl;org.apache.ode.dao.jpa.EventDAOImpl;org.apache.ode.dao.jpa.FaultDAOImpl;org.apache.ode.dao.jpa.MessageDAOImpl;org.apache.ode.dao.jpa.MessageExchangeDAOImpl;org.apache.ode.dao.jpa.MessageRouteDAOImpl;org.apache.ode.dao.jpa.PartnerLinkDAOImpl;org.apache.ode.dao.jpa.ProcessDAOImpl;org.apache.ode.dao.jpa.ProcessInstanceDAOImpl;org.apache.ode.dao.jpa.ScopeDAOImpl;org.apache.ode.dao.jpa.XmlDataDAOImpl;org.apache.ode.dao.jpa.CorrSetProperty;org.apache.ode.dao.jpa.MexProperty;org.apache.ode.dao.jpa.XmlDataProperty),
[EMAIL PROTECTED],
javax.persistence.provider=org.apache.openjpa.persistence.PersistenceProviderImpl,
openjpa.ConnectionFactoryMode=managed, openjpa.Id=ode-dao}
Must be true: true
2008-02-05 12:01:51,750 DEBUG [org.hibernate.ejb.Ejb3Configuration] - Look
up for persistence unit: ode-store
javax.persistence.PersistenceException: Provider error. Provider:
org.hibernate.ejb.HibernatePersistence
    at javax.persistence.Persistence.createFactory(Persistence.java:175)
    at javax.persistence.Persistence.createEntityManagerFactory(
Persistence.java:111)
    at org.apache.ode.store.jpa.DbConfStoreConnectionFactory.<init>(
DbConfStoreConnectionFactory.java:45)
    at org.apache.ode.store.ProcessStoreImpl.<init>(ProcessStoreImpl.java
:122)
    at com.mytest.xa.BpelManager.init(BpelManager.java:73)
    at com.mytest.xa.Main.main(Main.java:35)
Caused by: javax.persistence.PersistenceException:
java.lang.ClassCastException: bitronix.tm.resource.jdbc.PoolingDataSource
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java
:258)
    at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(
HibernatePersistence.java:120)
    at javax.persistence.Persistence.createFactory(Persistence.java:171)
    ... 5 more
Caused by: java.lang.ClassCastException:
bitronix.tm.resource.jdbc.PoolingDataSource
    at org.hibernate.ejb.packaging.PersistenceXmlLoader.deploy(
PersistenceXmlLoader.java:113)
    at org.hibernate.ejb.Ejb3Configuration.configure(Ejb3Configuration.java
:215)
    ... 7 more
Feb 5, 2008 12:01:51 PM bitronix.tm.BitronixTransactionManager shutdown
INFO: shutting down Bitronix Transaction Manager
-------------------------------------------------------------------------------------------------


What is confusing me is
org.apache.ode.store.jpa.DbConfStoreConnectionFactory class which in
constructors
calls "propMap.put("javax.persistence.nonJtaDataSource", ds);" marking
DataSource as non-managed, though
I want it to be externally managed.

I have double checked if Bitronix correctly implements javax.sql.DataSource,
and its ok. Outside of ODE
XA transaction are working correctly.

Any tips appreciated.

Thanks.

Reply via email to